您的位置:首页 > 编程语言 > Java开发

配置Spring,针对Service层的bean做事务处理

2008-05-20 15:38 393 查看
配置Spring,针对Service层的bean做事务处理,以往的做法是这样:

代码

<bean id="txProxyTemplate" abstract="true"

class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">

<property name="transactionManager">

<ref bean="transactionManager"/>

</property>

<property name="transactionAttributes">

<props>

<prop key="find*">PROPAGATION_REQUIRED, readOnly</prop>

<prop key="*">PROPAGATION_REQUIRED</prop>

</props>

</property>

</bean>

<bean id="userManager" parent="txProxyTemplate">

<property name="target">

<bean class="some.package.UserManagerImpl">

<property name="userDAO"><ref bean="userDAO"/></property>

</bean>

</property>

</bean>

以后,如果增加新的Service/Manager,则XML配置的增量是这一段:

代码

<bean id="someOtherManager" parent="txProxyTemplate">

<property name="target">

<bean class="some.package.someOtherManagerImpl">

</bean>

</property>

</bean>

上面说的是老的做法,比较传统。缺点是增量比较大,配置起来copy&paste让人觉得不太爽,比较臃肿。

下面的是Feiing给出的更好的方案,我有一些修改:

代码

<beans>

<!-- Transaction manager for a single Hibernate SessionFactory (alternative to JTA) -->

<bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">

<property name="sessionFactory">

<ref bean="sessionFactory"/>

</property>

</bean>

<bean id="transactionInterceptor" class="org.springframework.transaction.interceptor.TransactionInterceptor">

<property name="transactionManager" ref="transactionManager"/>

<property name="transactionAttributes">

<props>

<prop key="*">PROPAGATION_REQUIRED</prop>

<prop key="find*">PROPAGATION_REQUIRED,readOnly</prop>

</props>

</property>

</bean>

<bean class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">

<property name="beanNames">

<value>*Service,*Manager</value>

</property>

<property name="interceptorNames">

<list>

<value>transactionInterceptor</value>

<!--

此处增加新的Interceptor

-->

</list>

</property>

</bean>

<bean class="org.springframework.transaction.interceptor.TransactionAttributeSourceAdvisor">

<property name="transactionInterceptor" ref="transactionInterceptor"/>

</bean>

<bean id="userManager" class="some.package.UserManagerImpl" autoWire="byName"/>

</beans>

以后每次的增量是这一段:

代码

<bean id="userManager" class="some.package.UserManagerImpl" autoWire="byName"/>

跟配置普通bean的方法一样,非常简洁、直观。对现有的Service接口也无须任何修改

我把Feiing的transactionAttributesSource改成叻transactionAttributes,并且将DefaultAdvisorAutoProxyCreator改成了BeanNameAutoProxyCreator,我觉得毕竟不是context下的每个bean都需要事务,只要在Service层做AOP就可以叻。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: