Spring-AOP实现大致过程
2017-08-24 17:18:45 8 举报
Spring AOP源码实现流程图
作者其他创作
大纲/内容
根据获取的拦截链构造MethodInvocation:ReflectiveMethodInvocation
开始:DynamicAdvisedInterceptor.intercept()
cglib
CglibMethodInvocation是ReflectiveMethodInvocation的子类
获取其他需要代理的接口Class,封装到数组proxiedInterfaces中
依次执行拦截链
后置处理abstractAutoProxyCreator.postProcessAfterInitialization
根据拦截的方法以及所有的Advice获取拦截链
结束
CGLIB创建代理类过程
JdkDynamicAopProxy
当前bean是否是代理的基础设施类
前置处理abstractAutoProxyCreator.postProcessBeforeInstantiation
存在
不是
拦截器链也就是一系列的MethodInterceptor,例如:前置增强器(MethodBeforeAdvice)、后置的增强器(AspectJAfterAdvice)、环绕增强器(AspectJAroundAdvice)等。
后置处理过程
创建Enhancer
获取当前bean对应的Advisor(从所有的Advisor中筛选)
jdk
jdk代理增强拦截过程
获取要代理的接口Class
准备工作:通过AopNamespaceHandler类完成对AspectJAutoProxyBeanDefinitionParser的注册。而AspectJAutoProxyBeanDefinitionParser完成了对AnnotationAwareAspectJAutoProxyCreator的注册,对于Aop的实现基本是靠类AnnotationAwareAspectJAutoProxyCreator实现。AnnotationAwareAspectJAutoProxyCreator是BeanPostProcessor的一个子类
根据AopProxy创建当前bean代理类。
获取所有的Advisor,并放到缓存中
根据之前解析到这个类的所有增强获取Callback:aopInterceptor
将其他的Interceptor封装到Callback数组中。个拦截连链
实例化某个bean的之后
判断当前Bean是否存在Advisor
创建proxyFactory,设置相关属性
SpringProxy、Advised、DecoratingProxy
缓存放在BeanFactoryAspectJAdvisorsBuilder的advisorsCache变量中
JDK创建代理类过程
前置处理过程
结束:完成bean代理类的创建
实例化某个bean的之前
使用ReflectiveMethodInvocation进行链的封装,在process方法中实现拦截器的逐一调,用这个类维护了链接调用的计数器,保证链有序地进行,最终增强的逻辑还是委托给了各个增强器
ObjenesisCglibAopProxy
判断创建哪种AopProxy
判断逻辑:1、如果目标对象实现了接口,默认采用JDK动态代理2、如果目标实现了接口,想强制使用CGLIB,可以设置proxy-target-class=\"true\"3、如果目标对象没有实现接口,只能采用CGLIB。
开始:CglibAopProxy.getProxy
这个Callback是DynamicAdvisedInterceptor类,这个类实际也是MethodInterceptor的一个子类,这个类是cglib拦截增强最终逻辑所在之处。Callback aopInterceptor = new DynamicAdvisedInterceptor(this.advised)
开始:JdkDynamicAopProxy.getProxy
根据前面得到的Enhancer和Callback拦截链生成最终的代理类
开始:JdkDynamicAopProxy.invoke()
根据bean对应Advisor创建代理类:createProxy
通过得到的proxiedInterfaces调用jdk生成代理类的方法生成代理类
根据获取的拦截链构造MethodInvocation:CglibMethodInvocation
Cglib代理增强拦截过程
0 条评论
回复 删除
下一页