在二的基础上,我们再给这个简单web应用增加声明式事务,声明式事务原来是EJB所引以为自豪的地方,现如今Spring框架的AOP也支持这功能,关于AOP的内容,这儿不想太深入,有兴趣的读者,可以参见本blog上有关Spring AOP方面的介绍,为了增加声明式事务,我们只需修改Spring的配置文件applicationContext.xml,
1.首先我们在配置文件中增加事务管理器,由于本应用采用了Hibernate,所以我们采用HibernateTransactionManager,配置如下:
<bean id="transactionManager"
class="org.springframework.orm.hibernate.HibernateTransactionManager">
<property name="sessionFactory">
<ref local="sessionFactory"/>
</property>
</bean>
2.要在Sping使用声明式事务,我们得用TransactionProxyFactoryBean,它的作用就是把方法包裹在事务中,配置如下:
<bean id="bookService"
class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
<property name="transactionManager">
<ref local="transactionManager"/>
</property>
<property name="target">
<ref local=" registerTarget"/>
</property>
<property name="transactionAttributes">
<props>
<prop key="save*">
PROPAGATION_REQUIRED,-OrderException
</prop>
</props>
</property>
</bean>
下面我们简单解释一下上面配置的意思:transactionManager属性引用一个事务管理器,在这里我们引用HibernateTransactionManager,target属性指定被代理的对象,transactionAttributes属性的save*表示在代理对象中所有以save开头的方法,PROPAGATION_REQUIRED表示代理对象中所有以save开头的方法都必须在事务中运行,-OrderException表示在执行以save开头的方法时,如果有OrderException异常抛出,则事务立即回滚。
完整的applicationContext.xml的配置如下:
<?
xml
version
=
"1.0"
encoding
=
"UTF-8"
?>
<!
DOCTYPE
beans
PUBLIC
"-//SPRING//DTD BEAN 2.0//EN"
"http://www.springframework.org/dtd/spring-beans-2.0.dtd"
>
<
beans
>
<
bean
id
=
"dataSource"
class
=
"org.springframework.jdbc.datasource.DriverManagerDataSource"
>
<
property
name
=
"driverClassName"
value
=
"com.mysql.jdbc.Driver"
/>
<
property
name
=
"url"
value
=
"jdbc:mysql://localhost/register"
/>
<
property
name
=
"username"
value
=
"root"
/>
<
property
name
=
"password"
value
=
"root"
/>
</
bean
>
<!-- Hibernate SessionFactory -->
<
bean
id
=
"sessionFactory"
class
=
"org.springframework.orm.hibernate3.LocalSessionFactoryBean"
>
<
property
name
=
"dataSource"
ref
=
"dataSource"
/>
<
property
name
=
"mappingDirectoryLocations"
>
<
value
>
classpath:test/register/entity/
</
value
>
</
property
>
<
property
name
=
"hibernateProperties"
>
<
props
>
<
prop
key
=
"hibernate.dialect"
>
org.hibernate.dialect.MySQLDialect
</
prop
>
<
prop
key
=
"hibernate.show_sql"
>
true
</
prop
>
<
prop
key
=
"hibernate.generate_statistics"
>
true
</
prop
>
</
props
>
</
property
>
</
bean
>
<
bean
id
=
"transactionManager"
class
=
"org.springframework.orm.hibernate3.HibernateTransactionManager"
>
<
property
name
=
"sessionFactory"
>
<
ref
local
=
"sessionFactory"
/>
</
property
>
</
bean
>
<
bean
id
=
"registerService"
class
=
"org.springframework.transaction.interceptor.TransactionProxyFactoryBean"
>
<
property
name
=
"transactionManager"
>
<
ref
local
=
"transactionManager"
/>
</
property
>
<
property
name
=
"target"
>
<
ref
local
=
"
registerTarget"
/>
</
property
>
<
property
name
=
"transactionAttributes"
>
<
props
>
<
prop
key
=
"save*"
>
PROPAGATION_REQUIRED,-OrderException
</
prop
>
</
props
>
</
property
>
</
bean
>
<
bean
id
=
"registerDAO"
class
=
"test.register.dao.RegisterDAO"
>
<
property
name
=
"sessionFactory"
ref
=
"sessionFactory"
/>
</
bean
>
<
bean
id
=
"registerTarget"
class
=
"test.register.service.RegisterService"
>
<
property
name
=
"registerDAO"
ref
=
"registerDAO"
/>
</
bean
>
</
beans
>
3.同时还要修改action-servlets.xml文件
<?
xml
version
=
"1.0"
encoding
=
"UTF-8"
?>
<!
DOCTYPE
beans
PUBLIC
"-//SPRING//DTD BEAN 2.0//EN"
"http://www.springframework.org/dtd/spring-beans-2.0.dtd"
>
<
beans
>
<
bean
name
=
"/register"
class
=
"test.register.action.RegisterAction"
>
<
property
name
=
"registerService"
ref
=
"registerTarget"
/>
</
bean
>
</
beans
>
<代码下载>