Spring boot預設使用的是SimpleCacheConfiguration,即使用ConcurrentMapCacheManager來實現緩衝。但是要切換到其他緩衝實現也很簡單 pom檔案
在pom中引入相應的jar包
<dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-jpa</artifactId></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId></dependency><dependency><groupId>org.apache.commons</groupId><artifactId>commons-dbcp2</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-cache</artifactId></dependency><dependency><groupId>net.sf.ehcache</groupId><artifactId>ehcache</artifactId></dependency></dependencies>
設定檔
EhCache所需要的設定檔,只需要放到類路徑下,Spring Boot會自動掃描。
<?xml version="1.0" encoding="UTF-8"?><ehcache> <cache name="people" maxElementsInMemory="1000"/></ehcache>
也可以通過在application.properties檔案中,通過配置來指定EhCache設定檔的位置,如:
spring.cache.ehcache.config= # ehcache設定檔地址
Spring Boot會自動為我們配置EhCacheCacheMannager的Bean。 關鍵Service
package com.xiaolyuh.service.impl;import com.xiaolyuh.entity.Person;import com.xiaolyuh.repository.PersonRepository;import com.xiaolyuh.service.PersonService;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.cache.annotation.CacheEvict;import org.springframework.cache.annotation.CachePut;import org.springframework.cache.annotation.Cacheable;import org.springframework.stereotype.Service;@Servicepublic class PersonServiceImpl implements PersonService { @Autowired PersonRepository personRepository; @Override @CachePut(value = "people", key = "#person.id") public Person save(Person person) { Person p = personRepository.save(person); System.out.println("為id、key為:" + p.getId() + "資料做了緩衝"); return p; } @Override @CacheEvict(value = "people")//2 public void remove(Long id) { System.out.println("刪除了id、key為" + id + "的資料緩衝"); //這裡不做實際刪除操作 } @Override @Cacheable(value = "people", key = "#person.id")//3 public Person findOne(Person person) { Person p = personRepository.findOne(person.getId()); System.out.println("為id、key為:" + p.getId() + "資料做了緩衝"); return p; }} Controller
package com.xiaolyuh.controller;import com.xiaolyuh.entity.Person;import com.xiaolyuh.service.PersonService;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.cache.CacheManager;import org.springframework.web.bind.annotation.RequestBody;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RestController;@RestControllerpublic class CacheController { @Autowired PersonService personService; @Autowired CacheManager cacheManager; @RequestMapping("/put") public long put(@RequestBody Person person) { Person p = personService.save(person); return p.getId(); } @RequestMapping("/able") public Person cacheable(Person person) { System.out.println(cacheManager.toString()); return personService.findOne(person); } @RequestMapping("/evit") public String evit(Long id) { personService.remove(id); return "ok"; }} 啟動類
@SpringBootApplication@EnableCaching// 開啟緩衝,需要顯示的指定public class SpringBootStudentCacheApplication {public static void main(String[] args) {SpringApplication.run(SpringBootStudentCacheApplication.class, args);}} 測試類別
package com.xiaolyuh;import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post;import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content;import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;import java.util.HashMap;import java.util.Map;import org.junit.Before;import org.junit.Test;import org.junit.runner.RunWith;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.boot.test.context.SpringBootTest;import org.springframework.http.MediaType;import org.springframework.test.context.junit4.SpringRunner;import org.springframework.test.web.servlet.MockMvc;import org.springframework.test.web.servlet.MvcResult;import org.springframework.test.web.servlet.setup.MockMvcBuilders;import org.springframework.web.context.WebApplicationContext;import net.minidev.json.JSONObject;@RunWith(SpringRunner.class)@SpringBootTestpublic class SpringBootStudentCacheApplicationTests { @Test public void contextLoads() { } private MockMvc mockMvc; // 類比MVC對象,通過MockMvcBuilders.webAppContextSetup(this.wac).build()初始化。 @Autowired private WebApplicationContext wac; // 注入WebApplicationContext // @Autowired // private MockHttpSession session;// 注入類比的http session // // @Autowired // private MockHttpServletRequest request;// 注入類比的http request\ @Before // 在測試開始前初始化工作 public void setup() { this.mockMvc = MockMvcBuilders.webAppContextSetup(this.wac).build(); } @Test public void testAble() throws Exception { for (int i = 0; i < 2; i++) { MvcResult result = mockMvc.perform(post("/able").param("id", "2")) .andExpect(status().isOk())// 類比向testRest發送get請求 .andExpect(content().contentType(MediaType.APPLICATION_JSON_UTF8))// 預期傳回值的媒體類型text/plain; // charset=UTF-8 .andReturn();// 返回執行請求的結果 System.out.println(result.getResponse().getContentAsString()); } }} 列印日誌
從上面可以看出第一次走的是資料庫,第二次走的是緩衝
源碼: https://github.com/wyh-spring-ecosystem-student/spring-boot-student/tree/releases
spring-boot-student-cache-ehcache 工程