您的位置:首页 > 编程语言 > Java开发

spring源码解析-AOP原理

2017-08-17 19:20 661 查看
一、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()开始拦截器的调用。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  spring 源码