一、aop的入口 ProxyFactoryBean方式实现的入口
入口 1. ProxyFactoryBean实现了FactoryBean,所以入口在getObject方法。 2. initializeAdvisorChain方法初始化所有通知。 3. getSingletonInstance中调用getProxy(createAopProxy())创建代理。
自动代理方式入口(
DefaultAdvisorAutoProxyCreator , BeanNameAutoProxyCreator ) 以BeanNameAutoProxyCreator 为例
入口 1. 它们都继承了
AbstractAutoProxyCreator, AbstractAutoProxyCreator实现了BeanPostProcessor接口, 当spring的bean调用getBean初始化前后会回调该接口postProcessAfterInitialization的方法 2. BeanNameAutoProxyCreator.getAdvicesAndAdvisorsForBean方法中匹配当前Bean是否需要被拦截 3. createProxy创建代理。
使用aop:config配置
入口
1.
在
AopNamespaceHandler中,registerBeanDefinitionParser(“config”, new ConfigBeanDefinitionParser())注册ConfigBeanDefinitionParser解析器。
2. ConfigBeanDefinitionParser.parse方法,首先调用configureAutoProxyCreator方法,注册AspectJAwareAdvisorAutoProxyCreator。
3. AspectJAwareAdvisorAutoProxyCreator的父类AbstractAutoProxyCreator实现了BeanPostProcessor接口, 当spring的bean调用getBean初始化前后会回调该接口。
获取advisor
1. parsePointcut方法解析<aop:pointcut>标签,装载定义的切点。 2. parseAdvisor方法解析<aop:advisor>标签,将会装载出advisor.
3. parseAspect则是对应<aop:aspct>方式。
使用
<aop:aspectj-autoproxy>, aspectj注解方式
入口
1. 对于标签的解析在
AopNamespaceHandler中,registerBeanDefinitionParser(“aspectj-autoproxy”, new AspectJAutoProxyBeanDefinitionParser())注册AspectJAutoProxyBeanDefinitionParser解析器。
2. AspectJAutoProxyBeanDefinitionParser.parse()方法, 调用AopNamespaceUtils.registerAspectJAnnotationAutoProxyCreatorIfNecessary,首先创建AnnotationAwareAspectJAutoProxyCreator的BeanDefinition, 调用useClassProxyingIfNecessary解析proxy-target-class解析expose-proxy和proxy-target-class属性,调用registerComponentIfNecessary方法注册BeanDefinition。
3. 真正的入口就在AnnotationAwareAspectJAutoProxyCreator, 它的父类AbstractAutoProxyCreator实现了BeanPostProcessor接口, 当spring的bean调用getBean初始化前后会回调该接口。
获取advisor
4. AbstractAutoProxyCreator.postProcessAfterInitialization方法会被回调,其中调用wrapIfNecessary方法,这里面获取所有的通知,并创建代理 。
5.调用父类AbstractAdvisorAutoProxyCreator.getAdvicesAndAdvisorsForBean方法获取通知。findCandidateAdvisors获取所有通知,并调用findAdvisorsThatCanApply匹配出合适的通知返回。
6. findCandidateAdvisors方法,会由子类来实现 ,AnnotationAwareAspectJAutoProxyCreator中获取了所有注解生成的通知,AbstractAdvisorAutoProxyCreator获取在配置文件中的定义的通知。
7.this.aspectJAdvisorsBuilder.buildAspectJAdvisors()生成aspect注解定义的通知。其中根据ReflectiveAspectJAdvisorFactory.getAdvisors获取。
8. getAdvisor获取普通的通知,getPointcut获取切点信息,然后实例化InstantiationModelAwarePointcutAdvisorImpl对象,返回。
9.在InstantiationModelAwarePointcutAdvisorImpl构造方法中,完成属性的注入后,会调用ReflectiveAspectJAdvisorFactory.instantiateAdvice方法,根据不同的注解的类型生成不同通知。
生成代理
10. 还是在wrapIfNecessary方法中,获取到所有advisor后,会调用createProxy生成代理,并把通知插入到代理的拦截器中。
11. 实例化一个ProxyFactory,并设置通知器,target等属性,proxyFactory.getProxy获取代理。
12.createAopProxy()方法会根据相关策略,生成JdkDynamicAopProxy或者ObjenesisCglibAopProxy。
13.使用jdk生成代理时,在InvocationHandler的回调方法invoke中插入通知。
. AdvisedSupport.getInterceptorsAndDynamicInterceptionAdvice生成方法的拦截器链
.ReflectiveMethodInvocation.proceed()方法开始执行拦截器调用,调用interceptor.invoke执行具体的Advice。并在advice的中会调用MethodInvocation.proceed形成链式调用。
14.使用Cglib生成代理时。
调用getCallbacks创建回调,为每个方法创建回调,实例化FixedChainStaticTargetInterceptor,封装拦截器。 FixedChainStaticTargetInterceptor.intercept方法中执行回调,并成其中调用invocation.proceed()开始拦截器的调用。