Spring事务配置的五种方式
来源:互联网 发布:森卓止尤净 知乎 编辑:程序博客网 时间:2024/06/05 00:46
Spring事务配置的五种方式
前段时间对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共享一个代理基类
- <?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注解,如下:
- 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();
- }
- }
- Spring事务配置的五种方式
- Spring事务配置的五种方式
- Spring事务配置的五种方式
- Spring事务配置的五种方式
- Spring事务配置的五种方式
- Spring事务配置的五种方式
- Spring事务配置的五种方式
- Spring事务配置的五种方式
- Spring事务配置的五种方式
- Spring事务配置的五种方式
- Spring事务配置的五种方式
- Spring事务配置的五种方式
- Spring事务配置的五种方式
- Spring事务配置的五种方式
- Spring事务配置的五种方式
- Spring事务配置的五种方式
- Spring事务配置的五种方式
- Spring事务配置的五种方式
- csproj文件的用途
- SEO的为什么?
- JavaWeb项目命名不规范带来的问题
- linux下ld连接SO文件时如何制定绝对路径
- MVVM弹出提示
- Spring事务配置的五种方式
- Hdu 4341 Gold miner
- javascript--url传递中文乱码
- 结构体定义 typedef struct 用法详解和用法小结
- 什么是死链接?
- 在Apache及IIS6.0中codeigniter去掉 URL 中的 index.php
- 什么是错误链接?
- 非常方便的PDF书签导入、导出工具
- Poj 1837 Balance