DefaultAdvisorAutoProxyCreator 这种配置方式与BeanNameAutoProxyCreator自动创建代理的方式非常相似,都是使用bean后处理器为目标bean创建代理,区别是前者使用事务拦截器创建代理 ,后者需要使用Advisor创建事务代理 。
事实上,采用DefaultAdvisorAutoProxyCreator的事务代理配置方式更加简洁,这个代理生成器自动搜索Spring容器中的Advisor,并为容器中所有的bean创建代理。
DefaultAdvisorAutoProxyCreator:
下面是使用DefaultAdvisorAutoProxyCreator的配置方式
对于事务,使用TransactionAttributeSourceAdvisor这个Advisor:
<!-- 定义事务管理器,使用适用于Hibernte的事务管理器--> <bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager"> <property name="sessionFactory"><ref local="sessionFactory"/></property> </bean> <!-- 配置事务拦截器--> <bean id="transactionInterceptor" class="org.springframework.transaction.interceptor.TransactionInterceptor"> <!-- 事务拦截器bean需要依赖注入一个事务管理器 --> <property name="transactionManager" ref="transactionManager"/> <property name="transactionAttributes"> <!-- 下面定义事务传播属性--> <props> <prop key="insert*">PROPAGATION_REQUIRED</prop> <prop key="find*">PROPAGATION_REQUIRED,readOnly</prop> <prop key="*">PROPAGATION_REQUIRED</prop> </props> </property> </bean> <!-- 定义事务Advisor--> <bean class="org.springframework.transaction.interceptor.TransactionAttributeSourceAdvisor"<!-- 定义advisor时,必须传入Interceptor--> <property name="transactionInterceptor" ref="transactionInterceptor"/> </bean> <!-- DefaultAdvisorAutoProxyCreator搜索容器中的 advisor,并为每个bean创建代理 --> <bean class="org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator"/>
在这种配置方式下,配置文件变得更加简洁,增加目标bean,不需要增加任何额外的代码,容器自动为目标bean生成代理。但这种方式的可读性相对较差。
来源:http://mopdzz.itpub.net/post/20166/470140
当ApplicationContext读如所有的Bean配置信息后,DefaultAdvisorAutoProxyCreator将扫描上下文,寻找所有的Advistor(一个Advisor是一个切入点和一个通知的组成) ,将这些Advisor应用到所有符合切入点的Bean中。
此例子没有用到事务,只用到AOP
//前置通知 public class WelcomeAdvice implements MethodBeforeAdvice ...{ public void before(Method method, Object[] args, Object obj) throws Throwable ...{ System.out.println("Hello welcome to bye "); } }
<!-- 自动代理所有的advisor --> <bean id="autoProxyCreator" class="org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator"></bean> <bean id="WelcomeAdvice" class="AutoProxyTwo.WelcomeAdvice"/> <bean id="advisor" class="org.springframework.aop.support.RegexpMethodPointcutAdvisor"> <property name="pattern"> <value>.*sell.+</value> <!-- 业务实现方法名匹配 --> </property> <property name="advice"> <ref bean="WelcomeAdvice"/> </property> </bean>
雷同:http://www.iteye.com/topic/128556
http://esffor.iteye.com/blog/96126
很值得看的例子(没有用到事务,单纯AOP)
http://www.blogjava.net/cmzy/archive/2008/08/17/222624.html
BeanNameAutoProxyCreator:
<!-- 配置事务拦截器--> <bean id="transactionInterceptor" class="org.springframework.transaction.interceptor.TransactionInterceptor"> <!-- 事务拦截器bean需要依赖注入一个事务管理器 --> <property name="transactionManager" ref="transactionManager" /> <property name="transactionAttributes"> <!-- 下面定义事务传播属性--> <props> <prop key="insert*">PROPAGATION_REQUIRED</prop> <prop key="find*">PROPAGATION_REQUIRED,readOnly</prop> <prop key="*">PROPAGATION_REQUIRED</prop> </props> </property> </bean> //定义BeanNameAutoProxyCreator,该bean是个bean后处理器,无需被引用,因此没有id属性 <bean class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator"> <property name="beanNames"> <!-- 下面是所有需要自动创建事务代理的bean--> <list> <value>userDAOTarget</value> </list> </property> <!-- 下面定义BeanNameAutoProxyCreator所需的事务拦截器--> <property name="interceptorNames"> <list> <value>transactionInterceptor</value> <!-- 此处可增加其他新的Interceptor --> </list> </property> </bean> <!--定义DAO Bean ,由于BeanNameAutoProxyCreator自动生成事务代理--> <bean id="userDAOTarget" class="db.CustomersDAO"> <property name="sessionFactory"> <ref local="localSessionFactory" /> </property> </bean>
单纯使用AOP时,interceptorNames为通知advice:
<beans> <bean id="TestBeanA" class="aop.test.TestBeanA"/> <bean id="BeanB" class="aop.test.BeanB"/> <bean id="BeforeAdvice" class="aop.test.BeforeAdvice"></bean> <bean class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator"> <property name="beanNames"> <list> <value>Test*</value> </list> </property> <property name="interceptorNames"> <list> <value>BeforeAdvice</value> </list> </property> </bean> </beans>
http://doc.javanb.com/spring-framework-reference-zh-2-0-5/ch07s09.html
http://mopdzz.itpub.net/post/20166/470137
http://hi.baidu.com/freshman0502/blog/item/8068e01b5038d01c8618bf8e.html