本文共 6033 字,大约阅读时间需要 20 分钟。
Spring配置文件中关于事务配置总是由三个组成部分,分别是DataSource、TransactionManager和代理机制这三部分,无论哪种配置方式,一般变化的只是代理机制这部分。 DataSource、 TransactionManager这两部分只是会根据数据访问方式有所变化,比如使用Hibernate进行数据访问时,DataSource实际为 SessionFactory,TransactionManager的实现为HibernateTransactionManager。 Spring注解型事务配置 根据代理机制的不同,总结了五种Spring事务的配置方式,配置文件如下: 第一种方式:每个Bean都有一个代理 Java代码 # <beanid="sessionFactory" # class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"> # <property name="configLocation"value="classpath:hibernate.cfg.xml"/> # <property name="configurationClass"value="org.hibernate.cfg.AnnotationConfiguration"/> # </bean> # # <!-- 定义事务管理器(声明式的事务)--> # <beanid="transactionManager" # class="org.springframework.orm.hibernate3.HibernateTransactionManager"> # <property name="sessionFactory" ref="sessionFactory"/> # </bean> # # <!-- 配置DAO--> # <bean id="userDaoTarget"class="com.bluesky.spring.dao.UserDaoImpl"> # <property name="sessionFactory" ref="sessionFactory"/> # </bean> # # <beanid="userDao" # class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"> # <!-- 配置事务管理器--> # <property name="transactionManager"ref="transactionManager"/> # <property name="target" ref="userDaoTarget"/> # <property name="proxyInterfaces"value="com.bluesky.spring.dao.GeneratorDao"/> # <!-- 配置事务属性--> # <propertyname="transactionAttributes"> # <props> # <propkey="*">PROPAGATION_REQUIRED</prop> # </props> # </property> # </bean> # lt;/beans> 第二种方式:所有Bean共享一个代理基类 Java代码 # <beanid="sessionFactory" # class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"> # <property name="configLocation"value="classpath:hibernate.cfg.xml"/> # <property name="configurationClass"value="org.hibernate.cfg.AnnotationConfiguration"/> # </bean> # # <!-- 定义事务管理器(声明式的事务)--> # <beanid="transactionManager" # class="org.springframework.orm.hibernate3.HibernateTransactionManager"> # <property name="sessionFactory" ref="sessionFactory"/> # </bean> # # <beanid="transactionBase" # class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean" # lazy-init="true"abstract="true"> # <!-- 配置事务管理器--> # <property name="transactionManager"ref="transactionManager"/> # <!-- 配置事务属性--> # <propertyname="transactionAttributes"> # <props> # <propkey="*">PROPAGATION_REQUIRED</prop> # </props> # </property> # </bean> # # <!-- 配置DAO--> # <bean id="userDaoTarget"class="com.bluesky.spring.dao.UserDaoImpl"> # <property name="sessionFactory" ref="sessionFactory"/> # </bean> # # <bean id="userDao" parent="transactionBase"> # <property name="target" ref="userDaoTarget"/> # </bean> # </beans> 第三种方式:使用拦截器 Java代码 # <beanid="sessionFactory" # class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"> # <property name="configLocation"value="classpath:hibernate.cfg.xml"/> # <property name="configurationClass"value="org.hibernate.cfg.AnnotationConfiguration"/> # </bean> # # <!-- 定义事务管理器(声明式的事务)--> # <beanid="transactionManager" # class="org.springframework.orm.hibernate3.HibernateTransactionManager"> # <property name="sessionFactory" ref="sessionFactory"/> # </bean> # # <beanid="transactionInterceptor" # class="org.springframework.transaction.interceptor.TransactionInterceptor"> # <property name="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--> # <bean id="userDao"class="com.bluesky.spring.dao.UserDaoImpl"> # <property name="sessionFactory" ref="sessionFactory"/> # </bean> # </beans> 第四种方式:使用tx标签配置的拦截器 Java代码 # <context:annotation-config/> # <context:component-scan base-package="com.bluesky"/> # # <beanid="sessionFactory" # class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"> # <property name="configLocation"value="classpath:hibernate.cfg.xml"/> # <property name="configurationClass"value="org.hibernate.cfg.AnnotationConfiguration"/> # </bean> # # <!-- 定义事务管理器(声明式的事务)--> # <beanid="transactionManager" # class="org.springframework.orm.hibernate3.HibernateTransactionManager"> # <property name="sessionFactory" ref="sessionFactory"/> # </bean> # # <tx:advice id="txAdvice"transaction-manager="transactionManager"> # <tx:attributes> # <tx:method name="*" 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> 第五种方式:全注解 Java代码 # <context:annotation-config/> # <context:component-scan base-package="com.bluesky"/> # # <tx:annotation-driventransaction-manager="transactionManager"/> # # <beanid="sessionFactory" # class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"> # <property name="configLocation"value="classpath:hibernate.cfg.xml"/> # <property name="configurationClass"value="org.hibernate.cfg.AnnotationConfiguration"/> # </bean> # # <!-- 定义事务管理器(声明式的事务)--> # <beanid="transactionManager" # class="org.springframework.orm.hibernate3.HibernateTransactionManager"> # <property name="sessionFactory" ref="sessionFactory"/> # </bean> # # </beans> 此时在DAO上需加上@Transactional注解,如下: Java代码 # 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") # public class UserDaoImpl extends HibernateDaoSupport implementsUserDao { # # publicList<User> listUsers(){ # returnthis.getSession().createQuery("fromUser").list(); # } # # # }转载地址:http://gnlmi.baihongyu.com/