Spring 事务简化配置

转载 2007年10月08日 10:26:00

在 spring 中, 事务管理一般是通过声明一个 txProxyTemplate, 然后业务 bean 中 parent = "txProxyTemplate", 这样做未免显得有些繁琐, 并且如果业务 bean 还需要其他拦截器, 配置也不太方便, 下面贴出我的配置, 用 DefaultAdvisorAutoProxyCreator 实现自动代理

 

代码
  1. <beans>  
  2.     <!-- Transaction manager for a single Hibernate SessionFactory (alternative to JTA) -->  
  3.     <bean id="transactionManager"  
  4.           class="org.springframework.orm.hibernate3.HibernateTransactionManager">  
  5.           <property name="sessionFactory">  
  6.               <ref bean="sessionFactory"/>  
  7.           </property>  
  8.     </bean>    
  9.        
  10.     <bean id="transactionInterceptor" class="org.springframework.transaction.interceptor.TransactionInterceptor">  
  11.         <property name="transactionManager" ref="transactionManager"/>  
  12.         <property name="transactionAttributeSource">  
  13.           <value>  
  14.             com.skyon.user.manager.UserManager.*=PROPAGATION_REQUIRED   
  15.             #Add new defines here ->  
  16.           </value>  
  17.         </property>  
  18.     </bean>  
  19.        
  20.     <bean class="org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator">  
  21.         <property name="interceptorNames">  
  22.             <list>  
  23.                 <value>transactionInterceptor</value>  
  24.                 <!--  
  25.                 增加新的 Interceptor  
  26.                 -->  
  27.             </list>  
  28.         </property>  
  29.     </bean>  
  30.   
  31.     <bean class="org.springframework.transaction.interceptor.TransactionAttributeSourceAdvisor">  
  32.       <property name="transactionInterceptor" ref="transactionInterceptor"/>  
  33.     </bean>  
  34.            
  35. </beans>  
  36.   

 

这里利用 DefaultAdvisorAutoProxyCreator 实现了对容器中所有 bean 的自动代理, 增加一个需要事务的业务 bean 时只要在 transactionInterceptor 增加一行即可, 增加别的 interceptor 也非常方便,
极大减少了配置量 

 

 

完整版来叻!!

配置Spring,针对Service层的bean做事务处理,以往的做法是这样:

代码
  1. <bean id="txProxyTemplate" abstract="true"    
  2. class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">    
  3.     <property name="transactionManager">  
  4.         <ref bean="transactionManager"/>  
  5.     </property>    
  6.     <property name="transactionAttributes">    
  7.         <props>  
  8.             <prop key="find*">PROPAGATION_REQUIRED, readOnly</prop>    
  9.             <prop key="*">PROPAGATION_REQUIRED</prop>    
  10.         </props>    
  11.     </property>    
  12. </bean>    
  13.   
  14. <bean id="userManager" parent="txProxyTemplate">    
  15.     <property name="target">    
  16.         <bean class="some.package.UserManagerImpl">    
  17.             <property name="userDAO"><ref bean="userDAO"/></property>    
  18.         </bean>    
  19.     </property>    
  20. </bean>    
  21.   

 

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

代码
  1. <bean id="someOtherManager" parent="txProxyTemplate">    
  2.     <property name="target">    
  3.         <bean class="some.package.someOtherManagerImpl">    
  4.         </bean>    
  5.     </property>    
  6. </bean>    

 

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

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

 

代码
  1. <beans>    
  2.         <!-- Transaction manager for a single Hibernate SessionFactory (alternative to JTA) -->    
  3.     <bean id="transactionManager"           class="org.springframework.orm.hibernate3.HibernateTransactionManager">    
  4.           <property name="sessionFactory">    
  5.               <ref bean="sessionFactory"/>    
  6.           </property>    
  7.     </bean>           
  8.            
  9.         <bean id="transactionInterceptor" class="org.springframework.transaction.interceptor.TransactionInterceptor">    
  10.             <property name="transactionManager" ref="transactionManager"/>    
  11.             <property name="transactionAttributes">  
  12.                 <props>  
  13.                     <prop key="*">PROPAGATION_REQUIRED</prop>  
  14.                     <prop key="find*">PROPAGATION_REQUIRED,readOnly</prop>  
  15.                 </props>  
  16.             </property>  
  17.         </bean>    
  18.            
  19.         <bean class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">    
  20.                 <property name="beanNames">  
  21.                     <value>*Service,*Manager</value>  
  22.                 </property>  
  23.                 <property name="interceptorNames">    
  24.                         <list>    
  25.                                 <value>transactionInterceptor</value>    
  26.                                 <!--   
  27.                                 此处增加新的Interceptor  
  28.                                 -->    
  29.                         </list>    
  30.                 </property>    
  31.         </bean>    
  32.   
  33.         <bean class="org.springframework.transaction.interceptor.TransactionAttributeSourceAdvisor">    
  34.           <property name="transactionInterceptor" ref="transactionInterceptor"/>    
  35.         </bean>    
  36.   
  37.         <bean id="userManager" class="some.package.UserManagerImpl" autoWire="byName"/>  
  38.                    
  39. </beans>    

 

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

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

 

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

