spring cache 6: 启动时计算并缓存方法是否需要走缓存
初始化bean时:
- BeanFactoryCacheOperationSourceAdvisor(Advisor)中的Pointcut是CacheOperationSourcePointcut
- spring启动时创建对象(ProxyFactory创建当前对象的一个Proxy类)中的wrapIfNecessary需要计算出所有advisor(调用AbstractAutoProxyCreator.getAdvicesAndAdvisorsForBean)
- 判断标准是 Advisor.class及其子类
- 对于上面返回的结果,会执行一个canApply方法,首先判断ClassFilter,然后返回true,再迭代Class中的所有Method执行MethodMatcher
- 只要其中一个Method执行MethodMatcher为true,就返回这个advisor
- 其中MethodMatcher中的matches实现是一个查询方法,但是查询不到会进行计算并缓存(null就是未计算过,但是Object getValue是null表示计算过,但是是null)
- 对于Spring cache中Advisor是BeanFactoryCacheOperationSourceAdvisor,计算方法是:AbstractFallbackCacheOperationSource.getCacheOperations
- 所以初始化bean的时候把所有class.method都计算出是否需要走缓存的advisor,并再一个全局的map中进行缓存
执行方法时:
9. 会走到 JdkDynamicAopProxy.invoke,这个地方需要获取inteceptor列表(this.advised.getInterceptorsAndDynamicInterceptionAdvice(method, targetClass); )
10. 上面这个方法会根据method作为key,在本地缓存inteceptor列表(因为一个代理对象都有自己的AdvisedSupport.methodCache,所以不需要Class+Method作为key)
11. 上面这个方法的计算逻辑是:拿到所有advisor,然后首先通过 ClassFilter,然后通过MethodMatcher,返回真正要走到的interceptor列表
12. 返回的interceptor列表最终会走到