在二的基础上,我们再给这个简单web应用增加声明式事务,声明式事务原来是EJB所引以为自豪的地方,现如今Spring框架的AOP也支持这功能,关于AOP的内容,这儿不想太深入,有兴趣的读者,可以参见本blog上有关Spring AOP方面的介绍,为了增加声明式事务,我们只需修改Spring的配置文件applicationContext.xml,
1.首先我们在配置文件中增加事务管理器,由于本应用采用了Hibernate,所以我们采用HibernateTransactionManager,配置如下:
2 class ="org.springframework.orm.hibernate.HibernateTransactionManager" >
3 < property name ="sessionFactory" >
4 < ref local ="sessionFactory" />
5 </ property >
6 </ bean >
2.要在Sping使用声明式事务,我们得用TransactionProxyFactoryBean,它的作用就是把方法包裹在事务中,配置如下:
2 class ="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*" >
12 PROPAGATION_REQUIRED,-OrderException
13 </ prop >
14 </ props >
15 </ property >
16 </ bean >
17
下面我们简单解释一下上面配置的意思:transactionManager属性引用一个事务管理器,在这里我们引用HibernateTransactionManager,target属性指定被代理的对象,transactionAttributes属性的save*表示在代理对象中所有以save开头的方法,PROPAGATION_REQUIRED表示代理对象中所有以save开头的方法都必须在事务中运行,-OrderException表示在执行以save开头的方法时,如果有OrderException异常抛出,则事务立即回滚。
完整的applicationContext.xml的配置如下:
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 >
57
3.同时还要修改action-servlets.xml文件
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"
5 class ="test.register.action.RegisterAction" >
6 < property name ="registerService" ref ="registerTarget" />
7 </ bean >
8 </ beans >
9