spring cache 原理
一、@EnableCaching - AbstractAdvisorAutoProxyCreator(ImportSelector机制,本身是BeanPostProcessor)
二、核心组件
1、AnnotationCacheOperationSource:获取SpringCache相关的标注并将其转换为对应的CacheOperation属性。
2、BeanFactoryCacheOperationSourceAdvisor是一个PointcutAdvisor,是SpringCache使用Spring AOP机制的关键所在,该advisor会织入到需要执行缓存操作的bean的增强代理中形成一个切面。
3、CacheInterceptor是一个拦截器,当方法调用时碰到了BeanFactoryCacheOperationSourceAdvisor定义的切面,就会执行CacheInterceptor的业务逻辑,该业务逻辑就是缓存的核心业务逻辑。
SpringCacheAnnotationParser 查找所有cache相关注解
三、遇到的坑, condition和unless执行的时机不同
https://blog.csdn.net/m0_37962779/article/details/78747619
https://www.cnblogs.com/yueshutong/p/9381540.html
上面在各个注释中都存在condition属性,其支持使用SpEL(Spring Expression Language),因此具备相当的灵活性,并可以支持非常复杂的语义。各个标注中的condition的执行时机略有不同,因此它们可以使用的SpEL上下文数据也略有不同。
@Cacheable中的condition是在执行方法之前用于被判断是否符合从缓存中读取,因此它无法使用返回值#result;而其unless是在执行方法之后做判断,因此它可以使用返回值#result。
@Cacheput中的condition和unless都是在执行方法之后用于被判断是否符合将结果保存到缓存中,因此它们都可以使用返回值#result。
@CacheEvict的condition由beforeInvocation的值来确定是在方法调用前还是在方法调用后执行。若beforeInvocation为true则condition在方法调用前执行;否则condition在方法调用后执行。