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()开始拦截器的调用。
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基于注解形式的 AOP的原理流程及源码解析(一)
- Spring AOP源码解析——AOP动态代理原理和实现方式
- Spring基于注解形式的 AOP的原理流程及源码解析(二)
- Spring核心框架 - AOP的原理及源码解析
- Spring基于注解形式的 AOP的原理流程及源码解析(三)
- Spring核心框架 - AOP的原理及源码解析
- Spring基于注解形式的 AOP的原理流程及源码解析(四)
- (八)Spring核心框架 - AOP的原理及源码解析
- Spring源码解析之四 ------ AOP原理和源码分析
- spring AOP 源码解析 及其实现原理
- Spring AOP原理解析
- spring,IOC和AOP的解析原理和举例
- Spring技术内幕——深入解析Spring架构与设计原理(二)AOP
- spring 源码探索 -- aop 标签解析和创建代理
- Spring Aop 源码实现原理分析
- Spring源码分析:AOP源码解析(上篇)
- 【Spring】Spring IOC原理及源码解析之scope=request、session
- 深入解析Spring架构与设计原理-AOP
- Spring源码:IOC原理解析(一)
- Spring源码情操陶冶-AOP之Advice通知类解析与使用