论坛首页 Java企业应用论坛

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

浏览 11191 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2006-12-30  
常常在项目开发时候,很多目标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> 

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

很晚了,突然想写博客,就上来写了这一篇很短的文章吧.
嗯,累了,过一会儿睡觉去....
   发表时间:2007-01-22  
对的,这种方法是挺好的解决了一些问题.
0 请登录后投票
   发表时间:2007-01-24  
这个方法不错,如果BEAN很多的情况,上述方法和用parent继承哪个性能比较好?
0 请登录后投票
   发表时间: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>
0 请登录后投票
   发表时间:2007-02-02  
好方法,可以试试
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics