Spring事务配置的五种方式

系统 1533 0

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

总结如下:

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

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

具体如下图:

Spring事务配置的五种方式


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

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

  1. <? xml version = "1.0" encoding = "UTF-8" ?>
  2. < beans xmlns = "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. < bean id = "sessionFactory"
  12. class = "org.springframework.orm.hibernate3.LocalSessionFactoryBean" >
  13. < property name = "configLocation" value = "classpath:hibernate.cfg.xml" />
  14. < property name = "configurationClass" value = "org.hibernate.cfg.AnnotationConfiguration" />
  15. </ bean >
  16. <!--定义事务管理器(声明式的事务)-->
  17. < bean id = "transactionManager"
  18. class = "org.springframework.orm.hibernate3.HibernateTransactionManager" >
  19. < property name = "sessionFactory" ref = "sessionFactory" />
  20. </ bean >
  21. <!--配置DAO-->
  22. < bean id = "userDaoTarget" class = "com.bluesky.spring.dao.UserDaoImpl" >
  23. < property name = "sessionFactory" ref = "sessionFactory" />
  24. </ bean >
  25. < bean id = "userDao"
  26. class = "org.springframework.transaction.interceptor.TransactionProxyFactoryBean" >
  27. <!--配置事务管理器-->
  28. < property name = "transactionManager" ref = "transactionManager" />
  29. < property name = "target" ref = "userDaoTarget" />
  30. < property name = "proxyInterfaces" value = "com.bluesky.spring.dao.GeneratorDao" />
  31. <!--配置事务属性-->
  32. < property name = "transactionAttributes" >
  33. < props >
  34. < prop key = "*" > PROPAGATION_REQUIRED </ prop >
  35. </ props >
  36. </ property >
  37. </ bean >
  38. </ beans >

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

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

第三种方式:使用拦截器

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

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

  1. <? xml version = "1.0" encoding = "UTF-8" ?>
  2. < beans xmlns = "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-scan base-package = "com.bluesky" />
  16. < bean id = "sessionFactory"
  17. class = "org.springframework.orm.hibernate3.LocalSessionFactoryBean" >
  18. < property name = "configLocation" value = "classpath:hibernate.cfg.xml" />
  19. < property name = "configurationClass" value = "org.hibernate.cfg.AnnotationConfiguration" />
  20. </ bean >
  21. <!--定义事务管理器(声明式的事务)-->
  22. < bean id = "transactionManager"
  23. class = "org.springframework.orm.hibernate3.HibernateTransactionManager" >
  24. < property name = "sessionFactory" ref = "sessionFactory" />
  25. </ bean >
  26. < tx:advice id = "txAdvice" transaction-manager = "transactionManager" >
  27. < tx:attributes >
  28. < tx:method name = "*" propagation = "REQUIRED" />
  29. </ tx:attributes >
  30. </ tx:advice >
  31. < aop:config >
  32. < aop:pointcut id = "interceptorPointCuts"
  33. expression = "execution(*com.bluesky.spring.dao.*.*(..))" />
  34. < aop:advisor advice-ref = "txAdvice"
  35. pointcut-ref = "interceptorPointCuts" />
  36. </ aop:config >
  37. </ beans >

第五种方式:全注解

  1. <? xml version = "1.0" encoding = "UTF-8" ?>
  2. < beans xmlns = "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-scan base-package = "com.bluesky" />
  16. < tx:annotation-driven transaction-manager = "transactionManager" />
  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. < bean id = "transactionManager"
  24. class = "org.springframework.orm.hibernate3.HibernateTransactionManager" >
  25. < property name = "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事务配置的五种方式


更多文章、技术交流、商务合作、联系博主

微信扫码或搜索:z360901061

微信扫一扫加我为好友

QQ号联系: 360901061

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描下面二维码支持博主2元、5元、10元、20元等您想捐的金额吧,狠狠点击下面给点支持吧,站长非常感激您!手机微信长按不能支付解决办法:请将微信支付二维码保存到相册,切换到微信,然后点击微信右上角扫一扫功能,选择支付二维码完成支付。

【本文对您有帮助就好】

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描上面二维码支持博主2元、5元、10元、自定义金额等您想捐的金额吧,站长会非常 感谢您的哦!!!

发表我的评论
最新评论 总共0条评论