码迷,mamicode.com
首页 > 编程语言 > 详细

Spring事务Transaction配置的五种注入方式详解

时间:2016-03-15 06:18:31      阅读:264      评论:0      收藏:0      [点我收藏+]

标签:

Spring事务Transaction配置的五种注入方式详解

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

??? 总结如下:

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

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

??? 具体如下图:

技术分享

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

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

01 <?xml version="1.0"encoding="UTF-8"?>
06 ?xsi:schemaLocation="http://www.springframework.org/schema/beans
07 ?http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
08 ?http://www.springframework.org/schema/context
09 ?http://www.springframework.org/schema/context/spring-context-2.5.xsd
10 ?http://www.springframework.org/schema/aop?http://www.springframework.org/schema/aop/spring-aop-2.5.xsd">
11 ?
12 ?<bean id="sessionFactory"
13 ?class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
14 ?<property name="configLocation"?value="classpath:hibernate.cfg.xml"?/>
15 ?<property name="configurationClass"?value="org.hibernate.cfg.AnnotationConfiguration"?/>
16 ?</bean>
17 ?
18 ?<!-- 定义事务管理器(声明式的事务) -->
19 ?<bean id="transactionManager"
20 ?class="org.springframework.orm.hibernate3.HibernateTransactionManager">
21 ?<property name="sessionFactory"?ref="sessionFactory"?/>
22 ?</bean>
23 ??
24 ?<!-- 配置DAO -->
25 ?<bean id="userDaoTarget"?class="com.bluesky.spring.dao.UserDaoImpl">
26 ?<property name="sessionFactory"?ref="sessionFactory"?/>
27 ?</bean>
28 ??
29 ?<bean id="userDao"
30 ?class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
31 ?<!-- 配置事务管理器 -->
32 ?<property name="transactionManager"?ref="transactionManager"?/>
33 ?<property name="target"?ref="userDaoTarget"?/>
34 ?<property name="proxyInterfaces"?value="com.bluesky.spring.dao.GeneratorDao"?/>
35 ?<!-- 配置事务属性 -->
36 ?<property name="transactionAttributes">
37 ?<props>
38 ?<prop key="*"> PROPAGATION_REQUIRED </prop>
39 ?</props>
40 ?</property>
41 ?</bean>
42 ?</beans>

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

01 <?xml version="1.0"encoding="UTF-8"?>
06 ?xsi:schemaLocation="http://www.springframework.org/schema/beans
07 ?http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
08 ?http://www.springframework.org/schema/context
09 ?http://www.springframework.org/schema/context/spring-context-2.5.xsd
10 ?http://www.springframework.org/schema/aop?http://www.springframework.org/schema/aop/spring-aop-2.5.xsd">
11 ?
12 ?<bean id="sessionFactory"
13 ?class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
14 ?<property name="configLocation"?value="classpath:hibernate.cfg.xml"?/>
15 ?<property name="configurationClass"?value="org.hibernate.cfg.AnnotationConfiguration"?/>
16 ?</bean>
17 ?
18 ?<!-- 定义事务管理器(声明式的事务) -->
19 ?<bean id="transactionManager"
20 ?class="org.springframework.orm.hibernate3.HibernateTransactionManager">
21 ?<property name="sessionFactory"?ref="sessionFactory"?/>
22 ?</bean>
23 ??
24 ?<bean id="transactionBase"
25 ?class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"
26 ?lazy-init="true"?abstract="true">
27 ?<!-- 配置事务管理器 -->
28 ?<property name="transactionManager"?ref="transactionManager"?/>
29 ?<!-- 配置事务属性 -->
30 ?<property name="transactionAttributes">
31 ?<props>
32 ?<prop key="*">PROPAGATION_REQUIRED </prop>
33 ?</props>
34 ?</property>
35 ?</bean>
36 ??
37 ?<!-- 配置DAO -->
38 ?<bean id="userDaoTarget"?class="com.bluesky.spring.dao.UserDaoImpl">
39 ?<property name="sessionFactory"?ref="sessionFactory"?/>
40 ?</bean>
41 ??
42 ?<bean id="userDao"?parent="transactionBase">
43 ?<property name="target"?ref="userDaoTarget"?/>
44 ?</bean>
45 ?</beans>

第三种方式:使用拦截器

