利用Transaction ProxyFactoryBean 生成事务代理

采用这种方式的配置时,其配置文件的增加非常快,每个bean 有需要两个bean 配
置一个目标,另外还需要使用TransactionProxyFactoryBean 配置一个代理bean 。

<?xml version="1.0" encoding="gb2312"?>
<'一Spring 配置文件的文件头,包含DTD 等信息->
<!DOCTYPE beans PUBL工C "-//SPRING//DTD BEAN//EN"
''http://www.springframework.org/dtd/spring-beans.dtd''>
<beans>
<!一定义数据源>
<bead 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>
<1-- 定义数据库密码一〉
<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>
<1--以下用来列出所有的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 工d="transactionManager"
class="org.springframework.orm.hibernate3.HibernateTransactihoManager">
<!-- HibernateTransactiohManager bean 需要依赖注入一个
SessionFactory bean 的引用-->
<property name="sessionFactory"><ref local="sessionFactory"/></
property>
</bea口〉
<!一定义DAO Bean ,作为事务代理的目标一〉
<bean id="personDaoTarget" class="lee.PersonDaoHibernate">
<!一为DAO bean 注入SessionFactory引用一〉
<property name="sessionFactory"><ref local="sessionFactory"/></
property>
</bead>
<!一定义DAO bean 的事务代理>
<bean id="personDao" class="org.spr工ngframework.transaction.interceptor.
TransactionProxyFactoryBean">
<!一为事务代理bean 注入事务管理器一〉
<property name="tra口sactionManager"><ref bean="transactionManager"
/></property>
<' 设置事务属性>
<property name="transactionAttributes">
<props>
<!-- 所有以f 工口d 开头的方法,采用required 的事务策略,并且只--〉
<prop key="find食">PROPAGATION_REQU工RED , 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 直接暴露在Spring 容器中,可以直接引
用,如果目标bean 被误引用,将导致业务操作不具备事务性。
为了避免这种现象,可将目标bean 配置成嵌套bean , ~面是目标bean 和事务代理
的配置代码:
<! 定义DAO bean 的事务代理一〉
<bean id="personDao" class="org.springframework.transaction.interceptor.
TransactionProxyFactoryBean">
<!一为事务代理bean 注入事务管理器>
<property name=" transactionManager" ><ref bea口="transactionManager"/
></property>
<!一设置事务属性>
<property name="transactionAttributes">
<props>
<!-- 所有以find 开头的方法,采用required 的事务策略,并且只读一〉
<prop key="find*">PROPAGAT工ON_REQUIRED, readOnly</prop>
<! 其他方法,采用required 的事务策略->
<prop key="*">PROPAGATION_REQUIRED</prop>
</props>
</property>
<!一为事务代理bean 设置目标bean -->
<property name="target">
<' 采用嵌套bean 配置目标bean-->
<bean class="lee.PersonDaoH工bernate">
<!一为DAO bean 注入SessionFactory引用一〉
<property 口ame="sess工onFactory"><ref local="sessionFactory"
/></property>
</bean>
</property>
</bead〉

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值