`

Spring事务配置的五种方式

 
阅读更多

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

总结如下:

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

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

具体如下图:


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

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

  1. <?xmlversion="1.0"encoding="UTF-8"?>
  2. <beansxmlns="http://www.springframework.org/schema/beans"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xmlns:context="http://www.springframework.org/schema/context"
  5. xmlns:aop="http://www.springframework.org/schema/aop"
  6. xsi:schemaLocation="http://www.springframework.org/schema/beans
  7. http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
  8. http://www.springframework.org/schema/context
  9. 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. <beanid="sessionFactory"
  12. class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
  13. <propertyname="configLocation"value="classpath:hibernate.cfg.xml"/>
  14. <propertyname="configurationClass"value="org.hibernate.cfg.AnnotationConfiguration"/>
  15. </bean>
  16. <!--定义事务管理器(声明式的事务)-->
  17. <beanid="transactionManager"
  18. class="org.springframework.orm.hibernate3.HibernateTransactionManager">
  19. <propertyname="sessionFactory"ref="sessionFactory"/>
  20. </bean>
  21. <!--配置DAO-->
  22. <beanid="userDaoTarget"class="com.bluesky.spring.dao.UserDaoImpl">
  23. <propertyname="sessionFactory"ref="sessionFactory"/>
  24. </bean>
  25. <beanid="userDao"
  26. class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
  27. <!--配置事务管理器-->
  28. <propertyname="transactionManager"ref="transactionManager"/>
  29. <propertyname="target"ref="userDaoTarget"/>
  30. <propertyname="proxyInterfaces"value="com.bluesky.spring.dao.GeneratorDao"/>
  31. <!--配置事务属性-->
  32. <propertyname="transactionAttributes">
  33. <props>
  34. <propkey="*">PROPAGATION_REQUIRED</prop>
  35. </props>
  36. </property>
  37. </bean>
  38. </beans>

第二种方式:所有Bean共享一个父类bean

  1. <?xmlversion="1.0"encoding="UTF-8"?>
  2. <beansxmlns="http://www.springframework.org/schema/beans"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xmlns:context="http://www.springframework.org/schema/context"
  5. xmlns:aop="http://www.springframework.org/schema/aop"
  6. xsi:schemaLocation="http://www.springframework.org/schema/beans
  7. http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
  8. http://www.springframework.org/schema/context
  9. 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. <beanid="sessionFactory"
  12. class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
  13. <propertyname="configLocation"value="classpath:hibernate.cfg.xml"/>
  14. <propertyname="configurationClass"value="org.hibernate.cfg.AnnotationConfiguration"/>
  15. </bean>
  16. <!--定义事务管理器(声明式的事务)-->
  17. <beanid="transactionManager"
  18. class="org.springframework.orm.hibernate3.HibernateTransactionManager">
  19. <propertyname="sessionFactory"ref="sessionFactory"/>
  20. </bean>
  21. <beanid="transactionBase"
  22. class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"
  23. lazy-init="true"abstract="true">
  24. <!--配置事务管理器-->
  25. <propertyname="transactionManager"ref="transactionManager"/>
  26. <!--配置事务属性-->
  27. <propertyname="transactionAttributes">
  28. <props>
  29. <propkey="*">PROPAGATION_REQUIRED</prop>
  30. </props>
  31. </property>
  32. </bean>
  33. <!--配置DAO-->
  34. <beanid="userDaoTarget"class="com.bluesky.spring.dao.UserDaoImpl">
  35. <propertyname="sessionFactory"ref="sessionFactory"/>
  36. </bean>
  37. <beanid="userDao"parent="transactionBase">
  38. <propertyname="target"ref="userDaoTarget"/>
  39. </bean>
  40. </beans>

第三种方式:使用拦截器

  1. <?xmlversion="1.0"encoding="UTF-8"?>
  2. <beansxmlns="http://www.springframework.org/schema/beans"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xmlns:context="http://www.springframework.org/schema/context"
  5. xmlns:aop="http://www.springframework.org/schema/aop"
  6. xsi:schemaLocation="http://www.springframework.org/schema/beans
  7. http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
  8. http://www.springframework.org/schema/context
  9. 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. <beanid="sessionFactory"
  12. class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
  13. <propertyname="configLocation"value="classpath:hibernate.cfg.xml"/>
  14. <propertyname="configurationClass"value="org.hibernate.cfg.AnnotationConfiguration"/>
  15. </bean>
  16. <!--定义事务管理器(声明式的事务)-->
  17. <beanid="transactionManager"
  18. class="org.springframework.orm.hibernate3.HibernateTransactionManager">
  19. <propertyname="sessionFactory"ref="sessionFactory"/>
  20. </bean>
  21. <beanid="transactionInterceptor"
  22. class="org.springframework.transaction.interceptor.TransactionInterceptor">
  23. <propertyname="transactionManager"ref="transactionManager"/>
  24. <!--配置事务属性-->
  25. <propertyname="transactionAttributes">
  26. <props>
  27. <propkey="*">PROPAGATION_REQUIRED</prop>
  28. </props>
  29. </property>
  30. </bean>
  31. <beanclass="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">
  32. <propertyname="beanNames">
  33. <list>
  34. <value>*Dao</value>
  35. </list>
  36. </property>
  37. <propertyname="interceptorNames">
  38. <list>
  39. <value>transactionInterceptor</value>
  40. </list>
  41. </property>
  42. </bean>
  43. <!--配置DAO-->
  44. <beanid="userDao"class="com.bluesky.spring.dao.UserDaoImpl">
  45. <propertyname="sessionFactory"ref="sessionFactory"/>
  46. </bean>
  47. </beans>

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

  1. <?xmlversion="1.0"encoding="UTF-8"?>
  2. <beansxmlns="http://www.springframework.org/schema/beans"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xmlns:context="http://www.springframework.org/schema/context"
  5. xmlns:aop="http://www.springframework.org/schema/aop"
  6. xmlns:tx="http://www.springframework.org/schema/tx"
  7. xsi:schemaLocation="http://www.springframework.org/schema/beans
  8. http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
  9. 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-scanbase-package="com.bluesky"/>
  16. <beanid="sessionFactory"
  17. class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
  18. <propertyname="configLocation"value="classpath:hibernate.cfg.xml"/>
  19. <propertyname="configurationClass"value="org.hibernate.cfg.AnnotationConfiguration"/>
  20. </bean>
  21. <!--定义事务管理器(声明式的事务)-->
  22. <beanid="transactionManager"
  23. class="org.springframework.orm.hibernate3.HibernateTransactionManager">
  24. <propertyname="sessionFactory"ref="sessionFactory"/>
  25. </bean>
  26. <tx:adviceid="txAdvice"transaction-manager="transactionManager">
  27. <tx:attributes>
  28. <tx:methodname="*"propagation="REQUIRED"/>
  29. </tx:attributes>
  30. </tx:advice>
  31. <aop:config>
  32. <aop:pointcutid="interceptorPointCuts"
  33. expression="execution(*com.bluesky.spring.dao.*.*(..))"/>
  34. <aop:advisoradvice-ref="txAdvice"
  35. pointcut-ref="interceptorPointCuts"/>
  36. </aop:config>
  37. </beans>

第五种方式:全注解

  1. <?xmlversion="1.0"encoding="UTF-8"?>
  2. <beansxmlns="http://www.springframework.org/schema/beans"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xmlns:context="http://www.springframework.org/schema/context"
  5. xmlns:aop="http://www.springframework.org/schema/aop"
  6. xmlns:tx="http://www.springframework.org/schema/tx"
  7. xsi:schemaLocation="http://www.springframework.org/schema/beans
  8. http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
  9. 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-scanbase-package="com.bluesky"/>
  16. <tx:annotation-driventransaction-manager="transactionManager"/>
  17. <beanid="sessionFactory"
  18. class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
  19. <propertyname="configLocation"value="classpath:hibernate.cfg.xml"/>
  20. <propertyname="configurationClass"value="org.hibernate.cfg.AnnotationConfiguration"/>
  21. </bean>
  22. <!--定义事务管理器(声明式的事务)-->
  23. <beanid="transactionManager"
  24. class="org.springframework.orm.hibernate3.HibernateTransactionManager">
  25. <propertyname="sessionFactory"ref="sessionFactory"/>
  26. </bean>
  27. </beans>

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

  1. packagecom.bluesky.spring.dao;
  2. importjava.util.List;
  3. importorg.hibernate.SessionFactory;
  4. importorg.springframework.beans.factory.annotation.Autowired;
  5. importorg.springframework.orm.hibernate3.support.HibernateDaoSupport;
  6. importorg.springframework.stereotype.Component;
  7. importcom.bluesky.spring.domain.User;
  8. @Transactional
  9. @Component("userDao")
  10. publicclassUserDaoImplextendsHibernateDaoSupportimplementsUserDao{
  11. publicList<User>listUsers(){
  12. returnthis.getSession().createQuery("fromUser").list();
  13. }
  14. }

 

分享到:
评论

相关推荐

    spring事务配置的五种方式

    ### Spring事务配置的五种方式详解 #### 一、引言 在企业级应用开发中,事务处理是非常重要的一部分,特别是在涉及多个数据库操作时。Spring框架提供了强大的事务管理功能,支持编程式和声明式两种事务处理方式。...

    Spring事务配置的五种方式[参照].pdf

    以下是对Spring事务配置五种方式的详细解释: 1. **基于代理的事务管理(Proxy-based Transaction Management)** 这是第一种配置方式,每个Bean都有一个独立的代理。在示例代码中,`TransactionProxyFactoryBean`...

    Spring 事务配置的五种方式.docx

    以下是对Spring事务配置五种方式的详细解释: 1. **基于注解的事务管理(@Transactional)** 使用`@Transactional`注解在类或方法级别声明事务边界。这种方式适用于基于Java的配置,注解可以明确指定事务的传播...

    Spring事务原理、Spring事务配置的五种方式

    Spring事务原理是指Spring框架中的一种机制,用于管理事务,并提供了多种配置方式。事务是指一系列的操作,作为一个整体执行,如果其中某个操作失败,整个事务将回滚。Spring事务原理围绕着两个核心:...

Global site tag (gtag.js) - Google Analytics