paulwong

          My Links

          Blog Stats

          常用鏈接

          留言簿(67)

          隨筆分類(1391)

          隨筆檔案(1149)

          文章分類(7)

          文章檔案(10)

          相冊

          收藏夾(2)

          AI

          Develop

          E-BOOK

          Other

          養(yǎng)生

          微服務(wù)

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          60天內(nèi)閱讀排行

          Spring事務(wù)配置的五種方式

          Spring配置文件中關(guān)于事務(wù)配置總是由三個組成部分,分別是DataSource、TransactionManager和代理機制這三部分,無論哪種配置方式,一般變化的只是代理機制這部分。

          DataSource、TransactionManager這兩部分只是會根據(jù)數(shù)據(jù)訪問方式有所變化,比如使用Hibernate進行數(shù)據(jù)訪問時,DataSource實際為SessionFactory,TransactionManager的實現(xiàn)為HibernateTransactionManager。

          具體如下圖:

          根據(jù)代理機制的不同,總結(jié)了五種Spring事務(wù)的配置方式,配置文件如下:

          第一種方式:每個Bean都有一個代理
          <? xml version="1.0" encoding="UTF-8" ?> 
          < beans xmlns ="http://www.springframework.org/schema/beans" 
              xmlns:xsi 
          ="http://www.w3.org/2001/XMLSchema-instance" 
              xmlns:context 
          ="http://www.springframework.org/schema/context" 
              xmlns:aop 
          ="http://www.springframework.org/schema/aop" 
              xsi:schemaLocation 
          ="http://www.springframework.org/schema/beans 
                     http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
                     http://www.springframework.org/schema/context
                     http://www.springframework.org/schema/context/spring-context-2.5.xsd
                     http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd"
           > 

              
          < bean id ="sessionFactory"   
                      class 
          ="org.springframework.orm.hibernate3.LocalSessionFactoryBean" >   
                  
          < property name ="configLocation" value ="classpath:hibernate.cfg.xml"   />   
                  
          < property name ="configurationClass" value ="org.hibernate.cfg.AnnotationConfiguration"   /> 
              
          </ bean >   

              
          <!-- 定義事務(wù)管理器(聲明式的事務(wù)) -->   
              
          < bean id ="transactionManager" 
                  class 
          ="org.springframework.orm.hibernate3.HibernateTransactionManager" > 
                  
          < property name ="sessionFactory" ref ="sessionFactory"   /> 
              
          </ bean > 
              
              
          <!-- 配置DAO --> 
              
          < bean id ="userDaoTarget" class ="com.bluesky.spring.dao.UserDaoImpl" > 
                  
          < property name ="sessionFactory" ref ="sessionFactory"   /> 
              
          </ bean > 
              
              
          < bean id ="userDao"   
                  class 
          ="org.springframework.transaction.interceptor.TransactionProxyFactoryBean" >   
                     
          <!-- 配置事務(wù)管理器 -->   
                     
          < property name ="transactionManager" ref ="transactionManager"   />      
                  
          < property name ="target" ref ="userDaoTarget"   />   
                   
          < property name ="proxyInterfaces" value ="com.bluesky.spring.dao.GeneratorDao"   /> 
                  
          <!-- 配置事務(wù)屬性 -->   
                  
          < property name ="transactionAttributes" >   
                      
          < props >   
                          
          < prop key ="*" > PROPAGATION_REQUIRED </ prop > 
                      
          </ props >   
                  
          </ property >   
              
          </ bean >   
          </ beans > 


          第二種方式:所有Bean共享一個代理基類

          <? xml version="1.0" encoding="UTF-8" ?>
          < beans xmlns ="http://www.springframework.org/schema/beans"
          xmlns:xsi
          ="http://www.w3.org/2001/XMLSchema-instance"
          xmlns:context
          ="http://www.springframework.org/schema/context"
          xmlns:aop
          ="http://www.springframework.org/schema/aop"
          xsi:schemaLocation
          ="http://www.springframework.org/schema/beans
          http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
          http://www.springframework.org/schema/context
          http://www.springframework.org/schema/context/spring-context-2.5.xsd
          http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd"
          >

          < bean id ="sessionFactory"
          class
          ="org.springframework.orm.hibernate3.LocalSessionFactoryBean" >
          < property name ="configLocation" value ="classpath:hibernate.cfg.xml" />
          < property name ="configurationClass" value ="org.hibernate.cfg.AnnotationConfiguration" />
          </ bean >

          <!-- 定義事務(wù)管理器(聲明式的事務(wù)) -->
          < bean id ="transactionManager"
          class
          ="org.springframework.orm.hibernate3.HibernateTransactionManager" >
          < property name ="sessionFactory" ref ="sessionFactory" />
          </ bean >

          < bean id ="transactionBase"
          class
          ="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"
          lazy-init
          ="true" abstract ="true" >
          <!-- 配置事務(wù)管理器 -->
          < property name ="transactionManager" ref ="transactionManager" />
          <!-- 配置事務(wù)屬性 -->
          < property name ="transactionAttributes" >
          < props >
          < prop key ="*" > PROPAGATION_REQUIRED </ prop >
          </ props >
          </ property >
          </ bean >

          <!-- 配置DAO -->
          < bean id ="userDaoTarget" class ="com.bluesky.spring.dao.UserDaoImpl" >
          < property name ="sessionFactory" ref ="sessionFactory" />
          </ bean >

          < bean id ="userDao" parent ="transactionBase" >
          < property name ="target" ref ="userDaoTarget" />
          </ bean >
          </ beans >

          第三種方式:使用攔截器

          <? xml version="1.0" encoding="UTF-8" ?>
          < beans xmlns ="http://www.springframework.org/schema/beans"
          xmlns:xsi
          ="http://www.w3.org/2001/XMLSchema-instance"
          xmlns:context
          ="http://www.springframework.org/schema/context"
          xmlns:aop
          ="http://www.springframework.org/schema/aop"
          xsi:schemaLocation
          ="http://www.springframework.org/schema/beans
          http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
          http://www.springframework.org/schema/context
          http://www.springframework.org/schema/context/spring-context-2.5.xsd
          http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd"
          >

          < bean id ="sessionFactory"
          class
          ="org.springframework.orm.hibernate3.LocalSessionFactoryBean" >
          < property name ="configLocation" value ="classpath:hibernate.cfg.xml" />
          < property name ="configurationClass" value ="org.hibernate.cfg.AnnotationConfiguration" />
          </ bean >

          <!-- 定義事務(wù)管理器(聲明式的事務(wù)) -->
          < bean id ="transactionManager"
          class
          ="org.springframework.orm.hibernate3.HibernateTransactionManager" >
          < property name ="sessionFactory" ref ="sessionFactory" />
          </ bean >

          < bean id ="transactionInterceptor"
          class
          ="org.springframework.transaction.interceptor.TransactionInterceptor" >
          < property name ="transactionManager" ref ="transactionManager" />
          <!-- 配置事務(wù)屬性 -->
          < property name ="transactionAttributes" >
          < props >
          < prop key ="*" > PROPAGATION_REQUIRED </ prop >
          </ props >
          </ property >
          </ bean >

          < bean class ="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator" >
          < property name ="beanNames" >
          < list >
          < value > *Dao </ value >
          </ list >
          </ property >
          < property name ="interceptorNames" >
          < list >
          < value > transactionInterceptor </ value >
          </ list >
          </ property >
          </ bean >

          <!-- 配置DAO -->
          < bean id ="userDao" class ="com.bluesky.spring.dao.UserDaoImpl" >
          < property name ="sessionFactory" ref ="sessionFactory" />
          </ bean >
          </ beans >

          第四種方式:使用tx標(biāo)簽配置的攔截器
          <? xml version="1.0" encoding="UTF-8" ?>
          < beans xmlns ="http://www.springframework.org/schema/beans"
          xmlns:xsi
          ="http://www.w3.org/2001/XMLSchema-instance"
          xmlns:context
          ="http://www.springframework.org/schema/context"
          xmlns:aop
          ="http://www.springframework.org/schema/aop"
          xmlns:tx
          ="http://www.springframework.org/schema/tx"
          xsi:schemaLocation
          ="http://www.springframework.org/schema/beans
          http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
          http://www.springframework.org/schema/context
          http://www.springframework.org/schema/context/spring-context-2.5.xsd
          http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd
          http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd"
          >

          < context:annotation-config />
          < context:component-scan base-package ="com.bluesky" />

          < bean id ="sessionFactory"
          class
          ="org.springframework.orm.hibernate3.LocalSessionFactoryBean" >
          < property name ="configLocation" value ="classpath:hibernate.cfg.xml" />
          < property name ="configurationClass" value ="org.hibernate.cfg.AnnotationConfiguration" />
          </ bean >

          <!-- 定義事務(wù)管理器(聲明式的事務(wù)) -->
          < bean id ="transactionManager"
          class
          ="org.springframework.orm.hibernate3.HibernateTransactionManager" >
          < property name ="sessionFactory" ref ="sessionFactory" />
          </ bean >

          < tx:advice id ="txAdvice" transaction-manager ="transactionManager" >
          < tx:attributes >
          < tx:method name ="*" propagation ="REQUIRED" />
          </ tx:attributes >
          </ tx:advice >

          < aop:config >
          < aop:pointcut id ="interceptorPointCuts"
          expression
          ="execution(* com.bluesky.spring.dao.*.*(..))" />
          < aop:advisor advice-ref ="txAdvice"
          pointcut-ref
          ="interceptorPointCuts" />
          </ aop:config >
          </ beans >

          第五種方式:全注解

          <? xml version="1.0" encoding="UTF-8" ?>
          < beans xmlns ="http://www.springframework.org/schema/beans"
          xmlns:xsi
          ="http://www.w3.org/2001/XMLSchema-instance"
          xmlns:context
          ="http://www.springframework.org/schema/context"
          xmlns:aop
          ="http://www.springframework.org/schema/aop"
          xmlns:tx
          ="http://www.springframework.org/schema/tx"
          xsi:schemaLocation
          ="http://www.springframework.org/schema/beans
          http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
          http://www.springframework.org/schema/context
          http://www.springframework.org/schema/context/spring-context-2.5.xsd
          http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd
          http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd"
          >

          < context:annotation-config />
          < context:component-scan base-package ="com.bluesky" />

          < tx:annotation-driven transaction-manager ="transactionManager" />

          < bean id ="sessionFactory"
          class
          ="org.springframework.orm.hibernate3.LocalSessionFactoryBean" >
          < property name ="configLocation" value ="classpath:hibernate.cfg.xml" />
          < property name ="configurationClass" value ="org.hibernate.cfg.AnnotationConfiguration" />
          </ bean >

          <!-- 定義事務(wù)管理器(聲明式的事務(wù)) -->
          < bean id ="transactionManager"
          class
          ="org.springframework.orm.hibernate3.HibernateTransactionManager" >
          < property name ="sessionFactory" ref ="sessionFactory" />
          </ bean >

          </ beans >


          此時在DAO上需加上@Transactional注解,如下:

          package com.bluesky.spring.dao;

          import java.util.List;

          import org.hibernate.SessionFactory;
          import org.springframework.beans.factory.annotation.Autowired;
          import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
          import org.springframework.stereotype.Component;

          import com.bluesky.spring.domain.User;

          @Transactional
          @Component(
          " userDao " )
          public class UserDaoImpl extends HibernateDaoSupport implements UserDao {

          public List < User > listUsers() {
          return this .getSession().createQuery( " from User " ).list();
          }



          }

          posted on 2011-11-08 23:14 paulwong 閱讀(504) 評論(0)  編輯  收藏 所屬分類: SPRING

          主站蜘蛛池模板: 阳城县| 关岭| 边坝县| 凤庆县| 云霄县| 新巴尔虎右旗| 桑植县| 姜堰市| 伊宁市| 喀喇沁旗| 彰化市| 鄂托克旗| 南昌县| 紫金县| 涟源市| 商水县| 松江区| 阜平县| 班玛县| 宁明县| 汝城县| 深州市| 宜宾县| 微博| 丽江市| 昌乐县| 江源县| 隆昌县| 建湖县| 惠州市| 舟山市| 自治县| 农安县| 舞阳县| 游戏| 余姚市| 广昌县| 遂溪县| 香格里拉县| 石楼县| 句容市|