一、@EnableCaching:主要用于开启基于注解的缓存支持,用在Application类上
@EnableCaching //SpringBoot开启缓存注解支持
@SpringBootApplication
public class DemoApplication {
public static void main(String[] args) {
ConfigurableApplicationContext app = SpringApplication.run(DemoApplication.class, args);
}
二、@CacheConfig:这个注解是加在类上,用于抽取缓存的公共配置。
在类头上加了@CacheConfig注解等同于每个方法上的缓存注解都加了cacherName或者value指定的组件,并且这个组件来自@CacheConfig,也就是用于统筹管理类中所有使用@Cacheable、@CachePut…和@CacheEvict 注解标注方法中的公共属性,这些公共属性包括有cacheNames、keyGenerator 、cacheManager和cacheResolver
@CaaheConfig.(caaheNames - "comment")service
public class CommsntService {
@Autowired
private CommentRepository commentRepository;
public Comment findById(int comment. id){
Comment comment = commentRepository.findById(commenc..id).get ();
return comment;
}
}
上述代码中,CommentService类上标注了@CacheConfig 注解,同时使用cacheNames.属性将缓存空间统―设置为comment,这样在该类中所有方法上使用缓存注解时可以省略相应的cacheNames属性。
需要说明的是,如果在类上使用了@CacheConfig,注解定义了某个属性(例如cacheNames),同时又在该类方法中使用缓存注解定义了相同的属性,那么该属性值会使用“就近原则”选择以方法上注解中的属性值为准。
三、@CachePut:该注解用于设置缓存
表示在调用方法的同时又更新缓存,它是默认先调用目标方法,然后将目标方法的运行结果存入缓存,不过需要注意的是如果要保持缓存同步更新,这个注解使用的key需要和缓存的key保持一致。
和@cacheable不同的是@cacheable不同是在运行在目标方法之前,而它是目标方法之后,因为它需要先拿到目标方法运行的结果。@Cacheable不可以使用#result,因为使用@Cacheable标注的方法不一定会被调用,可能获取不到result。它的属性和@cacheable基本一致,就少了一个是否异步(sync)的属性
@CachePut(value="dep",key="#department.id")
public Department updateDepartment(Department department){
System.out.println("更新信息:"+department);
departmentDao.updateDepartment(department);
return department;
}
四、@Cacheable(value=”accountCache”):该注解主要针对方法配置,能够根据方法的请求参数对其结果进行缓存,比如如果缓存中存在该值,则用缓存数据, 如果不在缓存中,则存入缓存;
这个注释的意思是,当调用这个方法的时候,会从一个名叫 accountCache 的缓存中查询,如果没有,则执行实际的方法(即查询数据库),并将执行的结果存入缓存中,否则返回缓存中的对象。这里的缓存中的 key 就是参数 userName,value 就是 Account 对象。“accountCache”缓存是在 spring*.xml 中定义的名称。
属性:
- value/cacheNames:指定缓存空间的名称,比配属性。可二选一使用。
- key:指定缓存中数据的key,默认使用方法参数值,也可使用SPEL表达式。
- keyGenerator:指定缓存数据的key的生成器,与key属性二选一使用。
- cacheManager:指定缓存的管理器
- cacheResolver:指定缓存的解析器,与cacheManager属性二选一使用。
- condition:指定在符合某种条件下,进行数据缓存。
- unless:指定在符合某种条件下不进行数据缓存。
- sync:指定是否使用异步缓存,默认为false。
五、@CacheEvict :该注解用于清理缓存
注释来标记要清空缓存的方法,先进行方法调用,然后将缓存进行清除。
注意其中一个 @CacheEvict(value=”accountCache”,key=”#account.getName()”),其中的 Key 是用来指定缓存的 key 的,这里因为我们保存的时候用的是 account 对象的 name 字段,所以这里还需要从参数 account 对象中获取 name 的值来作为 key,前面的 # 号代表这是一个 SpEL 表达式,此表达式可以遍历方法的参数对象。
该注解提供了两个特殊属性:
allEntries属性: 表示是否清除指定缓存中的所有键值对,既是否清除所有缓存,设置为true时会清除缓存中的所有键值对,默认为false,即根据key清除缓存。所以它与key属性二选一使用。
beforeInvocation属性: 表示是否是在@CacheEvict注解的方法调用之前清除指定缓存,默认为false,即在方法调用之后清除缓存,设置为true时则会在方法调用之前清除缓存。在方法调用之前还是之后清除缓存的区别在于方法调用时是否会出现异常,若不出现异常,这两种设置没有区别,若出现异常,设置为在方法调用之后清除缓存将不起作用,因为方法调用失败了。
@CacheEvict(value = "dep",key = "#id"/*,beforeInvocation = true*//*,allEntries = true*/)
public boolean delDep(int id){
boolean flag=false;
try{
departmentDao.deleteDepartmentById(id);
flag=true;
}catch(Exception e){
e.printStackTrace();
}
return flag;
}
六、@Caching:该注解可以对缓存清理、设置 等操作打包
用于针对复杂规则的数据缓存管理,可以作用于类或方法,在@Caching注解内部包含有Cacheable、put和evict三个属性,分别对应于@Cacheable、@CachePut和@CacheEvict三个注解
@Caching(cacheable={8cacheable (gacheNames ="comment".,key = "帮id")},
put = {RCachePut(cacheNames = "comment".,key.= "#result.author")})
public Comment getcoiment(int comment id){
return commentRepository.fi.ndByld(comment id).get();
}
上述代码中,使用cacheable和 put两个属性嵌套引入了@Cacheable和@CachePut两个注解,分别以id、和 author为缓存key 值,以查询结果Comment为缓存value值进行缓存管理。