段时间对Spring事务配置做了比较深入的研究,在此之间对Spring事务配置虽说也配置过,但是一直没有一个清楚的认识。通过这次的学习发觉Spring事务配置只要把思路理清,还是比较好掌握的。
总结如下:
Spring配置文件中关于Spring事务配置总是由三个组成部分,分别是DataSource、TransactionManager和代理机制这三部分,无论哪种配置方式,一般变化的只是代理机制这部分。
DataSource、TransactionManager这两部分只是会根据数据访问方式有所变化,比如使用Hibernate进行数据访问时,DataSource实际为SessionFactory,TransactionManager的实现为 HibernateTransactionManager。
具体如下图:
根据代理机制的不同,总结了五种Spring事务的配置方式,配置文件如下:
第一种方式:每个Bean都有一个代理
- <?xmlversion="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共享一个父类bean
- <?xmlversion="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>
第三种方式:使用拦截器
- <?xmlversion="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标签配置的拦截器
- <?xmlversion="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>
第五种方式:全注解
- <?xmlversion="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注解,如下:
- packagecom.bluesky.spring.dao;
- importjava.util.List;
- importorg.hibernate.SessionFactory;
- importorg.springframework.beans.factory.annotation.Autowired;
- importorg.springframework.orm.hibernate3.support.HibernateDaoSupport;
- importorg.springframework.stereotype.Component;
- importcom.bluesky.spring.domain.User;
- @Transactional
- @Component("userDao")
- publicclassUserDaoImplextendsHibernateDaoSupportimplementsUserDao{
- publicList<User>listUsers(){
- returnthis.getSession().createQuery("fromUser").list();
- }
- }
相关推荐
### Spring事务配置的五种方式详解 #### 一、引言 在企业级应用开发中,事务处理是非常重要的一部分,特别是在涉及多个数据库操作时。Spring框架提供了强大的事务管理功能,支持编程式和声明式两种事务处理方式。...
以下是对Spring事务配置五种方式的详细解释: 1. **基于代理的事务管理(Proxy-based Transaction Management)** 这是第一种配置方式,每个Bean都有一个独立的代理。在示例代码中,`TransactionProxyFactoryBean`...
以下是对Spring事务配置五种方式的详细解释: 1. **基于注解的事务管理(@Transactional)** 使用`@Transactional`注解在类或方法级别声明事务边界。这种方式适用于基于Java的配置,注解可以明确指定事务的传播...
Spring事务原理是指Spring框架中的一种机制,用于管理事务,并提供了多种配置方式。事务是指一系列的操作,作为一个整体执行,如果其中某个操作失败,整个事务将回滚。Spring事务原理围绕着两个核心:...