SpringBoot提供了对缓存的支持,通过在启动类中添加@EnableCaching注解自动化配置合适的缓存管理器(CacheManager),Spring Boot根据下面的顺序去侦测缓存提供者:
SpringBoot的缓存机制:
SpringBoot缓存是依赖于由org.springframework.cache.Cache和org.springframework.cache.CacheManager接口实现的抽象高速缓存,不提供实际的存储,SpringBoot会根据实现自动配置合适的CacheManager,只要缓存支持通过@EnableCaching注释启用即可。基于Ehcache API实现的缓存操作工具类
SpringBoot 配置 EhCache 2.x
一、在pom文件中引入Ehcache依赖
二、在resources根目录下引入配置文件 ehcache.xml,增加需要的缓存配置
Ehcache.xml 文件配置详解:
三、在SpringBoot启动类中添加开启缓存的注解@EnableCaching
一般情况下,我们在Sercive层对缓存进行操作。 Ehcache 在 Spring 中的注解如下:
参数解释:
具体的Demo示例参看本人的Github:ehcache工具类以及在springboot中使用ehcache
附录:最近在面试中一个面试官问到@Cacheable 的key生成的问题,在这里总结一下:
key属性是用来指定Spring缓存方法的返回结果时对应的key的。该属性支持SpringEL表达式。当我们没有指定该属性时,Spring将使用默认策略生成key。
自定义策略是指我们可以通过Spring的EL表达式来指定我们的key。这里的EL表达式可以使用方法参数及它们对应的属性。使用方法参数时我们可以直接使用“#参数名”或者“#p参数index”。下面是几个使用参数作为key的示例。
1、用“#参数名”或者“#p参数index”
// key 当前类,缓存对象为返回值list
15 @Cacheable(value = {"lt.ecache"}, key = "#root.targetClass")
16 public List getEmployees() {
17 System.out.println("*** getEmployees() 已经调用 ***");
18 List list = new ArrayList(5);
19 list.add(new Employee(1, "Ben", "Architect"));
20 list.add(new Employee(2, "Harley", "Programmer"));
21 list.add(new Employee(3, "Peter", "BusinessAnalyst"));
22 list.add(new Employee(4, "Sasi", "Manager"));
23 list.add(new Employee(5, "Abhi", "Designer"));
24 return list;
25 }
26
27 // key id,缓存数据为返回值Employee对象
28 @Cacheable(value = "lt.ecache", key = "#id")
29 public Employee getEmployee(int id, List employees) {
30 System.out.println("*** getEmployee(): " + id + " ***");
31 Employee emp = null;
32 for (Employee employee : employees) {
33 if (employee.getId() == id) {
34 emp = employee;
35 }
36 }
37 return emp;
38 }
39
40 // @CachePut会去替换缓存中的Employee对象为当前id对应的对象
41 @CachePut(value = "lt.ecache", key = "#id")
42 public Employee updateEmployee(int id, String designation, List employees) {
43 System.out.println("*** updateEmployee() " + id + " ***");
44 Employee emp = null;
45 int i = 0;
46 for (Employee employee : employees) {
47 if (employee.getId() == id) {
48 employee.setDesignation(designation);
49 emp = employee;
50 }
51 }
52 System.out.println(emp);
53 return emp;
54 }
55
56 //key为参数中Employee对象的id,缓存指定id对应的Employee对象
57 @Cacheable(value = "lt.ecache", key = "#employee.id")
58 public Employee addEmployee(Employee employee, List employees) {
59 System.out.println("*** addEmployee() : " + employee.getId() + " ***");
60 employees.add(employee);
61 System.out.println(employee);
62 return employee;
63 }
64
65 //key为参数中的id,移除缓存,移除指定id对应的Employee对象
66 @CacheEvict(value = "lt.ecache", key = "#id")
67 public Employee removeEmployee(int id, List employees) {
68 System.out.println("*** removeEmployee() : " + id + " ***");
69 Employee emp = null;
70 int i = 0;
71 for (Employee employee : employees) {
72 if (employee.getId() == id) {
73 emp = employee;
74 } else {
75 i++;
76 }
77 }
78 employees.remove(i);
79 return emp;
80 }
81
82 //key为当前类,移除缓存,移除employees列表对象
83 @CacheEvict(value = "lt.ecache", key = "#root.targetClass")
84 public List removeAllEmployee(List employees) {
85 System.out.println("*** removeAllEmployee() : ***");
86 employees.clear();
87 System.out.println(employees.size());
88 return employees;
89 }
当我们要使用root对象的属性作为key时我们也可以将“#root”省略,因为Spring默认使用的就是root对象的属性。
2、如果要调用当前类里面的方法(方法必须是public):
@Override
@Cacheable(value={"TeacherAnalysis_public_chart"}, key="#root.target.getDictTableName() + '_' + #root.target.getFieldName()")
public List