spring 直接使用ProxyFactoryBean 實現AOP 流程小結
ProxyFactoryBean 是最原始的實現Spring AOP配置的方式
例項:
<bean id="testDaoService" class="com.daodao.mybatis.testDaoService"/> <bean id="testAOPAdvice" class="com.daodao.mybatis.testAOPAdvice"/> <bean id="regexpAdvisor" class="org.springframework.aop.support.RegexpMethodPointcutAdvisor" p:advice-ref="testAOPAdvice"> <property name="patterns"> <list> <value>com\.daodao\.mybatis\..*</value> </list> </property> </bean> <bean id="aoptest1" class="org.springframework.aop.framework.ProxyFactoryBean" p:interceptorNames="regexpAdvisor" p:target-ref="testDaoService" p:proxyTargetClass="true"/>
例項化過程主要類:
1.ProxyFactoryBean
2.RegexpMethodPointcutAdvisor
3.DefaultAopProxyFactory
4.JdkDynamicAopProxy+ObjenesisCglibAopProxy
1.ProxyFactoryBean 繼承FactoryBean介面,getObject()方法在例項化bean的時候被呼叫,返回值為代理物件
a. getObject()方法首先initializeAdvisorChain(); 將RegexpMethodPointcutAdvisor新增至ProxyFactoryBean的advisors
b. 非prototype時呼叫getSingletonInstance();將自己作為引數傳給DefaultAopProxyFactory.createAopProxy(AdvisedSupport config)去建立代理物件。
2.DefaultAopProxyFactory 根據傳輸的AdvisedSupport的一些條件判定採用ObjenesisCglibAopProxy(AdvisedSupport config)還是JdkDynamicAopProxy(AdvisedSupport config)
3.JdkDynamicAopProxy 繼承自 AopProxy介面的getProxy()方法被呼叫,Proxy.newProxyInstance(classLoader, proxiedInterfaces, this).其中this就是當前的JdkDynamicAopProxy(繼承自InvocationHandler.).需要注意的是,JdkDynamicAopProxy持有了ProxyFactoryBean物件,間接的擁有了advisors,target.
4.ObjenesisCglibAopProxy 與3類似,實現是基於cglib
執行過程主要介面:
1.MethodInterceptor(實現類com.daodao.mybatis.testAOPAdvice)
2.MethodInvocation(實現類ReflectiveMethodInvocation)
1. JdkDynamicAopProxy 的invoke(Object proxy, Method method, Object[] args)會呼叫ReflectiveMethodInvocation.proceed();來處理整個流程
a.ReflectiveMethodInvocation 最終目的是將增強邏輯依次插入到現有方法實現的前後。其過程是先呼叫所有的MethodInterceptor的invoke(MethodInvocation invocation),該方法在實現中又會呼叫invocation.proceed();,直到所有的advice跑完,將會呼叫target的原有方法。是個遞迴呼叫。
總結:
僅對JDK動態代理來說,就是將所有的MethodInterceptor實現類和target被代理的類交給InvocationHandler,在InvocationHandler的invoke(Object proxy, Method method, Object[] args)呼叫中巢狀呼叫最終跑完所有的MethodInterceptor的invoke(MethodInvocation invocation)以及target的原本方法。