DefaultAdvisorAutoProxyCreator


Spring 所提供的自動代理建立者(Autoproxy creator)還有 org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator, 只要在定義檔中包括DefaultAdvisorAutoProxyCreator,在Bean定義檔被讀取完之後, DefaultAdvisorAutoProxyCreator會自動搜尋所有的Advisor,並自動將Advisor應用至符合Pointcuts的 目標物件上。

例如可以將 BeanNameAutoProxyCreator 中介紹的Bean定義檔更改為以下,剩下的什麼都不用改,執行的結果也是相同的:
  • beans-config.xml
<?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定義檔修改如下,則執行結果不變:
  • beans-config.xml
<?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應用到不該應用到的目標物件上。