spring 事务配置方法

来源:互联网 发布:内蒙广电网络宽带登录 编辑:程序博客网 时间:2024/05/05 18:47

         Spring配置文件中关于事务配置总是由三个组成部分,分别是DataSource、TransactionManager和代理机制这三部分,无论哪种配置方式,一般变化的只是代理机制这部分。 

         DataSource、TransactionManager这两部分只是会根据数据访问方式有所变化,比如使用Hibernate进行数据访问时,DataSource实际为SessionFactory,TransactionManager的实现为HibernateTransactionManager。
         如图:


 根据代理机制的不同,总结了五种Spring事务的配置方式,配置文件如下:

 

 第一种方式:每个Bean都有一个代理

<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>     lt;/beans>  


第二种方式:所有Bean共享一个代理基类

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


第三种:使用拦截器

<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标签配置的拦截器

<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>         lt;/beans>  


全注解:

<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();       }                 } 


文章出处:http://jie2workjava.iteye.com/blog/446250

原创粉丝点击