`
lighter
  • 浏览: 495139 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

复习笔记:利用spring的BeanName简化事务管理配置

阅读更多
常常在项目开发时候,很多目标bean需要生成事务代理,当然可以为每一个目标bean配置一个
TransactionProxyFactoryBean  bean啦。这样做的话,可能最后变成配置地狱,此时可以考虑使用自动事务代理。
根据spring的BeanName来管理自动代理可以这样做:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">

<beans>
	<bean id="dataSource"
		class="org.apache.commons.dbcp.BasicDataSource">
		<property name="driverClassName">
			<value>com.mysql.jdbc.Driver</value>
		</property>
		<property name="url">
			<value>jdbc:mysql://localhost:3306/myuser</value>
		</property>
		<property name="username">
			<value>lighter</value>
		</property>
		<property name="password">
			<value>12345</value>
		</property>
	</bean>
	<bean id="sessionFactory"
		class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
		<property name="dataSource" ref="dataSource" />
		<property name="hibernateProperties">
			<props>
				<prop key="hibernate.dialect">
					org.hibernate.dialect.MySQLDialect
				</prop>
				<prop key="hibernate.show_sql">true</prop>
			</props>
		</property>
		<property name="mappingResources">
			<list>
				<value>org/mmc/dao/domain/User.hbm.xml</value>
			</list>
		</property>
	</bean>
	<!-- 配置Hibernate的事务管理器 -->
	<bean id="transactionManager"
		class="org.springframework.orm.hibernate3.HibernateTransactionManager">
		<property name="sessionFactory" ref="sessionFactory" />
	</bean>

	<!-- 定义事务拦截器bean -->
	<bean id="transactionInterceptor"
		class="org.springframework.transaction.interceptor.TransactionInterceptor">
		<property name="transactionManager" ref="transactionManager" />
		<property name="transactionAttributes">
			<props>
				<prop key="insert*">PROPAGATION_REQUIRED</prop>
				<prop key="find*">PROPAGATION_REQUIRED,readOnly</prop>
				<prop key="*">PROPAGATION_REQUIRED</prop>
			</props>
		</property>
	</bean>

	<!-- 定义BeanNameAutoProxyCreator-->
	<bean
		class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">
		<property name="beanNames">
		<!-- 所有名字以DAO,Service结尾的bean,将由该"bean后处理器"为其创建事务代理;实际上应该在业务层进行事务管理,这里只是举一个简单例子 -->
			<value>*DAO,*Service</value>
		</property>
		<!--  下面定义BeanNameAutoProxyCreator所需的事务拦截器-->
		<property name="interceptorNames">
			<list>
				<!-- 可以增加其他的拦截器 -->
				<value>transactionInterceptor</value>
			</list>
		</property>
	</bean>

	<!-- 举下面这一个例子:这时候,这一个bean已经有了事务管理,可以增加类似的bean -->
	<bean id="searchUserDAO" class="org.mmc.dao.impl.SearchUserDAO">
		<property name="sessionFactory" ref="sessionFactory" />
	</bean>
</beans>


下面再看一种也是常用的使用bean继承简化事务代理配置
	<bean id="test1" class="test.TransactionTestImpl">
		<property name="ds"><ref local="dataSource"/></property>
	</bean>

	<bean id="test2" class="test.TestImpl">
		<property name="ds"><ref local="dataSource"/></property>
	</bean>

    <bean id="baseTxProxy" lazy-init="true" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean" abstract="true"> 
        <property name="transactionManager"><ref bean="transactionManager"/></property> 
        <property name="transactionAttributes"> 
            <props> 
                <prop key="*">PROPAGATION_REQUIRED</prop> 
            </props> 
        </property> 
    </bean> 

    <bean id="testTrans1" parent="baseTxProxy"> 
        <property name="target"> 
            <ref local="test1"/> 
        </property> 
    </bean> 
    <bean id="testTrans2" parent="baseTxProxy"> 
        <property name="target"> 
            <ref local="test2"/> 
        </property> 
    </bean> 

使用继承的方法,其配置文件是增量式的,不如采用上面所说的第一种方法简捷,精炼。

很晚了,突然想写博客,就上来写了这一篇很短的文章吧.
嗯,累了,过一会儿睡觉去....
分享到:
评论
4 楼 fangang 2007-02-02  
好方法,可以试试
3 楼 blackstreet 2007-02-02  
我用普通的没问题,一个DAO对应 一个udsStaffDAOProxy。用上面第一种就报错,
org.springframework.beans.factory.BeanCreationException: Error creating bean with name '/login' defined in ServletContext resource [/WEB-INF/applicationContext.xml]: Error setting property values; nested exception is org.springframework.beans.PropertyAccessExceptionsException: PropertyAccessExceptionsException (1 errors); nested propertyAccessExceptions are: [org.springframework.beans.TypeMismatchException: Failed to convert property value of type [$Proxy1] to required type [com.oa.DAO.UdsStaffDAO] for property 'udsStaffDAO']
这是我的代码
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
<property name="driverClassName">
<value>com.microsoft.jdbc.sqlserver.SQLServerDriver</value>
</property>
<property name="url">
<value>jdbc:microsoft:sqlserver://127.0.0.1:1433</value>
</property>
<property name="username">
<value>sa</value>
</property>
<property name="password">
<value></value>
</property>
</bean>
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="dataSource">
<ref bean="dataSource"></ref>
</property>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">org.hibernate.dialect.SQLServerDialect</prop>
</props>
</property>
<property name="mappingResources">
<list>
<value>com/oa/hibernate/UdsStaff.hbm.xml</value>
</list>
</property>
</bean>

<!-- 配置Hibernate的事务管理器 --> 
<bean id="transactionManager" 
        class="org.springframework.orm.hibernate3.HibernateTransactionManager"> 
        <property name="sessionFactory" ref="sessionFactory" /> 
    </bean> 
 
    <!-- 定义事务拦截器bean --> 
    <bean id="transactionInterceptor" 
        class="org.springframework.transaction.interceptor.TransactionInterceptor"> 
        <property name="transactionManager" ref="transactionManager" /> 
        <property name="transactionAttributes"> 
            <props> 
<prop key="save*">PROPAGATION_REQUIRED</prop>
<prop key="delete*">PROPAGATION_REQUIRED</prop>
<prop key="find*">PROPAGATION_REQUIRED,readOnly</prop>
            </props> 
        </property> 
    </bean> 
 
    <bean   class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator"> 
        <property name="beanNames"> 
                   <value>*DAO</value> 
        </property> 
        <property name="interceptorNames"> 
            <list> 
                <value>transactionInterceptor</value> 
            </list> 
        </property> 
    </bean> 

<!--用户信息的DAO-->
<bean id="UdsStaffDAO" class="com.oa.DAO.UdsStaffDAO" >
<property name="sessionFactory"><ref bean="sessionFactory" /></property>
</bean>
2 楼 wdl123 2007-01-24  
这个方法不错,如果BEAN很多的情况,上述方法和用parent继承哪个性能比较好?
1 楼 justcode 2007-01-22  
对的,这种方法是挺好的解决了一些问题.

相关推荐

    spring bean XML配置入门

    spring bean配置 运行环境:eclipse 构建工具:maven 不提供maven构建,maven用来解决jar包的依赖

    SpringBean 调用 事务 AOP

    Spring,Bean调用,事务,AOP,配置详细说明 提升开发效率

    spring五种事务配置demo

    测试spring事务管理 搭建了ssh框架的web工程 本工程用到的数据库表很简单 user(id, name) 可自行创建 本例所有的事务放在service层进行管理,方法中间抛出运行时异常以测试是否回滚 Spring配置文件中关于事务...

    SPRING:bean配置properties

    SPRING:bean配置properties

    创建SpringBean配置工具类

    创建SpringBean配置工具类(安全)如: &lt;bean id=... scope="prototype"&gt;&lt;/bean&gt;

    Spring bean 管理

    Spring bean 管理大全 全面的介绍springbean各种操作原理

    Spring Bean创建初始化流程.docx

    Spring Bean创建初始化流程

    spring bean的生命周期

    spring bean 的生命周期,把运行结果的日志,用sublime打开对比查看,你会有比较清晰的认识

    Spring bean 动态注册,jar包热替换

    Spring bean 一般通过配置文件和注解进行加载,如果要实现jar或class文件,动态实现spring bean 的动态加载,并通过UrlClassLoader完成jar和class文件的加载。可以实现jar的热替换。spring的bean动态加载则需要对...

    JavaEE spring半自动bean管理事务案例

    JavaEE spring半自动bean管理事务案例

    spring bean 属性总结

    spring bean 属性总结

    Spring的Bean配置说明

    Spring的Bean配置Spring的Bean配置说明说明

    一个springbean文件

    bean文件 springbean文件

    Spring的Bean配置

    Spring IOC和DI概述,Bean的配置形式,IOC容器BeanFactory和ApplicationContext概述,依赖注入的方式,属性注入,构造器注入等案例

    基于java的企业级应用开发:声明式事务管理.ppt

    使用@Transactional注解时,可以通过参数配置事务详情: 5.2.2 基于Annotation方式的声明式事务 * * * * * * * * 声明式事务管理 如何实现Spring的声明式事务管理? 5.2 声明式事务管理 Spring的声明式事务管理可以...

    Spring的学习笔记

    (三) XML文件形式配置Spring事务管理 37 四、 HibernateTemplate 38 (一) HibernateTemplate 38 (二) HibernateDaoSupport 39 第十一课:Spring整合-SSH 40 一、 第一步:加入jar包(需要的jar包列表) 40 二、 第二步...

    Spring Bean 加载顺序 .

    Spring Bean 加载顺序 实验小例子

    Spring和Hibernate学习笔记

    Hibernate: 第一课:第一个hibernate项目 第二课:测试实体对象的生命周期 第三课:hibernate基本映射 第四课:hibernate多对一关联映射 ...................... ...第五课:spring对AOP的只是(采用配置文件的方式)

    Spring+3.x企业应用开发实战光盘源码(全)

     第9章:介绍了Spring事务管理的工作机制,通过XML、注解等方式进行事务管理配置,同时还讲解了JTA事务配置知识。  第10章:对实际应用中Spring事务管理各种疑难问题进行透彻的剖析,让读者对Spring事务管理不再有...

    Spring 2.x配置详解

    Spring2.5提供了更灵活的配置方法, 本文档详细介绍了Spring2.x通过XML文件和Annotation如何配置Spring bean,事务管理配置,AOP的详细配置,以及其他Spring所提供支持的配置。

Global site tag (gtag.js) - Google Analytics