babayao  
          日歷
          <2025年6月>
          25262728293031
          1234567
          891011121314
          15161718192021
          22232425262728
          293012345
          統計
          • 隨筆 - 0
          • 文章 - 4
          • 評論 - 0
          • 引用 - 0

          導航

          留言簿

          文章檔案

          搜索

          •  

          最新評論

           

             
          前段時間對Spring的事務配置做了比較深入的研究,在此之間對Spring的事務配置雖說也配置過,但是一直沒有一個清楚的認識。通過這次的學習發覺Spring的事務配置只要把思路理清,還是比較好掌握的。


              總結如下:


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


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


              具體如下圖:


          Spring事務配置 (2)


              根據代理機制的不同,總結了五種Spring事務的配置方式,配置文件如下:


              第一種方式:每個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> 


             
          <!-- 定義事務管理器(聲明式的事務) --> 

             
          <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"> 

                    
          <!-- 配置事務管理器 --> 

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

                 
          <property name="target"
          ref
          ="userDaoTarget" /> 

                  
          <property name="proxyInterfaces" value="com.bluesky.spring.dao.GeneratorDao" />
                 
          <!--
          配置事務屬性
          --> 
                 
          <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> 


             
          <!-- 定義事務管理器(聲明式的事務) --> 

             
          <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"> 

                 
          <!-- 配置事務管理器 --> 

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

                 
          <!-- 配置事務屬性 --> 

                 
          <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> 


             
          <!-- 定義事務管理器(聲明式的事務) --> 

             
          <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" /> 

                 
          <!-- 配置事務屬性 --> 

                 
          <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標簽配置的攔截器


          <?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> 


             
          <!-- 定義事務管理器(聲明式的事務) --> 

             
          <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> 


             
          <!-- 定義事務管理器(聲明式的事務) --> 

             
          <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 2012-11-01 13:50 巴巴搖 閱讀(121) 評論(0)  編輯  收藏

          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
           
          Copyright © 巴巴搖 Powered by: 博客園 模板提供:滬江博客
          主站蜘蛛池模板: 津市市| 旅游| 任丘市| 乐昌市| 武隆县| 天长市| 洞口县| 北川| 鸡泽县| 天台县| 安陆市| 望谟县| 怀集县| 南安市| 大邑县| 揭西县| 集贤县| 和田市| 姚安县| 沈丘县| 新野县| 枣强县| 临洮县| 镇坪县| 许昌县| 沁阳市| 乾安县| 谢通门县| 武宣县| 敦煌市| 鄢陵县| 霍城县| 南京市| 海城市| 揭西县| 盐津县| 镇远县| 乐至县| 施秉县| 富民县| 高要市|