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 应用到不该应用到的目标物件上。