Spring事务配置的五种方式

    技术2022-05-20  57

    Spring事务配置的五种方式

        前段时间对Spring的事务配置做了比较深入的研究,在此之间对Spring的事务配置虽说也配置过,但是一直没有一个清楚的认识。通过这次的学习发觉Spring的事务配置只要把思路理清,还是比较好掌握的。

        总结如下:

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

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

        具体如下图:

     

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

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

    <?xml version="1.0" encoding="UTF-8"?><beansxmlns="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">   <beanid="sessionFactory"              class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">         <propertyname="configLocation" value="classpath:hibernate.cfg.xml" />         <propertyname="configurationClass" value="org.hibernate.cfg.AnnotationConfiguration" />   </bean>     <!-- 定义事务管理器(声明式的事务)-->     <beanid="transactionManager"        class="org.springframework.orm.hibernate3.HibernateTransactionManager">       <propertyname="sessionFactory" ref="sessionFactory" />   </bean>       <!-- 配置DAO-->   <beanid="userDaoTarget" class="com.bluesky.spring.dao.UserDaoImpl">       <propertyname="sessionFactory" ref="sessionFactory" />   </bean>       <beanid="userDao"          class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">            <!-- 配置事务管理器-->            <propertyname="transactionManager" ref="transactionManager" />            <propertyname="target" ref="userDaoTarget" />          <propertyname="proxyInterfaces" value="com.bluesky.spring.dao.GeneratorDao" />       <!-- 配置事务属性-->         <propertyname="transactionAttributes">             <props>                 <propkey="*">PROPAGATION_REQUIRED</prop>           </props>         </property>     </bean> </beans>

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

    <?xml version="1.0" encoding="UTF-8"?><beansxmlns="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">   <beanid="sessionFactory"              class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">         <propertyname="configLocation" value="classpath:hibernate.cfg.xml" />         <propertyname="configurationClass" value="org.hibernate.cfg.AnnotationConfiguration" />   </bean>     <!-- 定义事务管理器(声明式的事务)-->     <beanid="transactionManager"        class="org.springframework.orm.hibernate3.HibernateTransactionManager">       <propertyname="sessionFactory" ref="sessionFactory" />   </bean>       <beanid="transactionBase"              class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"              lazy-init="true" abstract="true">         <!-- 配置事务管理器-->         <propertyname="transactionManager" ref="transactionManager" />         <!-- 配置事务属性-->         <propertyname="transactionAttributes">             <props>                 <propkey="*">PROPAGATION_REQUIRED</prop>             </props>         </property>     </bean>          <!-- 配置DAO-->   <beanid="userDaoTarget" class="com.bluesky.spring.dao.UserDaoImpl">       <propertyname="sessionFactory" ref="sessionFactory" />   </bean>       <beanid="userDao" parent="transactionBase" >         <propertyname="target" ref="userDaoTarget" />      </bean></beans>

    第三种方式:使用拦截器

    <?xml version="1.0" encoding="UTF-8"?><beansxmlns="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">   <beanid="sessionFactory"              class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">         <propertyname="configLocation" value="classpath:hibernate.cfg.xml" />         <propertyname="configurationClass" value="org.hibernate.cfg.AnnotationConfiguration" />   </bean>     <!-- 定义事务管理器(声明式的事务)-->     <beanid="transactionManager"        class="org.springframework.orm.hibernate3.HibernateTransactionManager">       <propertyname="sessionFactory" ref="sessionFactory" />   </bean>       <beanid="transactionInterceptor"          class="org.springframework.transaction.interceptor.TransactionInterceptor">         <propertyname="transactionManager" ref="transactionManager" />         <!-- 配置事务属性-->         <propertyname="transactionAttributes">             <props>                 <propkey="*">PROPAGATION_REQUIRED</prop>             </props>         </property>     </bean>         <beanclass="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">         <propertyname="beanNames">             <list>                 <value>*Dao</value>           </list>         </property>         <propertyname="interceptorNames">             <list>                 <value>transactionInterceptor</value>             </list>         </property>     </bean>       <!-- 配置DAO-->   <beanid="userDao" class="com.bluesky.spring.dao.UserDaoImpl">       <propertyname="sessionFactory" ref="sessionFactory" />   </bean></beans>

    第四种方式:使用tx标签配置的拦截器

    <?xml version="1.0" encoding="UTF-8"?><beansxmlns="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-scanbase-package="com.bluesky" />   <beanid="sessionFactory"              class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">         <propertyname="configLocation" value="classpath:hibernate.cfg.xml" />         <propertyname="configurationClass" value="org.hibernate.cfg.AnnotationConfiguration" />   </bean>     <!-- 定义事务管理器(声明式的事务)-->     <beanid="transactionManager"        class="org.springframework.orm.hibernate3.HibernateTransactionManager">       <propertyname="sessionFactory" ref="sessionFactory" />   </bean>   <tx:adviceid="txAdvice" transaction-manager="transactionManager">       <tx:attributes>           <tx:methodname="*" propagation="REQUIRED" />       </tx:attributes>   </tx:advice>       <aop:config>       <aop:pointcutid="interceptorPointCuts"            expression="execution(* com.bluesky.spring.dao.*.*(..))" />       <aop:advisoradvice-ref="txAdvice"            pointcut-ref="interceptorPointCuts" />           </aop:config>     </beans>

    第五种方式:全注解

    <?xml version="1.0" encoding="UTF-8"?><beansxmlns="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-scanbase-package="com.bluesky" />   <tx:annotation-driventransaction-manager="transactionManager"/>   <beanid="sessionFactory"              class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">         <propertyname="configLocation" value="classpath:hibernate.cfg.xml" />         <propertyname="configurationClass" value="org.hibernate.cfg.AnnotationConfiguration" />   </bean>     <!-- 定义事务管理器(声明式的事务)-->     <beanid="transactionManager"        class="org.springframework.orm.hibernate3.HibernateTransactionManager">       <propertyname="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 UserDaoImplextends HibernateDaoSupportimplements UserDao {   public List<User> listUsers() {       return this.getSession().createQuery("from User").list();    }        }


    最新回复(0)