我把Feiing的transactionAttributesSource改成叻transactionAttributes,并且将DefaultAdvisorAutoProxyCreator改成了BeanNameAutoProxyCreator,我觉得毕竟不是context下的每个bean都需要事务,只要在Service层做AOP就可以叻。

和Robbin一致认为,Feiing的做法非常可取,因为它分离叻XML配置文件关注点

完整版来叻!!
下面的是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就可以叻。

和Robbin一致认为,Feiing的做法非常可取,因为它分离叻XML配置文件关注点

 

受hongliang启发,我现在就用这个方法,但是发现一个Bug。里面代理匹配的名字有*Manager,就是想匹配所有的ManagerObject。但是好像没有注意到,这样配置会把transactionManager也匹配上,然后定义的是find以外的方法都是要事务的。也就说transactionManager执行getTransaction的时候还会要事务,然后就是死循环,造成溢出。。

我解决的办法就是transactionManager改称transactionManagerHibernate。这么做的时候一定要注意名字的问题。别一不小心,把一个不相关的东东给弄进来的。。。

对了,加Acegi的时候有很多*Manager,打算想一个比较好名字匹配。。

我所有的Service层都是*Service,我从来不用*Manager的。。。怪不得我的没问题

简化spring的事务配置

最近的相关主题讨论见:http://www.hibernate.org.cn/viewtopic.php?t=19317在 spring 中, 事务管理一般是通过声明一个 txProxyTemplat...
  • sdlcn
  • sdlcn
  • 2006年04月04日 11:03
  • 1285

Spring配置事务管理和简化事务配置

一.使用TransactionProxyFactoryBean创建事务代理(通常事务代理以Service层为目标bean)          PROPAGATION_...
  • congcongsuiyue
  • congcongsuiyue
  • 2013年11月30日 10:40
  • 1941

Spring注释与简化配置

在Spring 2.5及以后的版本中,提供了注释和命名空间来简化Spring的配置。下面是一些常用配置分享。...
  • WANTAWAY314
  • WANTAWAY314
  • 2016年08月25日 15:38
  • 33603

spring+mybatis事务管理(声明式+编码式)

spring事务 声明式+编码式
  • bing709
  • bing709
  • 2016年03月03日 19:25
  • 1205

Spring 事务简化配置(转)

转载自JavaEye ,原文链接: http://www.javaeye.com/article/19317 在 spring 中...
  • feijianxia
  • feijianxia
  • 2007年08月23日 11:03
  • 883

spring的事务配置详解

接下来我将给大家介绍spring事务配置的两种方式: 1.基于XML的事务配置。2.基于注解方式的事务配置。 前言:在我们详细介绍spring的两种声明式事务管理之前,我们需要先理解这些概念 1)sp...
  • zhaofuwu
  • zhaofuwu
  • 2016年09月04日 15:58
  • 6423

spring boot 配置最简化-小改进===》眼球清净

spring boot 日志配置最简化 spring boot 对日志的配置做了扩展,见文档:http://docs.spring.io/spring-boot/docs/1.5.2.RELE...
  • doctor_who2004
  • doctor_who2004
  • 2017年07月05日 19:21
  • 395

spring mvc aop配置事务的相关配置

一共四个配置文件包括web.xml spring-hibernate.xml
  • u014484873
  • u014484873
  • 2016年04月28日 08:52
  • 2283

spring boot配置mybatis和事务管理

Spring Boot配置Mybatis一、spring boot与mybatis的配置1.首先,spring boot 配置mybatis需要的全部依赖如下: org.springframewor...
  • wohaqiyi
  • wohaqiyi
  • 2017年06月07日 08:37
  • 26340

Spring事务管理——使用XML配置声明式事务

事务简介:事务管理是企业级应用程序开发中必不可少的技术,用来确保数据的完整性和一致性事务就是一系列的动作,它们被当作一个单独的工作单元。这些动作要么全部完成,要么全部不起作用事务的四个关键属性(ACI...
  • Evankaka
  • Evankaka
  • 2015年05月08日 14:54
  • 11859
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Spring 事务简化配置
举报原因:
原因补充:

(最多只允许输入30个字)