1. 程式人生 > >spring 直接使用ProxyFactoryBean 實現AOP 流程小結

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的原本方法。