spring源码解析-AOP原理
来源:互联网 发布:美国经济数据日历 编辑:程序博客网 时间:2024/05/18 01:34
一、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()开始拦截器的调用。
阅读全文
0 0
- spring源码解析-AOP原理
- spring AOP 源码解析 及其实现原理
- Spring源码解析之四 ------ AOP原理和源码分析
- spring aop原理解析
- spring源码解析-Aop
- Spring源码解析-aop
- Spring源码解析-AOP
- spring源码解读 AOP原理
- spring源码aop解析(一)
- Spring AOP原理解析、CGLIB解析
- 理解Spring AOP 原理(三)Spring AOP 源码分析
- (八)Spring核心框架 - AOP的原理及源码解析
- Spring基于注解形式的 AOP的原理流程及源码解析(一)
- Spring基于注解形式的 AOP的原理流程及源码解析(二)
- Spring基于注解形式的 AOP的原理流程及源码解析(三)
- Spring基于注解形式的 AOP的原理流程及源码解析(四)
- Spring源码学习-5.AOP原理分析
- spring Aop实现原理(源码)
- 2017多校训练八-1011(hdu 6143 Killer Names)
- qt基础3
- JavaScript知识点之执行上下文
- Codeforces 545D
- Liunx环境启动tomact与查看日志
- spring源码解析-AOP原理
- 指定代码放哪个cpu运行
- Sequence
- 解决springMVC中Get请求乱码的问题
- AndroidStudio的CMake开发时遇到的异常及解决方案
- Eratosthenes筛法
- 基本Makefile编写举例
- 受限玻尔兹曼机(Restricted Boltzmann Machine)分析
- 解决ajax请求过滤器重定向不跳转