在操做缓存中,通常会有如下几种操做,在Spring的缓存中会对应有几种注解:spring
* 获取数据:从缓存得到须要数据,若是缓存没有则从数据库查询,再将其保存在缓存;数据库
* 插入数据:先将数据插入数据库中,再保存到缓存中;缓存
* 更新数据:先将数据更新到数据库中,再更新相应缓存数据;ide
* 删除数据:先从数据库中删除数据,再删除缓存中数据;spa
spring cache经常使用注解为:@Cacheable、@CachePut、@CacheEvit代理
@Cacheable 的做用:适用于获取数据,若是缓存中有数据,不在调用注解方法;orm
@CachePut 的做用:适合于插入数据和更新数据。必定会调用真实方法,再将方法返回值保存到缓存;xml
@CachEvict 的做用:适合于删除数据。对象
主要的参数 | ||
value | 缓存的名称,能够在 spring 配置文件中定义,必须指定至少一个 | 例如: @Cacheable(value=”mycache”) 或者 @Cacheable(value={”cache1”,”cache2”} |
key | 缓存的 key,能够为空,若是指定要按照 SpEL 表达式编写,若是不指定,则缺省按照方法的全部参数进行组合 | 例如: @Cacheable(value=”testcache”,key=”#userName”) |
condition | 缓存的条件,能够为空,使用 SpEL 编写,返回 true 或者 false,只有为 true 才进行缓存 | 例如: @Cacheable(value=”testcache”,condition=”#userName.length()>2”) |
1、xml配置文件ci
//cacheManager为具体的缓存管理器例如RedisCacheManager
<cache:annotation-driven cache-mamage="cacheManager" />
2、项目中操做
@CacheConfig(cacheNames="prizeinfo")
@Service(value="springRedisService")
public class SpringRedisServiceImpl implements SpringRedisService{
@Autowired
private PrizeinfoService prizeinfoService;
@Cacheable(key="'id:'+#id")
public Prizeinfo getObject(int id) {
return prizeinfoService.getPrizeinfoById(id);
}
@CachePut(key="'id:'+#o.id")
public Prizeinfo insertObject(Prizeinfo o) {
prizeinfoService.insertPrizeinfo(o);
System.out.println("insertObject"+o.getId());
return o;
}
@CacheEvict(key="'id:'+#id")
public int deleteObjectById(int id) {
prizeinfoService.deletePrizeinfoById(id);
return id;
}
}
3、Spring Cache原理:
Spring Cache实际是利用Spring Aop原理来实现的。具体的执行流程和源码,下面将讲解
#标签会默认的建立什么对象??
1. 解析自定义缓存标签<cache:annotation-driven />
1.1 利用springIoc先解析标签器类AnnotationDrivenCacheBeanDefinitionParser 。
//存储自定义标签和解析标签类的关系
CacheNamespaceHandler
//解析自定义的标签的解析器,将xml其生成beandefinition
BeanDefinitionParser
AnnotationDrivenCacheBeanDefinitionParser
1.2 AnnotationDrivenCacheBeanDefinitionParser解析方法parser,解析标签属性,建立对应BeanDefinition。(图解在https://www.processon.com/embed/58afa70be4b0793432a703c9)
//通知器自动代理生成器 名称:org.springframework.cache.config.internalCacheAdvisor
·InfrastructureAdvisorAutoProxyCreator
//缓存的基本操做
·AnnotationCacheOperationSource
//拦截器类 设置属性:cacheOperationSources
·CacheInterceptor
//通知器
//设置通知属性:adviceBeanName:CacheInterceptor
//设置cacheOperationSource属性:AnnotationCacheOperationSource
·BeanFactoryCacheOperationSourceAdvisor
#注解的类是什么时候,经过什么方式和缓存关联的??
2. 注解缓存类SpringRedisServiceImpl 实例化对象
2.1 使用自动代理建立器的时机:
2.2 自动代理建立器的建立过程:
2.3 调用注解类: