1.類繼承關(guān)系
2.使用
ProxyFactoryBean是我們生成代理對象的一種方式,是一個工廠Bean媚送,先看看怎么使用這個類生成代理對象
先給上我的Demo代碼 ProxyFactoryBean demo
在xml中的配置如下
<bean id="helloService" class="com.scj.demo.aop.HelloServiceImpl"/>
<bean id="testAfterAdvice" class="com.scj.demo.aop.TestAfterAdvice"/>
<bean id="testAroundAdvice" class="com.scj.demo.aop.TestAroundAdvice"/>
<bean id="testBeforeAdvice" class="com.scj.demo.aop.TestBeforeAdvice" />
<bean id="regexpMethodPointcutAdvisor" class="org.springframework.aop.support.RegexpMethodPointcutAdvisor">
<property name="advice" ref="testBeforeAdvice"/>
<property name="patterns">
<list>
<value>.*hello</value>
</list>
</property>
</bean>
<bean id ="aop" class="org.springframework.aop.framework.ProxyFactoryBean">
<property name="interfaces" value="com.scj.demo.aop.HelloService"/>
<property name="target" ref="helloService"/>
<property name="interceptorNames">
<list>
<value>testBeforeAdvice</value>
<value>testAfterAdvice</value>
<value>testAroundAdvice</value>
</list>
</property>
</bean>
我們需要在ProxyFactoryBean中配置我們的代理接口(連接點)中燥,目標(biāo)對象,通知塘偎,通知器或者攔截器
配置的通知疗涉,會自動轉(zhuǎn)換為Advisor,配上永遠(yuǎn)匹配的Pointcut
@Service("integtareService")
public class IntegrateService {
@Resource(name = "aop")
private HelloService helloService;
public void test(){
helloService.hello("scj");
}
}
在IntegrateService注入了HelloService接口吟秩,接口實現(xiàn)使用ioc容器中名字為aopbean咱扣,也就是我們定義的ProxyFactotyBean
測試代碼如下
System.out.println("Aop 聲明式注入");
IntegrateService integrateService =applicationContext.getBean(IntegrateService.class);
integrateService.test();
結(jié)果為
Aop 聲明式注入
test before
around before
helloscj
around after
after ...
可以看到代理生效了,注入的是我們配置的代理對象
3.解析
接下來分析ProxyFactoryBean的具體源碼
因為ProxyFactoryBean是一個工廠bean涵防,我們從它的getObject方法看起
public Object getObject() throws BeansException {
initializeAdvisorChain();
if (isSingleton()) {
return getSingletonInstance();
}
else {
if (this.targetName == null) {
logger.warn("Using non-singleton proxies with singleton targets is often undesirable. " +
"Enable prototype proxies by setting the 'targetName' property.");
}
return newPrototypeInstance();
}
}
這個方法的一開始會初始化Advisor鏈闹伪,把相應(yīng)的Adivisor加到AdvisedSupport里到advisors中去。
然后判斷是singletonbean還是prototypebean,對應(yīng)做不同處理偏瓤。
最終創(chuàng)建代理對象是調(diào)用getProxy(createAopProxy())來實現(xiàn) 杀怠,createAopProxy()來自父類ProxyCreatorSupport
protected Object getProxy(AopProxy aopProxy) {
return aopProxy.getProxy(this.proxyClassLoader);
}
通過ProxyCreatorSupport的createAopProxy()方法得到AopProxy后,調(diào)用它的getProxy方法得到真正的代理對象厅克。
在ProxyFactoryBean做的最重要的工作還是配置了Advisor驮肉。其他的工作父類都能協(xié)助完成。
ioc通過getObject方法得到代理對象之后已骇,就能像使用目標(biāo)對象一樣使用代理對象了。
4.總結(jié)
ProxyFactoryBean雖說是聲明式的票编,但是它對每一個接口都需要我們?nèi)ヅ渲靡粋€ProxyFactotyBean,我們一般不會用這個來做Aop褪储,更多的是希望只要配置Advisor之后Spring自動幫我們把需要生成代理對象的對象全部替換,這就需要我們之后講的DefaultAdvisorAutoProxyCreator來實現(xiàn)
Spring中把特定功能委托給其他類或者父類實現(xiàn)慧域,看起來很酷炫鲤竹,這個模式叫做MixIn 或者 組合模式,以后寫代碼也可以使用下這種模式