Spring
所提供的自動代理建立者(Autoproxy creator)還有
org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator,
只要在定義檔中包括DefaultAdvisorAutoProxyCreator,在Bean定義檔被讀取完之後,
DefaultAdvisorAutoProxyCreator會自動搜尋所有的Advisor,並自動將Advisor應用至符合Pointcuts的
目標物件上。
例如可以將 BeanNameAutoProxyCreator 中介紹的Bean定義檔更改為以下,剩下的什麼都不用改,執行的結果也是相同的:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE beans PUBLIC "-//SPRING/DTD BEAN/EN" "http://www.springframework.org/dtd/spring-beans.dtd">
<beans> <bean id="someService" class="onlyfun.caterpillar.Some"/>
<bean id="lockIntroduction" class="onlyfun.caterpillar.LockIntroduction"/> <bean id="lockAdvisor" class="org.springframework.aop.support.DefaultIntroductionAdvisor"> <constructor-arg index="0"> <ref bean="lockIntroduction"/> </constructor-arg> <constructor-arg index="1"> <value>onlyfun.caterpillar.ILockable</value> </constructor-arg> </bean> <bean id="autoProxyCreator" class="org.springframework.aop.framework. → autoproxy.DefaultAdvisorAutoProxyCreator"/> </beans>
將RegExpMethodPointcutAdvisor 中的Bean定義檔修改如下,則執行結果不變:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE beans PUBLIC "-//SPRING/DTD BEAN/EN" "http://www.springframework.org/dtd/spring-beans.dtd">
<beans> <bean id="logBeforeAdvice" class="onlyfun.caterpillar.LogBeforeAdvice"/> <bean id="regExpAdvisor" class="org.springframework.aop. → support.RegexpMethodPointcutAdvisor"> <property name="pattern"> <value>.*hello.*</value> </property> <property name="advice"> <ref bean="logBeforeAdvice"/> </property> </bean> <bean id="helloSpeaker" class="onlyfun.caterpillar.HelloSpeaker"/> <bean id="autoProxyCreator" class="org.springframework.aop.framework. → autoproxy.DefaultAdvisorAutoProxyCreator"/> </beans>
自動代理建立是個Spring在撰寫設定檔時一個方便的工具,但相對的您的Bean定義檔容易有些不清不楚的設定,因為不若直接自行在定義檔上撰寫來的清楚,並且您要小心的定義Pointcut,以免Advice應用到不該應用到的目標物件上。
|