Spring事务配置的五种方式(收藏)

前段时间对Spring的事务配置做了比较深入的研究,在此之间对Spring的事务配置虽说也配置过,但是一直没有一个清楚的认识。通过这次的学习发觉Spring的事务配置只要把思路理清,还是比较好掌握的。
    总结如下:
    Spring配置文件中关于事务配置总是由三个组成部分,分别是DataSource、TransactionManager和代理机制这三部分,无论哪种配置方式,一般变化的只是代理机制这部分。
    DataSource、TransactionManager这两部分只是会根据数据访问方式有所变化,比如使用Hibernate进行数据访问时,DataSource实际为SessionFactory,TransactionManager的实现为HibernateTransactionManager。
具体如下图:点击查看原图

根据代理机制的不同,总结了五种Spring事务的配置方式,配置文件如下:
    第一种方式:每个Bean都有一个代理

  1. <? xml   version = "1.0"   encoding = "UTF-8" ?>   
  2. < beans   xmlns = "http://www.springframework.org/schema/beans"   
  3.      xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"   
  4.      xmlns:context = "http://www.springframework.org/schema/context"   
  5.      xmlns:aop = "http://www.springframework.org/schema/aop"   
  6.      xsi:schemaLocation ="http://www.springframework.org/schema/beans    
  7.            http://www.springframework.org/schema/beans/spring-beans-2.5.xsd   
  8.            http://www.springframework.org/schema/context   
  9.            http://www.springframework.org/schema/context/spring-context-2.5.xsd   
  10.            http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd" >   
  11.   
  12.      < bean   id = "sessionFactory"      
  13.              class = "org.springframework.orm.hibernate3.LocalSessionFactoryBean" >      
  14.          < property   name = "configLocation"   value = "classpath:hibernate.cfg.xml"   />      
  15.          < property   name = "configurationClass"   value = "org.hibernate.cfg.AnnotationConfiguration"   />   
  16.      </ bean >      
  17.   
  18.      <!-- 定义事务管理器(声明式的事务) -->      
  19.      < bean   id = "transactionManager"   
  20.          class = "org.springframework.orm.hibernate3.HibernateTransactionManager" >   
  21.          < property   name = "sessionFactory"   ref = "sessionFactory"   />   
  22.      </ bean >   
  23.        
  24.      <!-- 配置DAO -->   
  25.      < bean   id = "userDaoTarget"   class = "com.bluesky.spring.dao.UserDaoImpl" >   
  26.          < property   name = "sessionFactory"   ref = "sessionFactory"   />   
  27.      </ bean >   
  28.        
  29.      < bean   id = "userDao"      
  30.          class = "org.springframework.transaction.interceptor.TransactionProxyFactoryBean" >      
  31.             <!-- 配置事务管理器 -->      
  32.             < property   name = "transactionManager"   ref = "transactionManager"   />         
  33.          < property   name = "target"   ref = "userDaoTarget"   />      
  34.           < property   name = "proxyInterfaces"   value = "com.bluesky.spring.dao.GeneratorDao"   />   
  35.          <!-- 配置事务属性 -->      
  36.          < property   name = "transactionAttributes" >      
  37.              < props >      
  38.                  < prop   key = "*" > PROPAGATION_REQUIRED </ prop >   
  39.              </ props >      
  40.          </ property >      
  41.      </ bean >      
  42. </ beans >   
  43. 第二种方式:所有Bean共享一个代理基类
    Xml代码 javaeye.com/blog/630570#" onclick="dp.sh.Toolbar.CopyToClipboard(this);return false;" title="复制代码">复制代码
    1. <? xml   version = "1.0"   encoding = "UTF-8" ?>   
    2. < beans   xmlns = "http://www.springframework.org/schema/beans"   
    3.      xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"   
    4.      xmlns:context = "http://www.springframework.org/schema/context"   
    5.      xmlns:aop = "http://www.springframework.org/schema/aop"   
    6.      xsi:schemaLocation ="http://www.springframework.org/schema/beans    
    7.            http://www.springframework.org/schema/beans/spring-beans-2.5.xsd   
    8.            http://www.springframework.org/schema/context   
    9.            http://www.springframework.org/schema/context/spring-context-2.5.xsd   
    10.            http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd" >   
    11.   
    12.      < bean   id = "sessionFactory"      
    13.              class = "org.springframework.orm.hibernate3.LocalSessionFactoryBean" >      
    14.          < property   name = "configLocation"   value = "classpath:hibernate.cfg.xml"   />      
    15.          < property   name = "configurationClass"   value = "org.hibernate.cfg.AnnotationConfiguration"   />   
    16.      </ bean >      
    17.   
    18.      <!-- 定义事务管理器(声明式的事务) -->      
    19.      < bean   id = "transactionManager"   
    20.          class = "org.springframework.orm.hibernate3.HibernateTransactionManager" >   
    21.          < property   name = "sessionFactory"   ref = "sessionFactory"   />   
    22.      </ bean >   
    23.        
    24.      < bean   id = "transactionBase"      
    25.              class = "org.springframework.transaction.interceptor.TransactionProxyFactoryBean"      
    26.              lazy-init = "true"   abstract = "true" >      
    27.          <!-- 配置事务管理器 -->      
    28.          < property   name = "transactionManager"   ref = "transactionManager"   />      
    29.          <!-- 配置事务属性 -->      
    30.          < property   name = "transactionAttributes" >      
    31.              < props >      
    32.                  < prop   key = "*" > PROPAGATION_REQUIRED </ prop >      
    33.              </ props >      
    34.          </ property >      
    35.      </ bean >        
    36.       
    37.      <!-- 配置DAO -->   
    38.      < bean   id = "userDaoTarget"   class = "com.bluesky.spring.dao.UserDaoImpl" >   
    39.          < property   name = "sessionFactory"   ref = "sessionFactory"   />   
    40.      </ bean >   
    41.        
    42.      < bean   id = "userDao"   parent = "transactionBase"   >      
    43.          < property   name = "target"   ref = "userDaoTarget"   />       
    44.      </ bean >   
    45. </ beans >   


    第三种方式:使用拦截器

    Xml代码 复制代码
    1. <? xml   version = "1.0"   encoding = "UTF-8" ?>   
    2. < beans   xmlns = "http://www.springframework.org/schema/beans"   
    3.      xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"   
    4.      xmlns:context = "http://www.springframework.org/schema/context"   
    5.      xmlns:aop = "http://www.springframework.org/schema/aop"   
    6.      xsi:schemaLocation ="http://www.springframework.org/schema/beans    
    7.            http://www.springframework.org/schema/beans/spring-beans-2.5.xsd   
    8.            http://www.springframework.org/schema/context   
    9.            http://www.springframework.org/schema/context/spring-context-2.5.xsd   
    10.            http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd" >   
    11.   
    12.      < bean   id = "sessionFactory"      
    13.              class = "org.springframework.orm.hibernate3.LocalSessionFactoryBean" >      
    14.          < property   name = "configLocation"   value = "classpath:hibernate.cfg.xml"   />      
    15.          < property   name = "configurationClass"   value = "org.hibernate.cfg.AnnotationConfiguration"   />   
    16.      </ bean >      
    17.   
    18.      <!-- 定义事务管理器(声明式的事务) -->      
    19.      < bean   id = "transactionManager"   
    20.          class = "org.springframework.orm.hibernate3.HibernateTransactionManager" >   
    21.          < property   name = "sessionFactory"   ref = "sessionFactory"   />   
    22.      </ bean >     
    23.       
    24.      < bean   id = "transactionInterceptor"      
    25.          class = "org.springframework.transaction.interceptor.TransactionInterceptor" >      
    26.          < property   name = "transactionManager"   ref = "transactionManager"   />      
    27.          <!-- 配置事务属性 -->      
    28.          < property   name = "transactionAttributes" >      
    29.              < props >      
    30.                  < prop   key = "*" > PROPAGATION_REQUIRED </ prop >      
    31.              </ props >      
    32.          </ property >      
    33.      </ bean >   
    34.          
    35.      < bean   class = "org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator" >      
    36.          < property   name = "beanNames" >      
    37.              < list >      
    38.                  < value > *Dao </ value >   
    39.              </ list >      
    40.          </ property >      
    41.          < property   name = "interceptorNames" >      
    42.              < list >      
    43.                  < value > transactionInterceptor </ value >      
    44.              </ list >      
    45.          </ property >      
    46.      </ bean >      
    47.      
    48.      <!-- 配置DAO -->   
    49.      < bean   id = "userDao"   class = "com.bluesky.spring.dao.UserDaoImpl" >   
    50.          < property   name = "sessionFactory"   ref = "sessionFactory"   />   
    51.      </ bean >   
    52. </ beans >   


    第四种方式:使用tx标签配置的拦截器
    Xml代码 复制代码
    1. <? xml   version = "1.0"   encoding = "UTF-8" ?>   
    2. < beans   xmlns = "http://www.springframework.org/schema/beans"   
    3.      xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"   
    4.      xmlns:context = "http://www.springframework.org/schema/context"   
    5.      xmlns:aop = "http://www.springframework.org/schema/aop"   
    6.      xmlns:tx = "http://www.springframework.org/schema/tx"   
    7.      xsi:schemaLocation ="http://www.springframework.org/schema/beans    
    8.            http://www.springframework.org/schema/beans/spring-beans-2.5.xsd   
    9.            http://www.springframework.org/schema/context   
    10.            http://www.springframework.org/schema/context/spring-context-2.5.xsd   
    11.            http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd   
    12.            http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd" >   
    13.   
    14.      < context:annotation-config   />   
    15.      < context:component-scan   base-package = "com.bluesky"   />   
    16.   
    17.      < bean   id = "sessionFactory"      
    18.              class = "org.springframework.orm.hibernate3.LocalSessionFactoryBean" >      
    19.          < property   name = "configLocation"   value = "classpath:hibernate.cfg.xml"   />      
    20.          < property   name = "configurationClass"   value = "org.hibernate.cfg.AnnotationConfiguration"   />   
    21.      </ bean >      
    22.   
    23.      <!-- 定义事务管理器(声明式的事务) -->      
    24.      < bean   id = "transactionManager"   
    25.          class = "org.springframework.orm.hibernate3.HibernateTransactionManager" >   
    26.          < property   name = "sessionFactory"   ref = "sessionFactory"   />   
    27.      </ bean >   
    28.   
    29.      < tx:advice   id = "txAdvice"   transaction-manager = "transactionManager" >   
    30.          < tx:attributes >   
    31.              < tx:method   name = "*"   propagation = "REQUIRED"   />   
    32.          </ tx:attributes >   
    33.      </ tx:advice >   
    34.        
    35.      < aop:config >   
    36.          < aop:pointcut   id = "interceptorPointCuts"   
    37.              expression = "execution(* com.bluesky.spring.dao.*.*(..))"   />   
    38.          < aop:advisor   advice-ref = "txAdvice"   
    39.              pointcut-ref = "interceptorPointCuts"   />            
    40.      </ aop:config >          
    41. </ beans >   


    第五种方式:全注解
    Xml代码 复制代码
    1. <? xml   version = "1.0"   encoding = "UTF-8" ?>   
    2. < beans   xmlns = "http://www.springframework.org/schema/beans"   
    3.      xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"   
    4.      xmlns:context = "http://www.springframework.org/schema/context"   
    5.      xmlns:aop = "http://www.springframework.org/schema/aop"   
    6.      xmlns:tx = "http://www.springframework.org/schema/tx"   
    7.      xsi:schemaLocation ="http://www.springframework.org/schema/beans    
    8.            http://www.springframework.org/schema/beans/spring-beans-2.5.xsd   
    9.            http://www.springframework.org/schema/context   
    10.            http://www.springframework.org/schema/context/spring-context-2.5.xsd   
    11.            http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd   
    12.            http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd" >   
    13.   
    14.      < context:annotation-config   />   
    15.      < context:component-scan   base-package = "com.bluesky"   />   
    16.   
    17.      < tx:annotation-driven   transaction-manager = "transactionManager" />   
    18.   
    19.      < bean   id = "sessionFactory"      
    20.              class = "org.springframework.orm.hibernate3.LocalSessionFactoryBean" >      
    21.          < property   name = "configLocation"   value = "classpath:hibernate.cfg.xml"   />      
    22.          < property   name = "configurationClass"   value = "org.hibernate.cfg.AnnotationConfiguration"   />   
    23.      </ bean >      
    24.   
    25.      <!-- 定义事务管理器(声明式的事务) -->      
    26.      < bean   id = "transactionManager"   
    27.          class = "org.springframework.orm.hibernate3.HibernateTransactionManager" >   
    28.          < property   name = "sessionFactory"   ref = "sessionFactory"   />   
    29.      </ bean >   
    30.        
    31. </ beans >   


    此时在DAO上需加上@Transactional注解,如下:
    Java代码 复制代码
    1. package  com.bluesky.spring.dao;   
    2.   
    3. import  java.util.List;   
    4.   
    5. import  org.hibernate.SessionFactory;   
    6. import  org.springframework.beans.factory.annotation.Autowired;   
    7. import  org.springframework.orm.hibernate3.support.HibernateDaoSupport;   
    8. import  org.springframework.stereotype.Component;   
    9.   
    10. import  com.bluesky.spring.domain.User;   
    11.   
    12. @Transactional   
    13. @Component ( "userDao" )   
    14. public   class  UserDaoImpl  extends  HibernateDaoSupport  implements  UserDao {   
    15.   
    16.      public  List<User> listUsers() {   
    17.          return   this .getSession().createQuery( "from User" ).list();   
    18.     }   
    19.        
    20.        
    21. }  

原文:http://yonglin4605.javaeye.com/blog/630570

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

«    2025年11月    »
12
3456789
10111213141516
17181920212223
24252627282930
搜索
标签列表
网站分类
最新留言
    文章归档
    友情链接

    Powered By Z-BlogPHP 1.7.4

    Copyright Your WebSite.Some Rights Reserved.闽ICP备11018667号-2