spring aop 經典代理方式解析
阿新 • • 發佈:2018-11-29
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");