天天看點

2、ehcache與springBoot整合步驟(基于注解先)基于代碼的方式使用ehcache

有了前面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實作二級緩存系統