在二的基礎上,我們再給這個簡單web應用增加聲明式事務,聲明式事務原來是EJB所引以為自豪的地方,現如今Spring框架的AOP也支持這功能,關于AOP的內容,這兒不想太深入,有興趣的讀者,可以參見本blog上有關Spring AOP方面的介紹,為了增加聲明式事務,我們只需修改Spring的配置文件applicationContext.xml,
1.首先我們在配置文件中增加事務管理器,由于本應用采用了Hibernate,所以我們采用HibernateTransactionManager,配置如下:
2.要在Sping使用聲明式事務,我們得用TransactionProxyFactoryBean,它的作用就是把方法包裹在事務中,配置如下:
下面我們簡單解釋一下上面配置的意思:transactionManager屬性引用一個事務管理器,在這里我們引用HibernateTransactionManager,target屬性指定被代理的對象,transactionAttributes屬性的save*表示在代理對象中所有以save開頭的方法,PROPAGATION_REQUIRED表示代理對象中所有以save開頭的方法都必須在事務中運行,-OrderException表示在執行以save開頭的方法時,如果有OrderException異常拋出,則事務立即回滾。
完整的applicationContext.xml的配置如下:
3.同時還要修改action-servlets.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

3

4

5

6

2.要在Sping使用聲明式事務,我們得用TransactionProxyFactoryBean,它的作用就是把方法包裹在事務中,配置如下:
1
<bean id="bookService"
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

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

下面我們簡單解釋一下上面配置的意思: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>
57

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

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"
5
class="test.register.action.RegisterAction">
6
<property name="registerService" ref="registerTarget"/>
7
</bean>
8
</beans>
9

2

3

4

5

6

7

8

9
