ITEEDU

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