spring aop 是如何实现的?
要分析这个议题,我们以spring cache为例
spring cache是如何与spring整合的
-
在spring项目
spring-context
下的META-INF\spring.handlers
定义了
org.springframework.cache.config.CacheNamespaceHandler
,
使用xml方式,次handler就是spring cache与spring整合的入口 -
重点解析类
AnnotationDrivenCacheBeanDefinitionParser
,在该类的解析方法执行了
AopNamespaceUtils.registerAutoProxyCreatorIfNecessary(parserContext, element);
方法,此处就是在创建所需要的aop,跟踪该方法发现如下代码:
public static BeanDefinition registerAutoProxyCreatorIfNecessary(BeanDefinitionRegistry registry, Object source) {
return registerOrEscalateApcAsRequired(InfrastructureAdvisorAutoProxyCreator.class, registry, source);
}
3.继续跟踪代码后,其实代码并不难里面就是创建 InfrastructureAdvisorAutoProxyCreator
的bean定义
查看该类的继承结构,发现该类间接的继承了AbstractAutoProxyCreator
类,而AbstractAutoProxyCreator
类实现 SmartInstantiationAwareBeanPostProcessor
这个接口,在该接口的postProcessAfterInitialization
方法中我们看到了想要的实现,主要的实现在 wrapIfNecessary->getAdvicesAndAdvisorsForBean方法中
4.getAdvicesAndAdvisorsForBean->findEligibleAdvisors方法是spring aop实现的核心方法,该方法的主要逻辑如下
- 通过findCandidateAdvisors查找当前spring上下文中所有候选的advisor(即aop切面)
- 通过 findAdvisorsThatCanApply(candidateAdvisors, beanClass, beanName)判断当前正在初始化的bean
是否可应用于候选的advisor的某些advisor,如果有则返回这些合格的advisor
5.查到合格的advisor后就为该bean创建指定advisor(切面/拦截器)的代理即可