采用这种方式的配置时,其配置文件的增加非常快,每个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〉
分享到:
相关推荐
通过阅读源码,我们可以学习如何定义切面、切入点表达式和通知类型,并理解Spring如何在运行时生成代理对象以实现AOP功能。 再者,Spring的事务管理也是其关键特性之一。Spring提供了编程式和声明式事务管理两种...
`ProxyFactoryBean`和`AspectJAutoProxyCreator`等类用于生成和管理代理对象。 5. 事务管理实现 Spring提供了声明式和编程式两种事务管理方式。在源码中,关注`PlatformTransactionManager`接口及其实现,如`...
7.5. 使用ProxyFactoryBean创建AOP代理 7.5.1. 基础 7.5.2. JavaBean属性 7.5.3. 基于JDK和CGLIB的代理 7.5.4. 对接口进行代理 7.5.5. 对类进行代理 7.5.6. 使用“全局”通知器 7.6. 简化代理定义 7.7. 使用...
7.5. 使用ProxyFactoryBean创建AOP代理 7.5.1. 基础 7.5.2. JavaBean属性 7.5.3. 基于JDK和CGLIB的代理 7.5.4. 对接口进行代理 7.5.5. 对类进行代理 7.5.6. 使用“全局”通知器 7.6. 简化代理定义 7.7. 使用...
7.5. 使用ProxyFactoryBean创建AOP代理 7.5.1. 基础 7.5.2. JavaBean属性 7.5.3. 基于JDK和CGLIB的代理 7.5.4. 对接口进行代理 7.5.5. 对类进行代理 7.5.6. 使用“全局”advisor 7.6. 简化代理定义 7.7. ...
7.5. 使用ProxyFactoryBean创建AOP代理 7.5.1. 基础 7.5.2. JavaBean属性 7.5.3. 基于JDK和CGLIB的代理 7.5.4. 对接口进行代理 7.5.5. 对类进行代理 7.5.6. 使用“全局”advisor 7.6. 简化代理定义 7.7. ...
7.5. 使用ProxyFactoryBean创建AOP代理 7.5.1. 基础 7.5.2. JavaBean属性 7.5.3. 基于JDK和CGLIB的代理 7.5.4. 对接口进行代理 7.5.5. 对类进行代理 7.5.6. 使用“全局”advisor 7.6. 简化代理定义 7.7. 使用...