`
raymond2006k
  • 浏览: 290669 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

Spring 事务配置的几种方式及应用举例

阅读更多

我以前在项目中的实践选择过程,最终选择第三种方案,几种都写出来与大家分享。 大家有其他好的方式,也欢迎分享。

环境:JDK 1.4.x , Hibernate 3.1, Spring 2.0.6, 开发模式: Service + DAO

1. 代理工厂Bean事务管理( *ProxyFactoryBean) + Service + DAO配置

    我刚开始看Spring时用的书是林信良的《Spring技术手册》,书中对声明式事务主要采用 TransactionProxyFactoryBean,业务Bean如 Service或BO类继承它来进行事务控制。代理工厂Bean( *ProxyFactoryBean)这一类Spring提供的工厂类,可将一个 bean 进行委托代理,从而达到控制方法行为的目的。

   此类事务配置一般如下(因为我们未采用这种方式,就以书上的JDBC datasource举例说明。不同公司采用的格式可能有所不同):

<!-- 前面的 dataSource等配置略 ........ -->

<!-- 事务管理器 -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource">
<ref local="dataSource" />
</property>
</bean>

<!-- 事务模板 -->
<bean id="baseTransactionProxy"
class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"
abstract="true">
<property name="transactionManager" ref="transactionManager" />
<property name="transactionAttributes">
<props>
<prop key="*">PROPAGATION_REQUIRED</prop>   <!-- 本文仅简单用一种方式说明。所有方法起事务,可以修改以精细和区别性控制事务 -->
</props>
</property>
</bean>


<!-- 业务对象 -->
<bean id="authService" parent="baseTransactionProxy">
<property name="target">
<bean class="com.xxxx.cms.service.AuthorityService">
<property name="authDao" ref="authDao" />
</bean>
</property>
</bean>
<bean id="departmentService" parent="baseTransactionProxy">
<property name="target">
<bean class="com.xxxx.cms.service.pojo.DepartmentService">
<property name="departmentDao" ref="departmentDao" />
</bean>
</property>
</bean>
<!-- 数据访问对象 -->
<bean id="authDao" class="com.xxxx.cms.dao.jdbc.AuthorityDao">
<property name="dataSource" ref="dataSource" />
</bean>
<bean id="departmentDao" class="com.xxxx.cms.dao.jdbc.DepartmentDao">
<property name="dataSource" ref="dataSource" />
</bean>


  这种代理工厂Bean的事务管理一般都要求将 Service 的 bean 配置为 class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean" , 上面的例子使用了 parent="baseTransactionProxy" 继承机制简化了原书中的配置。

   代码中通过以下方式使用:
 

  

AuthService authService = (AuthService) context.getBean("authService"); 
    boolean b = authService.hasPermission("TOKEN_XXXXX"); 

 

2. 自动代理事务(*AutoProxyCreator) + Service + DAO配置

    *AutoProxyCreator这一类东东,能够自动为Spring容器中的bean进行 AOP 代理,配置起来能适当简化。一般需要用 BeanNameAutoProxyCreator 来配置对那些类进行自动代理, MethodPointcutAdvisor 来配置对哪些方法进行代理。

    这种声明式事务配置采用拦截器(Interceptor)或通知器(Advisor) 进行事务控制,这里使用了Spring提供的 TransactionInterceptor 来管理事务。 (本质上 ProxyFactoryBean 也要生成被代理对象的字节码,不过每个类型的ProxyFactoryBean 只能固定处理一个 Aspect,不算真正的AOP)。

    以下配置对 *Service 的所有方法进行事务控制。   

<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"> 
<property name="transactionManager"> 
<ref local="transactionManager"/> 
</property> 
<property name="transactionAttributes"> 
<props> 
<prop key="*">PROPAGATION_REQUIRED</prop> <!-- 本文仅简单用一种方式说明。所有方法起事务,还可以精细控制事务 --> 
</props> 
</property> 
</bean> 

<!-- 配置要拦截哪些方法 --> 
<bean id="trasactionMethodPointcutAdvisor" class="org.springframework.aop.support.NameMatchMethodPointcutAdvisor"> 
<property name="mappedNames"> 
<list> 
<value>*</value> <!-- 所有方法 --> 
</list> 
</property> 
<property name="advice"> 
<ref local="transactionInterceptor" /> 
</property> 
</bean> 

<!-- 配置要拦截哪些类,并使用那些拦截器 --> 
<bean id="ServiceAutoProxyCreator" class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator"> 
<property name="proxyTargetClass" value="true"></property> 
<property name="beanNames"> 
<list> 
<value>*Service</value> 
</list> 
</property> 
<property name="interceptorNames"> 
<list>  
<!-- 头三个是我们项目中用的其他 Advisor,这里展示了添加拦截器进行aspect控制的灵活性。省略他们的配置 --> 
<value>monitorMethodPointcutAdvisor</value> 
<value>asynmonitorMethodPointcutAdvisor</value> 
<value>businessLogMethodPointcutAdvisor</value> 
<value>trasactionMethodPointcutAdvisor</value> <!-- 事务拦截器, 直接配成 transactionInterceptor 去掉 trasactionMethodPointcutAdvisor bean 也可以, --> 
</list> 
</property> 
</bean> 

 
Service,DAO的配置方式稍微改变一下, Service不再作为ProxyFactoryBean的 target属性,而是一个顶级 bean,这样 Service bean看起来就更单纯一些。 

<!-- 业务对象 --> 
<bean class="com.xxxx.cms.service.AuthorityService"> 
<property name="authDao" ref="authDao" /> 
</bean> 
<bean class="com.xxxx.cms.service.pojo.DepartmentService"> 
<property name="departmentDao" ref="departmentDao" /> 
</bean> 

<!-- 数据访问对象 --> 
<bean id="authDao" class="com.xxxx.cms.dao.jdbc.AuthorityDao"> 
<property name="dataSource" ref="dataSource" /> 
</bean> 
<bean id="departmentDao" class="com.xxxx.cms.dao.jdbc.DepartmentDao"> 
<property name="dataSource" ref="dataSource" /> 
</bean> 

 
    代码中的使用方式不变,同 1 小节。

3.  自动代理 +  Service DAO零配置

    这种是我们项目中运用的方式,transactionInterceptor,trasactionMethodPointcutAdvisor ,ServiceAutoProxyCreator 三个 bean的配置不变。
    Service,DAO 无需配置, 其原理参见我另一篇文章:

我的开发经验分享(一)-Spring业务bean零配置


    代码中的使用方式不同,使用 ServiceFactory 直接创建bean,代码如下: 
    

   

AuthService authService = (AuthService)ServiceFactory.createBean(AuthService.class); 
    boolean b = authService.hasPermission("TOKEN_XXXXX"); 

 
    ServiceFactory 内部会自动注册未注册的 bean, 并和Spring 容器和已配置的拦截器关联。
 

4. Annotation 声明事务

    如果是 JDK 1.5下,Spring 也支持 注释声明式事务,类似于如下代码(附部分片段):

@Transactional 
public class PersonServiceImpl implements PersonService 
{ private EntityManager em; 

   @PersistenceContext 
  public void setEntityManager(EntityManager em) 
  { this.em = em; } 

 
   结合 <tx:annotation-driven/>配置。


它实际是将 xml 中的

<property name="transactionAttributes"> 
<props> 
<prop key="*">PROPAGATION_REQUIRED</prop> <!-- 所有方法起事务,还可以精细控制事务 --> 
</props> 
</property> 

 
转移到了Java代码中,本质上是一样的,两种方式都能进行精细事务管理。不过个人不太偏好这种方式,因为xml更便于集中管理,修改后无需编译。

 

1.5下Spring还用哪种更简化的事务管理方式,鄙人不是太熟,欢迎大家分享。

 

分享到:
评论
1 楼 raymond2006k 2008-09-26  
沙发自己坐,哈哈。

相关推荐

    Spring面试题含答案.pdf

    25. 解释 Spring 支持的几种 bean 的作用域 26. Spring 框架中的单例 bean 是线程安全的吗? 27. 解释 Spring 框架中 bean 的生命周期 28. 哪些是重要的 bean 生命周期方法? 你能重载它们吗? 29. 什么是 Spring ...

    Spring基础与快速入门

    Spring作为实现J2EE的一个全方位应用程序框架,为我们开发企业级应用提供了一个健壮、高效的解决方案。所谓全方位,不得不说以下几个特点: 1 非侵入式:对于写代码从来不考虑复用和移植的程序员来说,这一点根本...

    springmybatis

    请注意,这种方式是用SqlSession实例来直接执行已映射的SQL语句: session.selectOne("com.yihaomen.mybatis.models.UserMapper.selectUserByID", 1) 其实还有更简单的方法,而且是更好的方法,使用合理描述参数和...

    ssh(structs,spring,hibernate)框架中的上传下载

    Spring针对几个著名的Web服务器的数据源提供了相应的JDBC抽取器:  •WebLogic:WebLogicNativeJdbcExtractor  •WebSphere:WebSphereNativeJdbcExtractor  •JBoss:JBossNativeJdbcExtractor  在定义了JDBC...

    Java求职面试宝典各大公司常考知识点

    Struts+Hibernate+...4.7. transaction有那几种实现 21 4 综合部分 21 4.1. Hibernate和spring中常出现的几个异常 21 4.2. Hibernate与jdbc的联系 22 4.3. Hibernate与spring的联系 22 4.4. 项目中为什么使用SSH 23

    千方百计笔试题大全

    70、多线程有几种实现方法,都是什么?同步有几种实现方法,都是什么? 17 71、启动一个线程是用run()还是start()? 17 72、当一个线程进入一个对象的一个synchronized方法后,其它线程是否可进入此对象的其它方法? 18 73...

    java面试宝典

    70、多线程有几种实现方法,都是什么?同步有几种实现方法,都是什么? 17 71、启动一个线程是用run()还是start()? 17 72、当一个线程进入一个对象的一个synchronized方法后,其它线程是否可进入此对象的其它方法? 18 73...

    java面试题

    73.8. transaction有那几种实现(事务处理)(Spring) 79 73.9. Spring IoC 79 73.10. Spring AOP面向方面编程 82 74. 项目中为什么使用SSH 85 75. Spring在SSH中的作用 86 76. weblogic 86 76.1. 如何给weblogic指定...

    JAVA上百实例源码以及开源项目源代码

     Java zip压缩包查看程序,应用弹出文件选择框,选择ZIP格式的压缩文件,可以像Winrar软件一样查看压缩文件内部的文件及文件夹,源码截图如上所示。 Java 数字签名、数字证书生成源码 2个目标文件 摘要:JAVA源码,...

    Java语言基础下载

    目录 第一章:Java开始 1 学习目标 1 Java历史 2 Java技术概述 3 Java技术的优点 3 Java虚拟机 4 类加载器 6 ...Spring事务管理 718 Spring与Struts整合 719 Spring与Hibernate整合 721 独立实践 724

    J2EE开发全程实录(JAVA项目开发)

    9.3.9 改造Spring事务配置方式... 172 9.4 会话服务的生命周期管理... 175 9.5 IValueObject接口... 178 第10章 层间数据传输.... 180 10.1 什么是DTO.. 180 10.2 域DTO.. 181 10.3 定制DTO.. 186 10.4 数据传送哈希...

    JAVA上百实例源码以及开源项目

     Java zip压缩包查看程序,应用弹出文件选择框,选择ZIP格式的压缩文件,可以像Winrar软件一样查看压缩文件内部的文件及文件夹,源码截图如上所示。 Java 数字签名、数字证书生成源码 2个目标文件 摘要:JAVA源码,...

    基于J2EE框架的个人博客系统项目毕业设计论文(源码和论文)

    由于J2EE的开源的框架中提供了MVC模式实现框架Struts、对象关系模型中的Hibernate 的框架及拥有事务管理和依赖注入的Spring。利用现存框架可以更快开发系统。所以选择Java技术作为blog 的开发工具。 为了增加系统的...

    java基础题 很全面

    解析XML文档有哪几种方式? 12 49. 你在项目中用到了xml技术的哪些方面?如何实现的? 12 50. 简述synchronized和java.util.concurrent.locks.Lock的异同 ? 13 51. 排序都有哪几种方法?请列举。用JAVA实现一个快速排序...

    Java面试宝典2010版

    10、在weblogic管理制台中对一个应用域(或者说是一个网站,Domain)进行jms及ejb或连接池等相关信息进行配置后,实际保存在什么文件中? 11、说说weblogic中一个Domain的缺省目录结构?比如要将一个简单的helloWorld.jsp...

    最新Java面试宝典pdf版

    解析XML文档有哪几种方式? 117 七. 流行的框架与新技术 117 1、谈谈你对Struts的理解。 117 2、谈谈你对Hibernate的理解。 118 3、AOP的作用。 118 4、你对Spring的理解。 118 5、谈谈Struts中的Action servlet。 ...

    Java面试笔试资料大全

    解析XML文档有哪几种方式? 117 七. 流行的框架与新技术 117 1、谈谈你对Struts的理解。 117 2、谈谈你对Hibernate的理解。 118 3、AOP的作用。 118 4、你对Spring的理解。 118 5、谈谈Struts中的Action servlet。 ...

Global site tag (gtag.js) - Google Analytics