01 <?xml version="1.0"encoding="UTF-8"?>
06 ?xsi:schemaLocation="http://www.springframework.org/schema/beans
07 ?http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
08 ?http://www.springframework.org/schema/context
09 ?http://www.springframework.org/schema/context/spring-context-2.5.xsd
10 ?http://www.springframework.org/schema/aop?http://www.springframework.org/schema/aop/spring-aop-2.5.xsd">
11 ?
12 ?<bean id="sessionFactory"
13 ?class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
14 ?<property name="configLocation"?value="classpath:hibernate.cfg.xml"?/>
15 ?<property name="configurationClass"?value="org.hibernate.cfg.AnnotationConfiguration"?/>
16 ?</bean>
17 ?
18 ?<!-- 定义事务管理器(声明式的事务) -->
19 ?<bean id="transactionManager"
20 ?class="org.springframework.orm.hibernate3.HibernateTransactionManager">
21 ?<property name="sessionFactory"?ref="sessionFactory"?/>
22 ?</bean>
23 ??
24 ?<bean id="transactionInterceptor"
25 ?class="org.springframework.transaction.interceptor.TransactionInterceptor">
26 ?<property name="transactionManager"?ref="transactionManager"?/>
27 ?<!-- 配置事务属性 -->
28 ?<property name="transactionAttributes">
29 ?<props>
30 ?<prop key="*">PROPAGATION_REQUIRED </prop>
31 ?</props>
32 ?</property>
33 ?</bean>
34 ??
35 ?<bean?class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">
36 ?<property name="beanNames">
37 ?<list>
38 ?<value> *Dao </value>
39 ?</list>
40 ?</property>
41 ?<property name="interceptorNames">
42 ?<list>
43 ?<value> transactionInterceptor </value>
44 ?</list>
45 ?</property>
46 ?</bean>
47 ??
48 ?<!-- 配置DAO -->
49 ?<bean id="userDao"?class="com.bluesky.spring.dao.UserDaoImpl">
50 ?<property name="sessionFactory"?ref="sessionFactory"?/>
51 ?</bean>
52 ?</beans>

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

01 <?xml version="1.0"encoding="UTF-8"?>
07 ?xsi:schemaLocation="http://www.springframework.org/schema/beans
08 ?http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
09 ?http://www.springframework.org/schema/context
10 ?http://www.springframework.org/schema/context/spring-context-2.5.xsd
11 ?http://www.springframework.org/schema/aop?http://www.springframework.org/schema/aop/spring-aop-2.5.xsd
12 ?http://www.springframework.org/schema/tx?http://www.springframework.org/schema/tx/spring-tx-2.5.xsd">
13 ?
14 ?<context:annotation-config />
15 ?<context:component-scan base-package="com.bluesky"?/>
16 ?
17 ?<bean id="sessionFactory"
18 ?class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
19 ?<property name="configLocation"?value="classpath:hibernate.cfg.xml"?/>
20 ?<property name="configurationClass"?value="org.hibernate.cfg.AnnotationConfiguration"?/>
21 ?</bean>
22 ?
23 ?<!-- 定义事务管理器(声明式的事务) -->
24 ?<bean id="transactionManager"
25 ?class="org.springframework.orm.hibernate3.HibernateTransactionManager">
26 ?<property name="sessionFactory"?ref="sessionFactory"?/>
27 ?</bean>
28 ?
29 ?<tx:advice id="txAdvice"?transaction-manager="transactionManager">
30 ?<tx:attributes>
31 ?<tx:method name="*"?propagation="REQUIRED"?/>
32 ?</tx:attributes>
33 ?</tx:advice>
34 ??
35 ?<aop:config>
36 ?<aop:pointcut id="interceptorPointCuts"
37 ?expression="execution(*com.bluesky.spring.dao.*.*(..))"?/>
38 ?<aop:advisor advice-ref="txAdvice"
39 ?pointcut-ref="interceptorPointCuts"?/>
40 ?</aop:config>
41 ?</beans>

第五种方式:全注解

01 <?xml version="1.0"encoding="UTF-8"?>
07 ?xsi:schemaLocation="http://www.springframework.org/schema/beans
08 ?http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
09 ?http://www.springframework.org/schema/context
10 ?http://www.springframework.org/schema/context/spring-context-2.5.xsd
11 ?http://www.springframework.org/schema/aop?http://www.springframework.org/schema/aop/spring-aop-2.5.xsd
12 ?http://www.springframework.org/schema/tx?http://www.springframework.org/schema/tx/spring-tx-2.5.xsd">
13 ?
14 ?<context:annotation-config />
15 ?<context:component-scan base-package="com.bluesky"?/>
16 ?
17 ?<tx:annotation-driven transaction-manager="transactionManager"/>
18 ?
19 ?<bean id="sessionFactory"
20 ?class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
21 ?<property name="configLocation"?value="classpath:hibernate.cfg.xml"?/>
22 ?<property name="configurationClass"?value="org.hibernate.cfg.AnnotationConfiguration"?/>
23 ?</bean>
24 ?
25 ?<!-- 定义事务管理器(声明式的事务) -->
26 ?<bean id="transactionManager"
27 ?class="org.springframework.orm.hibernate3.HibernateTransactionManager">
28 ?<property name="sessionFactory"?ref="sessionFactory"?/>
29 ?</bean>
30 ??
31 ?</beans>

此时在DAO上需加上@Transactional注解,如下:

01 package?com.bluesky.spring.dao;
02 ?
03 ?import?java.util.List;
04 ?
05 ?import?org.hibernate.SessionFactory;
06 ?import?org.springframework.beans.factory.annotation.Autowired;
07 ?import?org.springframework.orm.hibernate3.support.HibernateDaoSupport;
08 ?import?org.springframework.stereotype.Component;
09 ?
10 ?import?com.bluesky.spring.domain.User;
11 ?
12 @Transactional
13 @Component(?" userDao "?)
14 ?public?class?UserDaoImpl?extends?HibernateDaoSupport?implements?UserDao {
15 ?
16 ?public?List <User> listUsers() {
17 ?return?this?.getSession().createQuery(?" from User "?).list();
18 ?}
19 }

Spring事务Transaction配置的五种注入方式详解

标签:

原文地址:http://www.cnblogs.com/icenter/p/5277852.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!