原创性声明:本文完全为笔者原创,请尊重笔者劳动力。转载务必注明原文地址。
@Cacheable 是一个既可以应用于方法级别,也可用于类级别的注解。自spring3.1开始就通过它实现了缓存管理。
-
@Cacheable
能干什么?
为了通俗易懂的理解,举个栗子:一个方法,getBooksByUsernameAndLanguage(String username, int language)
,显然,是一个获取数据库里所有我的英文书对象的方法,返回应该是一个列表。如果这个函数的返回值很大,而且会在页面上被经常调用,那么每一次调用都要重新连接数据库并返回一个数据量庞大的list,可能页面响应和资源占用会比较大。而我们希望的是,第一次调用这个方法时,返回的数据能被放到服务器端的缓存里,以便于后面要调用这个方法时,能直接从缓存里取到,这样就不用再查数据库占用资源了。而@Cacheable
的作用就是这个。 -
@Cacheable
怎么用?
举个栗子(我就喜欢直接上代码,简单粗暴):
@Cacheable(value = "CACHE_BOOK",key = "#username", condition = "#language = 1")
public List<Book> getBooksByUsernameAndLanguage(String username, int language) {
// balabalabala...里面的代码不重要
return bookList;
}
看code,@Cacheable
注解只有三个属性。
- value : 必须要的。就是个自己取的名字,通过它指明了第一次调用这个方法时返回的bookList将被存在内存的哪里。
- key : 可选。要使用SpEL表达式,这里与参数
username
对应,当传入的username值变了的话就不去取缓存里的数据了,而是执行getBooksByUsernameAndLanguage
方法。(这是必须的,因为username变了,返回值也就变了,缓存里的数据不符合了,因此这个选项很重要)。spring默认用方法的签名来当做key。 - condition:方法返回的结果bookList,要不要缓存起来?condition就添加了一个限定条件。这个例子中,只有传入的语言代码是1,返回的bookList才会被缓存起来,如果给language传了别的值,那么bookList是不会缓存起来的。
下次再遇到页面刷新后数据还不更新的问题时,记得看看是不是@Cacheable
搞的鬼。
补充: 事实上,第二次调用方法时,spring会在执行
getBooksByUsernameAndLanguage
方法前先去缓存里看是否有相应的数据,有,则不会执行方法。没有,才执行。
网友评论