|
通常建议采用声明式事务管理。声明式事务管理的优势非常明显:代码中无需关于关注事务逻辑,让Spring声明式事务管理负责事务逻辑,声明式事务管理无需与具体的事务逻辑耦合,可以方便地在不同事务逻辑之间切换。 一. 利用TransactionProxyFactoryBean生成事务代理
<?
xml version="1.0" encoding="gb2312"
?>
<!--
Spring配置文件的文件头,包含DTD等信息
-->
<!
DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd"
>
<
beans
>
<!--
定义数据源
-->
<
bean
id
="dataSource"
class
="org.springframework.jdbc.datasource.DriverManagerDataSource"
>
<!--
定义数据库驱动
-->
<
property
name
="driverClassName"
><
value
>
com.mysql.jdbc.Driver
</
value
></
property
>
<!--
定义数据库url
-->
<
property
name
="url"
><
value
>
jdbc:mysql://localhost:3306/spring
</
value
></
property
>
<!--
定义数据库用户名
-->
<
property
name
="username"
><
value
>
root
</
value
></
property
>
<!--
定义数据库密码
-->
<
property
name
="password"
><
value
>
32147
</
value
></
property
>
</
bean
>
<!--
定义一个hibernate的SessionFactory
-->
<
bean
id
="sessionFactory"
class
="org.springframework.orm.hibernate3.LocalSessionFactoryBean"
>
<!--
定义SessionFactory必须注入DataSource
-->
<
property
name
="dataSource"
><
ref
local
="dataSource"
/></
property
>
<
property
name
="mappingResources"
>
<
list
>
<!--
以下用来列出所有的PO映射文件
-->
<
value
>
Person.hbm.xml
</
value
>
</
list
>
</
property
>
<
property
name
="hibernateProperties"
>
<
props
>
<!--
此处用来定义hibernate的SessionFactory的属性: 不同数据库连接,启动时选择create,update,create-drop
-->
<
prop
key
="hibernate.dialect"
>
org.hibernate.dialect.MySQLDialect
</
prop
>
<
prop
key
="hibernate.hbm2ddl.auto"
>
update
</
prop
>
</
props
>
</
property
>
</
bean
>
<!--
定义事务管理器,使用适用于Hibernte的事务管理器
-->
<
bean
id
="transactionManager"
class
="org.springframework.orm.hibernate3.HibernateTransactionManager"
>
<!--
HibernateTransactionManager bean需要依赖注入一个SessionFactory bean的引用
-->
<
property
name
="sessionFactory"
><
ref
local
="sessionFactory"
/></
property
>
</
bean
>
<!--
定义DAO Bean , 作为事务代理的目标
-->
<
bean
id
="personDaoTarget"
class
="lee.PersonDaoHibernate"
>
<!--
为DAO bean注入SessionFactory引用
-->
<
property
name
="sessionFactory"
><
ref
local
="sessionFactory"
/></
property
>
</
bean
>
<!--
定义DAO bean的事务代理
-->
<
bean
id
="personDao"
class
="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"
>
<!--
为事务代理bean注入事务管理器
-->
<
property
name
="transactionManager"
><
ref
bean
="transactionManager"
/></
property
>
<!--
设置事务属性
-->
<
property
name
="transactionAttributes"
>
<
props
>
<!--
所有以find开头的方法,采用required的事务策略,并且只读
-->
<
prop
key
="find*"
>
PROPAGATION_REQUIRED,readOnly
</
prop
>
<!--
其他方法,采用required的事务策略 -> <prop key="*">PROPAGATION_REQUIRED</prop> </props> </property> <!-- 为事务代理bean设置目标bean
-->
<
property
name
="target"
>
<
ref
local
="personDaoTarget"
/>
</
property
>
</
bean
>
</
beans
>
在上面的配置文件中,personDao需要配置两个部分,一个是personDao的目标bean,该目标bean是实际DAO bean,以实际的DAO bean为目标,建立事务代理。一个组件,需要来个bean组成,一个目标bean,一个事务代理。
<!--
定义DAO bean的事务代理
-->
<
bean
id
="personDao"
class
="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"
>
<!--
为事务代理bean注入事务管理器
-->
<
property
name
="transactionManager"
><
ref
bean
="transactionManager"
/></
property
>
<!--
设置事务属性
-->
<
property
name
="transactionAttributes"
>
<
props
>
<!--
所有以find开头的方法,采用required的事务策略,并且只读
-->
<
prop
key
="find*"
>
PROPAGATION_REQUIRED,readOnly
</
prop
>
<!--
其他方法,采用required的事务策略 -> <prop key="*">PROPAGATION_REQUIRED</prop> </props> </property> <!-- 为事务代理bean设置目标bean
-->
<
property
name
="target"
>
<!--
采用嵌套bean配置目标bean
-->
<
bean
class
="lee.PersonDaoHibernate"
>
<!--
为DAO bean注入SessionFactory引用
-->
<
property
name
="sessionFactory"
><
ref
local
="sessionFactory"
/></
property
>
</
bean
>
</
property
>
</
bean
>
|
本文介绍声明式事务管理的优势及配置方式,包括使用TransactionProxyFactoryBean、bean继承和AOP框架等方法。并提供了使用TransactionProxyFactoryBean的具体配置示例。

154

被折叠的 条评论
为什么被折叠?



