1、TransactionProxyFactoryBean
<?
xml version="1.0" encoding="UTF-8"
?>
< beans xmlns ="http://www.springframework.org/schema/beans"
xmlns:xsi ="http://www.w3.org/2001/XMLSchema-instance" xmlns:p ="http://www.springframework.org/schema/p"
xsi:schemaLocation ="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd" >
< bean id ="sessionFactory"
class ="org.springframework.orm.hibernate3.LocalSessionFactoryBean" >
< property name ="configLocation" value ="classpath:hibernate.cfg.xml" >
</ property >
</ bean >
< bean id ="TblUserDAO" class ="com.angi.dao.TblUserDAO" >
< property name ="sessionFactory" >
< ref bean ="sessionFactory" />
</ property >
</ bean >
<!-- 声明一个 Hibernate 3 的 事务管理器供代理类自动管理事务用 -->
< bean id ="transactionManager"
class ="org.springframework.orm.hibernate3.HibernateTransactionManager" >
< property name ="sessionFactory" >
< ref local ="sessionFactory" />
</ property >
</ bean >
< bean id ="TblUserDAOProxy"
class ="org.springframework.transaction.interceptor.TransactionProxyFactoryBean" >
<!--
注意这个属性, 详细意义请参考Spring文档中的CGLIB部分或者本章的 10.7.2参考资料部分, 必须为 true
使用CGLIB才不用强制编写DAO接口
-->
< property name ="proxyTargetClass" >
< value > true </ value >
</ property >
< property name ="transactionManager" >
< ref bean ="transactionManager" />
</ property >
< property name ="target" >
< ref local ="TblUserDAO" />
</ property >
< property name ="transactionAttributes" >
< props >
<!-- 这里的方法签名可以精确到方法, 先懒惰一下全配置上 -->
< prop key ="*" > PROPAGATION_REQUIRED </ prop >
</ props >
</ property >
</ bean >
</ beans >
< beans xmlns ="http://www.springframework.org/schema/beans"
xmlns:xsi ="http://www.w3.org/2001/XMLSchema-instance" xmlns:p ="http://www.springframework.org/schema/p"
xsi:schemaLocation ="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd" >
< bean id ="sessionFactory"
class ="org.springframework.orm.hibernate3.LocalSessionFactoryBean" >
< property name ="configLocation" value ="classpath:hibernate.cfg.xml" >
</ property >
</ bean >
< bean id ="TblUserDAO" class ="com.angi.dao.TblUserDAO" >
< property name ="sessionFactory" >
< ref bean ="sessionFactory" />
</ property >
</ bean >
<!-- 声明一个 Hibernate 3 的 事务管理器供代理类自动管理事务用 -->
< bean id ="transactionManager"
class ="org.springframework.orm.hibernate3.HibernateTransactionManager" >
< property name ="sessionFactory" >
< ref local ="sessionFactory" />
</ property >
</ bean >
< bean id ="TblUserDAOProxy"
class ="org.springframework.transaction.interceptor.TransactionProxyFactoryBean" >
<!--
注意这个属性, 详细意义请参考Spring文档中的CGLIB部分或者本章的 10.7.2参考资料部分, 必须为 true
使用CGLIB才不用强制编写DAO接口
-->
< property name ="proxyTargetClass" >
< value > true </ value >
</ property >
< property name ="transactionManager" >
< ref bean ="transactionManager" />
</ property >
< property name ="target" >
< ref local ="TblUserDAO" />
</ property >
< property name ="transactionAttributes" >
< props >
<!-- 这里的方法签名可以精确到方法, 先懒惰一下全配置上 -->
< prop key ="*" > PROPAGATION_REQUIRED </ prop >
</ props >
</ property >
</ bean >
</ beans >
2、TransactionInterceptor
<?
xml version="1.0" encoding="UTF-8"
?>
< beans xmlns ="http://www.springframework.org/schema/beans"
xmlns:xsi ="http://www.w3.org/2001/XMLSchema-instance" xmlns:p ="http://www.springframework.org/schema/p"
xsi:schemaLocation ="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd" >
< bean id ="sessionFactory"
class ="org.springframework.orm.hibernate3.LocalSessionFactoryBean" >
< property name ="configLocation" value ="classpath:hibernate.cfg.xml" >
</ property >
</ bean >
< bean id ="tblUserDAO" class ="com.angi.dao.TblUserDAO" >
< property name ="sessionFactory" >
< ref bean ="sessionFactory" />
</ property >
</ bean >
< bean id ="tblUserService" class ="com.angi.dao.service.TblUserService" >
< property name ="tblUserDAO" >
< ref bean ="tblUserDAO" />
</ property >
</ bean >
<!-- 声明一个 Hibernate 3 的 事务管理器供代理类自动管理事务用 -->
< bean id ="transactionManager"
class ="org.springframework.orm.hibernate3.HibernateTransactionManager" >
< property name ="sessionFactory" >
< ref local ="sessionFactory" />
</ property >
</ bean >
< bean
class ="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator" >
< property name ="beanNames" >
< list >
< value > tblUserService </ value >
</ list >
</ property >
< property name ="interceptorNames" >
< list >
< value > transactionInterceptor </ value >
</ list >
</ property >
</ bean >
< bean id ="transactionInterceptor"
class ="org.springframework.transaction.interceptor.TransactionInterceptor" >
< property name ="transactionManager" ref ="transactionManager" />
< property name ="transactionAttributes" >
< props >
<!-- 这里的方法签名可以精确到方法, 先懒惰一下全配置上 -->
< prop key ="*" > PROPAGATION_REQUIRED </ prop >
</ props >
</ property >
</ bean >
</ beans >
< beans xmlns ="http://www.springframework.org/schema/beans"
xmlns:xsi ="http://www.w3.org/2001/XMLSchema-instance" xmlns:p ="http://www.springframework.org/schema/p"
xsi:schemaLocation ="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd" >
< bean id ="sessionFactory"
class ="org.springframework.orm.hibernate3.LocalSessionFactoryBean" >
< property name ="configLocation" value ="classpath:hibernate.cfg.xml" >
</ property >
</ bean >
< bean id ="tblUserDAO" class ="com.angi.dao.TblUserDAO" >
< property name ="sessionFactory" >
< ref bean ="sessionFactory" />
</ property >
</ bean >
< bean id ="tblUserService" class ="com.angi.dao.service.TblUserService" >
< property name ="tblUserDAO" >
< ref bean ="tblUserDAO" />
</ property >
</ bean >
<!-- 声明一个 Hibernate 3 的 事务管理器供代理类自动管理事务用 -->
< bean id ="transactionManager"
class ="org.springframework.orm.hibernate3.HibernateTransactionManager" >
< property name ="sessionFactory" >
< ref local ="sessionFactory" />
</ property >
</ bean >
< bean
class ="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator" >
< property name ="beanNames" >
< list >
< value > tblUserService </ value >
</ list >
</ property >
< property name ="interceptorNames" >
< list >
< value > transactionInterceptor </ value >
</ list >
</ property >
</ bean >
< bean id ="transactionInterceptor"
class ="org.springframework.transaction.interceptor.TransactionInterceptor" >
< property name ="transactionManager" ref ="transactionManager" />
< property name ="transactionAttributes" >
< props >
<!-- 这里的方法签名可以精确到方法, 先懒惰一下全配置上 -->
< prop key ="*" > PROPAGATION_REQUIRED </ prop >
</ props >
</ property >
</ bean >
</ beans >
3、AOP和TX配置
<?
xml version="1.0" encoding="UTF-8"
?>
< beans xmlns ="http://www.springframework.org/schema/beans"
xmlns:xsi ="http://www.w3.org/2001/XMLSchema-instance" xmlns:p ="http://www.springframework.org/schema/p"
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-3.0.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd " >
< bean id ="sessionFactory"
class ="org.springframework.orm.hibernate3.LocalSessionFactoryBean" >
< property name ="configLocation" value ="classpath:hibernate.cfg.xml" >
</ property >
</ bean >
< bean id ="tblUserDAO" class ="com.angi.dao.TblUserDAO" >
< property name ="sessionFactory" >
< ref bean ="sessionFactory" />
</ property >
</ bean >
< bean id ="tblUserService" class ="com.angi.dao.service.TblUserService" >
< property name ="tblUserDAO" >
< ref bean ="tblUserDAO" />
</ property >
</ bean >
<!-- 声明一个 Hibernate 3 的 事务管理器供代理类自动管理事务用 -->
< bean id ="transactionManager"
class ="org.springframework.orm.hibernate3.HibernateTransactionManager" >
< property name ="sessionFactory" >
< ref local ="sessionFactory" />
</ property >
</ bean >
<!-- 需要引入aop的命名空间 -->
< aop:config >
<!-- 切入点指明了在执行Service的所有方法时产生事务拦截操作 -->
< aop:pointcut id ="daoMethods"
expression ="execution(* com.angi.dao.service.TblUserService.*(..))" />
<!-- 定义了将采用何种拦截操作,这里引用到 txAdvice -->
< aop:advisor advice-ref ="txAdvice" pointcut-ref ="daoMethods" />
</ aop:config >
<!-- 需要引入tx的命名空间 -->
<!-- 这是事务通知操作,使用的事务管理器引用自 transactionManager -->
< tx:advice id ="txAdvice" transaction-manager ="transactionManager" >
< tx:attributes >
<!-- 指定哪些方法需要加入事务,这里懒惰一下全部加入,可以使用通配符来只加入需要的方法 -->
< tx:method name ="*" propagation ="REQUIRED" />
</ tx:attributes >
</ tx:advice >
</ beans >
< beans xmlns ="http://www.springframework.org/schema/beans"
xmlns:xsi ="http://www.w3.org/2001/XMLSchema-instance" xmlns:p ="http://www.springframework.org/schema/p"
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-3.0.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd " >
< bean id ="sessionFactory"
class ="org.springframework.orm.hibernate3.LocalSessionFactoryBean" >
< property name ="configLocation" value ="classpath:hibernate.cfg.xml" >
</ property >
</ bean >
< bean id ="tblUserDAO" class ="com.angi.dao.TblUserDAO" >
< property name ="sessionFactory" >
< ref bean ="sessionFactory" />
</ property >
</ bean >
< bean id ="tblUserService" class ="com.angi.dao.service.TblUserService" >
< property name ="tblUserDAO" >
< ref bean ="tblUserDAO" />
</ property >
</ bean >
<!-- 声明一个 Hibernate 3 的 事务管理器供代理类自动管理事务用 -->
< bean id ="transactionManager"
class ="org.springframework.orm.hibernate3.HibernateTransactionManager" >
< property name ="sessionFactory" >
< ref local ="sessionFactory" />
</ property >
</ bean >
<!-- 需要引入aop的命名空间 -->
< aop:config >
<!-- 切入点指明了在执行Service的所有方法时产生事务拦截操作 -->
< aop:pointcut id ="daoMethods"
expression ="execution(* com.angi.dao.service.TblUserService.*(..))" />
<!-- 定义了将采用何种拦截操作,这里引用到 txAdvice -->
< aop:advisor advice-ref ="txAdvice" pointcut-ref ="daoMethods" />
</ aop:config >
<!-- 需要引入tx的命名空间 -->
<!-- 这是事务通知操作,使用的事务管理器引用自 transactionManager -->
< tx:advice id ="txAdvice" transaction-manager ="transactionManager" >
< tx:attributes >
<!-- 指定哪些方法需要加入事务,这里懒惰一下全部加入,可以使用通配符来只加入需要的方法 -->
< tx:method name ="*" propagation ="REQUIRED" />
</ tx:attributes >
</ tx:advice >
</ beans >
4、anotation
<?
xml version="1.0" encoding="UTF-8"
?>
< beans xmlns ="http://www.springframework.org/schema/beans"
xmlns:xsi ="http://www.w3.org/2001/XMLSchema-instance" xmlns:p ="http://www.springframework.org/schema/p"
xmlns:tx ="http://www.springframework.org/schema/tx"
xsi:schemaLocation ="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd " >
<!-- 需要引入tx的命名空间 -->
< tx:annotation-driven transaction-manager ="transactionManager" />
< bean id ="sessionFactory"
class ="org.springframework.orm.hibernate3.LocalSessionFactoryBean" >
< property name ="configLocation" value ="classpath:hibernate.cfg.xml" >
</ property >
</ bean >
< bean id ="tblUserDAO" class ="com.angi.dao.TblUserDAO" >
< property name ="sessionFactory" >
< ref bean ="sessionFactory" />
</ property >
</ bean >
< bean id ="tblUserService" class ="com.angi.dao.service.TblUserService" >
< property name ="tblUserDAO" >
< ref bean ="tblUserDAO" />
</ property >
</ bean >
<!-- 声明一个 Hibernate3 的事务管理器供代理类自动管理事务用 -->
< bean id ="transactionManager"
class ="org.springframework.orm.hibernate3.HibernateTransactionManager" >
< property name ="sessionFactory" >
< ref local ="sessionFactory" />
</ property >
</ bean >
</ beans >
< beans xmlns ="http://www.springframework.org/schema/beans"
xmlns:xsi ="http://www.w3.org/2001/XMLSchema-instance" xmlns:p ="http://www.springframework.org/schema/p"
xmlns:tx ="http://www.springframework.org/schema/tx"
xsi:schemaLocation ="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd " >
<!-- 需要引入tx的命名空间 -->
< tx:annotation-driven transaction-manager ="transactionManager" />
< bean id ="sessionFactory"
class ="org.springframework.orm.hibernate3.LocalSessionFactoryBean" >
< property name ="configLocation" value ="classpath:hibernate.cfg.xml" >
</ property >
</ bean >
< bean id ="tblUserDAO" class ="com.angi.dao.TblUserDAO" >
< property name ="sessionFactory" >
< ref bean ="sessionFactory" />
</ property >
</ bean >
< bean id ="tblUserService" class ="com.angi.dao.service.TblUserService" >
< property name ="tblUserDAO" >
< ref bean ="tblUserDAO" />
</ property >
</ bean >
<!-- 声明一个 Hibernate3 的事务管理器供代理类自动管理事务用 -->
< bean id ="transactionManager"
class ="org.springframework.orm.hibernate3.HibernateTransactionManager" >
< property name ="sessionFactory" >
< ref local ="sessionFactory" />
</ property >
</ bean >
</ beans >
@Transactional
public void doTransaction() {
// step1 insert
TblUser tblUser1 = new TblUser();
tblUser1.setId( 24 );
tblUser1.setUsername( " Angi12 " );
tblUser1.setPassword( " Wang21 " );
tblUserDAO.save(tblUser1);
// step2 update
TblUser tblUser2 = tblUserDAO.findById( 2 );
tblUser2.setPassword(tblUser2.getPassword() + " a " );
tblUserDAO.update(tblUser2);
// step3 insert
TblUser tblUser = new TblUser();
tblUser.setId( 23 );
tblUser.setUsername( " Angi " );
tblUser.setPassword( " Wang " );
tblUserDAO.save(tblUser);
}
public void doTransaction() {
// step1 insert
TblUser tblUser1 = new TblUser();
tblUser1.setId( 24 );
tblUser1.setUsername( " Angi12 " );
tblUser1.setPassword( " Wang21 " );
tblUserDAO.save(tblUser1);
// step2 update
TblUser tblUser2 = tblUserDAO.findById( 2 );
tblUser2.setPassword(tblUser2.getPassword() + " a " );
tblUserDAO.update(tblUser2);
// step3 insert
TblUser tblUser = new TblUser();
tblUser.setId( 23 );
tblUser.setUsername( " Angi " );
tblUser.setPassword( " Wang " );
tblUserDAO.save(tblUser);
}