有了前面springBoot整合redis時分析的,用redis來做spring緩存注解的實作原理後,再整合ehcache來做spring緩存注解的實作就非常簡單了。時光隧道:springBoot2.x整合redis
步驟(基于注解先)
1、導入ehcache的依賴(這裡為什麼不用寫依賴的版本号,大家知道嗎?歡迎評論區留言)
<dependency>
<groupId>net.sf.ehcache</groupId>
<artifactId>ehcache</artifactId>
</dependency>
2、在類路徑下(resources檔案夾下)放一個檔案ehcache.xml
檔案内容就使用helloworld中用的就行。時光隧道:1、ehcache簡介與HelloWorld
當然也可以在springBoot的配置檔案中指定ehcache配置檔案的位置:
spring.cache.ehcache.config=classpath:ehcache_config.xml
3、接下來就是基于注解來使用ehcache了
例如:關于注解的詳細使用請看springBoot2.x整合redis時的介紹
注意,cacheNames屬性是用來指定要使用哪個cache的,是以在ehcache的xml配置檔案中,必須要有某個cache的name屬性值與它一一對應,否則會報Cannot find cache name 'xxx'異常。在redis中不必這麼做,具體可以看spring cache關于注解實作的源碼。
@RestController
public class EmployeeController {
@Autowired
private EmployeeService employeeService;
@Cacheable(cacheNames = "empCache",key = "#id")
@GetMapping("/emp/{id}")
public Employee getEmpById(@PathVariable("id") Integer id){
Employee employee = employeeService.getEmployeeById(id);
return employee;
}
//@CachePut(cacheNames = "employee",key = "#employee.id")
@GetMapping("/addEmp")
public Employee addEmp(Employee employee){
employeeService.addEmployee(employee);
return employee;
}
@CachePut(cacheNames = "employee",key = "#employee.id")
public Employee updateEmployee(Employee employee){
employeeService.updateEmployee(employee);
return employee;
}
//@CacheEvict(cacheNames = "employee",key = "#id")
//@CacheEvict(cacheNames = "employee",allEntries = true)
@GetMapping("/deleteEmp")
public String deleteEmployee(Integer id){
System.out.println("删除id為"+id+"的員工。");
return "删除成功!";
}
}
基于代碼的方式使用ehcache
在整合springBoot後,可以直接在需要使用的地方注入CacheManager,像這樣
注意,這裡的CacheManager 是org.springframework.cache包下的,不是net.sf.ehcache包下的。
@Resource
private CacheManager cacheManager;
然後像之前helloWorld時那樣,使用ehcache提供的API進行操作即可。
但是這樣操作不太友善,不如自己封裝一個工具類比較好:更多功能後續再封裝吧。
//對element進行增删改查的工具類
public class EhcacheUtils {
private static Logger logger = LoggerFactory.getLogger(EhcacheUtils.class);
//使用一個靜态變量儲存cacheManager(create()讀取類路徑下的ehcache.xml檔案建立單例的cacheManager)
private static CacheManager cacheManager = CacheManager.create();
/**
* 從某cache中擷取一個element的value
* @param cacheName cache的名字
* @param key element的key
* @return element的value
*/
public static Object get(String cacheName,String key){
Cache cache = cacheManager.getCache(cacheName);
if (cache != null){
return cache.get(key);
}
return null;
}
/**
* 向某cache中添加一個element(相同key的元素會添加不進去)
* @param cacheName cache的名字
* @param key element的key
* @param value element的value
*/
public static void add(String cacheName,String key,Object value){
Cache cache = cacheManager.getCache(cacheName);
if (cache == null){
//使用defaultCache的配置來建立一個cache
cacheManager.addCache(cacheName);
Cache defaultCache = cacheManager.getCache(cacheName);
defaultCache.put(new Element(key,value));
logger.error("cache[{}]不存在,系統使用預設配置建立cache并添加element完成!",cacheName);
}else {
cache.putIfAbsent(new Element(key,value));
}
}
/**
* 更新element的value,根據cacheName和key唯一确定一個element
* @param cacheName cache的名字
* @param key element的key
* @param value element的value
*/
public static void update(String cacheName,String key,Object value){
Cache cache = cacheManager.getCache(cacheName);
if (cache != null){
cache.put(new Element(key,value));
}else {
logger.error("cache[{}]不存在,更新失敗!",cacheName);
}
}
/**
* 從某cache中删除某個element
* @param cacheName cache的名字
* @param key element的key
*/
public static void remove(String cacheName,String key){
Cache cache = cacheManager.getCache(cacheName);
if (cache != null){
cache.remove(key);
}
}
/**
* 根據cacheName判斷cache是否存在
* @param cacheName cache的名字
* @return true存在,false不存在
*/
private static boolean checkCache(String cacheName){
Cache cache = cacheManager.getCache(cacheName);
return null == cache;
}
ok,ehcache的基本内容到這裡也就這就介紹完了,以上兩篇文章的内容應對日常的ehcache緩存需要已經夠用了。
更深層次的使用了研究請檢視ehcache官網:http://www.ehcache.org/generated/2.10.4/html/ehc-all/
上一篇:1、ehcache簡介與HelloWorld
下一篇:ehcache結合redis實作二級緩存系統