@Cacheable(value = "CACHE_BOOK",key = "#username", condition = "#language = 1") public List<Book> getBooksByUsernameAndLanguage(String username, int language) { // balabalabala...里面的代码不重要 return bookList; }
@Cacheable
注解只有三个属性。
- value : 必须要的。就是个自己取的名字,通过它指明了第一次调用这个方法时返回的bookList将被存在内存的哪里。
- key : 可选。要使用SpEL表达式,这里与参数
username
对应,当传入的username值变了的话就不去取缓存里的数据了,而是执行getBooksByUsernameAndLanguage
方法。(这是必须的,因为username变了,返回值也就变了,缓存里的数据不符合了,因此这个选项很重要)。spring默认用方法的签名来当做key。 - condition:方法返回的结果bookList,要不要缓存起来?condition就添加了一个限定条件。这个例子中,只有传入的语言代码是1,返回的bookList才会被缓存起来,如果给language传了别的值,那么bookList是不会缓存起来的。
注意事项:1、@Cacheable必须开启缓存在启动类上@EnableCaching
2、返回的对象要实现缓存该对象是必须实现序列化接口的Serializable
3、@Cacheable不可用在私有方法上面,可以放在接口和具体的方法上面
4、@Cacheable这个注解是放在具体的方法上;
5、@CacheConfig这个注解只能放在类上代表这个类所有缓存的公共属性配置,比如value等非必须;
6、key = "#对象.属性"或者直接使用key = "#属性";直接读取的是方法形参内的参数属性或者对象;
7、key = "#对象.属性.concat('Hydrologydata')"