1. 程式人生 > >spring aop 經典代理方式解析

spring aop 經典代理方式解析

bean.xml的書寫方式:

<bean id="service" class="wwx.service.Service"><!-- 被代理者,可以是java普通的類,也可以是java實現介面的普通的類-->
		<property name="name" value="wwx" />
</bean>

<bean id="serviceAdvice" class="wwx.advice.ServiceAdvice" /><!-- 俗名攔截者,學名通知 -->

<bean id="serviceProxy" class="org.springframework.aop.framework.ProxyFactoryBean"><!-- 代理者 -->

	<property name="target" ref="service" /><!-- 被代理者注入 -->

	<property name="interceptorNames">
		<list>
		     <value>serviceAdvice</value><!-- 攔截者列表 -->
		</list>
	</property>
</bean>

ProxyFactoryBean是spring自己的一個普通的類,

public class ProxyFactoryBean extends ProxyCreatorSupport
implements FactoryBean, BeanClassLoaderAware, BeanFactoryAware

他實現了FactoryBean介面。

public interface FactoryBean {

	public abstract Object getObject() throws Exception;

	public abstract Class getObjectType();

	public abstract boolean isSingleton();
}

其實這個類可以理解為就是一個工廠,這個工廠會返回一個被自己想返回的類,通過getObject()返回。

案例1:假如被代理者是普通類,沒有實現介面,會使用cglib技術生成代理者。

案例2:假如被代理者是普通類,實現介面,會使用jdk動態代理技術生成代理者。

案例1:生成的代理者 繼承Service,也就是被代理者(cglib慣用伎倆)

並實現了三個介面

org.springframework.aop.SpringProxy       這個介面為標記介面,標記這個類是spring生成的代理者
org.springframework.aop.framework.Advised   這個介面的實現為了配置一些代理資訊

org.springframework.cglib.proxy.Factory    這個介面是cglib的介面,最重要方法newInstance

所以你要這樣獲取

Service s =(Service) appContext.getBean("serviceProxy");

案例2:生成的代理者 繼承了java.lang.reflect.Proxy該類,目測可能會用到其中的方法

並實現了三個介面

wwx.service.ServiceHandler  這個我自己的介面
org.springframework.aop.SpringProxy  這個同上

org.springframework.aop.framework.Advised  這個同上

所以你要這樣獲取

ServiceHandler s =(ServiceHandler) appContext.getBean("serviceProxy");