本文摘自:http://www.blogjava.net/jacky9881/archive/2008/01/02/172088.html
在二的基础上,我们再给这个简单web应用增加声明式事务,声明式事务原来是EJB所引以为自豪的地方,现如今Spring框架的AOP也支持这功能,关于AOP的内容,这儿不想太深入,有兴趣的读者,可以去网上找些有关Spring AOP方面的介绍,为了增加声明式事务,我们只需修改Spring的配置文件applicationContext.xml,
1.首先我们在配置文件中增加事务管理器,由于本应用采用了Hibernate,所以我们采用HibernateTransactionManager,配置如下:
1<bean id="transactionManager" 2 class="org.springframework.orm.hibernate.HibernateTransactionManager"> 3 <property name="sessionFactory"> 4 <ref local="sessionFactory"/> 5 </property> 6 </bean>
2.要在Sping使用声明式事务,我们得用TransactionProxyFactoryBean,它的作用就是把方法包裹在事务中,配置如下:
1<bean id="bookService" 2class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"> 3 <property name="transactionManager"> 4 <ref local="transactionManager"/> 5 </property> 6 <property name="target"> 7 <ref local=" registerTarget"/> 8 </property> 9 <property name="transactionAttributes"> 10 <props> 11 <prop key="save*"> 12PROPAGATION_REQUIRED,-OrderException 13</prop> 14 </props> 15 </property> 16 </bean>
下面我们简单解释一下上面配置的意思:transactionManager属性引用一个事务管理器,在这里我们引用HibernateTransactionManager,target属性指定被代理的对象,transactionAttributes属性的save*表示在代理对象中所有以save开头的方法,PROPAGATION_REQUIRED表示代理对象中所有以save开头的方法都必须在事务中运行,-OrderException表示在执行以save开头的方法时,如果有OrderException异常抛出,则事务立即回滚。
完整的applicationContext.xml的配置如下:
1<?xml version="1.0" encoding="UTF-8"?> 2<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN 2.0//EN" "http://www.springframework.org/dtd/spring-beans-2.0.dtd"> 3 4<beans> 5 6 <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> 7 <property name="driverClassName" value="com.mysql.jdbc.Driver"/> 8 <property name="url" value="jdbc:mysql://localhost/register"/> 9 <property name="username" value="root"/> 10 <property name="password" value="root"/> 11 </bean> 12 13 <!-- Hibernate SessionFactory --> 14 <bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"> 15 <property name="dataSource" ref="dataSource"/> 16 <property name="mappingDirectoryLocations"> 17 <value>classpath:test\register\entity\</value> 18 </property> 19 <property name="hibernateProperties"> 20 <props> 21 <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop> 22 <prop key="hibernate.show_sql">true</prop> 23 <prop key="hibernate.generate_statistics">true</prop> 24 </props> 25 </property> 26 </bean> 27 28 <bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager"> 29 <property name="sessionFactory"> 30 <ref local="sessionFactory"/> 31 </property> 32 </bean> 33 34 <bean id="registerService" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"> 35 <property name="transactionManager"> 36 <ref local="transactionManager"/> 37 </property> 38 <property name="target"> 39 <ref local=" registerTarget"/> 40 </property> 41 <property name="transactionAttributes"> 42 <props> 43 <prop key="save*">PROPAGATION_REQUIRED,-OrderException</prop> 44 </props> 45 </property> 46 </bean> 47 48 <bean id="registerDAO" class="test.register.dao.RegisterDAO"> 49 <property name="sessionFactory" ref="sessionFactory"/> 50 </bean> 51 52 <bean id="registerTarget" class="test.register.service.RegisterService"> 53 <property name="registerDAO" ref="registerDAO"/> 54 </bean> 55 56</beans>
3.同时还要修改action-servlets.xml文件
1<?xml version="1.0" encoding="UTF-8"?> 2<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN 2.0//EN" "http://www.springframework.org/dtd/spring-beans-2.0.dtd"> 3<beans> 4 <bean name="/register" 5class="test.register.action.RegisterAction"> 6 <property name="registerService" ref="registerTarget"/> 7 </bean> 8</beans>