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在方法调用后执行。

相关推荐