ProxyFactory的工作原理
ProxyFactory是一个代理对象生产工厂,在生成代理对象之前须要对代理工厂进行配置。ProxyFactory在生成代理对象之前须要决定到底是应用JDK动静代理还是CGLIB技术。
// config就是ProxyFactory对象// optimize为true,或proxyTargetClass为true,或用户没有给ProxyFactory对象增加interfaceif (config.isOptimize() || config.isProxyTargetClass() || hasNoUserSuppliedProxyInterfaces(config)) { Class<?> targetClass = config.getTargetClass(); if (targetClass == null) { throw new AopConfigException("TargetSource cannot determine target class: " + "Either an interface or a target is required for proxy creation."); } // targetClass是接口,间接应用Jdk动静代理 if (targetClass.isInterface() || Proxy.isProxyClass(targetClass)) { return new JdkDynamicAopProxy(config); } // 应用Cglib return new ObjenesisCglibAopProxy(config);}else { // 应用Jdk动静代理 return new JdkDynamicAopProxy(config);}
JdkDynamicAopProxy创立代理对象过程
- 获取生成代理对象所须要实现的接口汇合
- 获取通过ProxyFactory.addInterface()所增加的接口,如果没有通过ProxyFactory.addInterface()增加接口,那么则看ProxyFactory。setTargetClass()所设置的targetClass是不是一个接口,把接口增加到后果汇合中,同时把SpringProxy、Advised、DecoratingProxy这几个接口也增加到后果汇合中去。
- 确定好要代理的汇合之后,就利用Proxy.newProxyInstance()生成一个代理对象。
JdkDynamicAopProxy创立代理对象执行过程
- 如果通过ProxyFactory.setExposeProxy()把exposeProxy设置为true,那么则把代理对象设置到一个ThreadLocal(currentProxy)中去。
- 获取通过ProxyFactory所设置的target,如果设置的是targetClass,那么target将为null
- 依据以后所调用的办法对象寻找ProxyFactory中所增加的并匹配的Advisor,并且把Advisor封装为MethodInterceptor返回,失去MethodIntercepter链叫做chain
- 如果chain为空,则字节执行target对应的以后办法,如果target为null会报错
- 如果chain不为空,则会顺次执行chain中的MethodInterceptor。如果以后MethodInterceptor是MethodBeforeAdviceInterceptor,那么先执行Advisor中所advice的before()办法,而后执行下一个MethodInterceptor.如果以后MethodInterceptor是AfterReturningAdviceInterceptor,那么先执行执行下一个MethodInterceptor。拿到返回值后,再执行Advisor中所advice的afterReturning()办法
ObjenesisCglibAopProxy创立代理对象过程
- 创立Enhancer
- 设置Enhancer的superClass为通过ProxyFactory.setTarget()所设置的对象的类
- 设置Enhancer的interfaces为通过ProxyFactory.addInterface()所增加的接口,以及SpringProxy、Advisor接口
- 设置Enhancer的Callbacks为DynamicAdvisedIntercepter
- 最初通过Enhancer创立一个代理对象
ObjenesisCglibAopProxy创立的代理对象执行过程
执行过程次要就看DynamicAdvisedInterceptor中的实现,执行逻辑和JdkDynamicAopProxy中是一样的。
主动代理(autoproxy)性能
“主动代理”示意只须要在Spring中增加某个Bean,这个Bean是一个BeanPostProcessor,那么Spring在每创立一个Bean时,都会通过这个BeanPost Processor的判断,去判断以后正在创立的这个Bean是不是须要进行AOP。
DefaultAdvisorAutoProxyCreator
AbstractAutoProxyCreator实现了SmartInstantiationAwareBeanPostProcessor接口,是一个BeanPostProcessor
- 在某个Bean实例化之前,查看该AbstractAutoProxyCreator中是不是设置了CustomTargetSource,如果设置了就查看以后Bean是不是须要创立一个TargetSource,如果须要就会创立一个TargetSource对象,而后进行AOP创立一个代理对象,并返回该代理对象
- 如果某个Bean呈现了循环依赖,那么会利用getEarlyBeanReference()办法提前进行AOP
- 在某个Bean初始化之后,会调用wrapIfNecessary()办法进行AOP
- 在这个类中提供了一个形象办法:getAdvicesAndAdvisorsForBean(),示意对于某个Bean匹配了哪些Advices和Advisors
AbstractAdvisorAutoProxyCreator继承了AbstractAutoProxyCreator,AbstractAdvisorAutoProxyCreator中实现了getAdvicesAndAdvisorsForBean()办法,实现逻辑为:
- 调用findEligibleAdvisors()
- 调用findCandidateAdvisors,失去所有Advisor类型的Bean。按以后正在进行Bean的生命周期的Bean进行过滤
@EnableAspectJAutoProxy
这个注解次要是增加了一个AnnotationAwareAspectJAutoProxyCreator类型的BeanDefinition。AspectJAwareAdvisorAutoProxyCreator继承了AbstractAdvisorAutoProxyCreator,重写了shouldSkip(Class<?> beanClass, String beanName)办法,示意某个bean需不需要进行AOP,在shouldSkip()办法中:
- 拿到所有的Advisor
- 遍历所有的Advisor,如果以后bean是AspectJPointcutAdvisor,那么则跳过
AnnotationAwareAspectJAutoProxyCreator继承了AspectJAwareAdvisorAutoProxyCreator,重写了findCandidateAdvisors()办法,它即能够找到Advisor类型的bean,也能把所有@Aspect注解标注的类扫描进去并生成Advisor
注解和源码对应关系
@Before对应的是AspectJMethodBeforeAdvice,间接实现MethodBeforeAdvice,在进行动静代理时会把AspectJMethodBeforeAdvice转成MethodBeforeAdviceInterceptor,也就转变成了MethodBeforeAdviceInterceptor
- 先执行advice对应的办法
- 再执行MethodInvocation的proceed(),会执行下一个Interceptor,如果没有下一个Interceptor了,会执行target对应的办法
@After对应的是AspectJAfterAdvice,间接实现了MethodInterceptor
- 先执行MethodInvocation的proceed(),会执行下一个Interceptor,如果没有下一个Interceptor了,会执行target对应的办法
- 再执行advice对应的办法
@Around对应的是AspectJAroundAdvice,间接实现了MethodInterceptor
- 间接执行advice对应的办法
@AfterThrowing对应的是AspectJAfterThrowingAdvice,间接实现了MethodInterceptor
- 先执行MethodInvocation的proceed(),会执行下一个Interceptor,如果没有下一个Interceptor了,会执行target对应的办法
- 如果下面抛了Throwable,那么则会执行advice对应的办法
@AfterReturning对应的是AspectJAfterReturningAdvice,实现了AfterReturningAdvice,在进行动静代理时会把AspectJAfterReturningAdvice转成AfterReturningAdviceInterceptor,也就转变成了MethodInterceptor
- 先执行MethodInvocation的proceed(),会执行下一个Interceptor,如果没有下一个Interceptor了,会执行target对应的办法
- 执行下面的办法后失去最终的办法的返回值
- 再执行Advice对应的办法