用TransactionProxyFactoryBean实现spring的声明式事务

转载自http://uule.iteye.com/blog/893890,好好学习研究

 

spring对声明式事务是通过它的AOP框架实现的。要在spring中使用声明式事务,需用到TransactionProxyFactoryBean,它类似于ProxyFactoryBean,不过其目的是将方法包装在事务上下文中。

可以创建自己的ProxyFactoryBean来处理事务,也能达到同样的效果,但TransactionProxyFactoryBean是专门为声明式事务设计的,用它会简单些。

网上的一个例子:

Java代码 复制代码 收藏代码
  1. <bean id="testAction" class="test.action.Stuts2ActionTest">   
  2.     <property name="service" ref="templatesService"></property>   
  3. </bean>   
  4.  
  5. <bean id="templatesService"   
  6.     class="test.service.impl.TaoTemplatesServiceImpl">   
  7.     <property name="dao" ref="templatesDAO" />   
  8. </bean> 
     <bean id="testAction" class="test.action.Stuts2ActionTest">  
         <property name="service" ref="templatesService"></property>  
     </bean>  
   
     <bean id="templatesService"  
         class="test.service.impl.TaoTemplatesServiceImpl">  
         <property name="dao" ref="templatesDAO" />  
     </bean>

主要地方:

Java代码 复制代码 收藏代码
  1. <!--   定义DAO bean的事务代理-->   
  2. <bean id="templatesDAO"   
  3.     class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean ">   
  4.     <!--   为事务代理bean注入事务管理器-->   
  5.     <property name="transactionManager">   
  6.         <ref bean="transactionManager" />   
  7.     </property>   
  8.  
  9.     <!--   设置事务属性-->   
  10.     <property name="transactionAttributes">   
  11.         <props>   
  12.             <!--   所有以add开头的方法,采用required的事务策略,并且只读-->   
  13.             <prop key="add*">PROPAGATION_REQUIRED</prop>   
  14.             <!--   所有以mod开头的方法,采用required的事务策略,并且只读-->   
  15.             <prop key="mod*">PROPAGATION_REQUIRED</prop>   
  16.             <!--   所有以del开头的方法,采用required的事务策略,并且只读-->   
  17.             <prop key="del*">PROPAGATION_REQUIRED</prop>   
  18.             <!--   其他方法,采用required的事务策略 -->   
  19.             <prop key="*">readOnly</prop>   
  20.         </props>   
  21.     </property>  
  22.  
  23.     <!--   为事务代理bean设置目标bean -->   
  24.     <property name="target">   
  25.         <!--   采用嵌套bean配置目标bean-->   
  26.         <bean class="test.dao.impl.TaoTemplatesDAOImpl">   
  27.             <property name="sessionFactory">   
  28.                 <ref local="sessionFactory" />   
  29.             </property>   
  30.         </bean>   
  31.     </property>   
  32. </bean>  
     <!--   定义DAO bean的事务代理-->  
     <bean id="templatesDAO"  
         class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean ">  
         <!--   为事务代理bean注入事务管理器-->  
         <property name="transactionManager">  
             <ref bean="transactionManager" />  
         </property>  

         <!--   设置事务属性-->  
         <property name="transactionAttributes">  
             <props>  
                 <!--   所有以add开头的方法,采用required的事务策略,并且只读-->  
                 <prop key="add*">PROPAGATION_REQUIRED</prop>  
                 <!--   所有以mod开头的方法,采用required的事务策略,并且只读-->  
                 <prop key="mod*">PROPAGATION_REQUIRED</prop>  
                 <!--   所有以del开头的方法,采用required的事务策略,并且只读-->  
                 <prop key="del*">PROPAGATION_REQUIRED</prop>  
                 <!--   其他方法,采用required的事务策略 -->  
                 <prop key="*">readOnly</prop>  
             </props>  
         </property> 
 
         <!--   为事务代理bean设置目标bean -->  
         <property name="target">  
             <!--   采用嵌套bean配置目标bean-->  
             <bean class="test.dao.impl.TaoTemplatesDAOImpl">  
                 <property name="sessionFactory">  
                     <ref local="sessionFactory" />  
                 </property>  
             </bean>  
         </property>  
     </bean> 

Java代码 复制代码 收藏代码
  1. <!--   定义事务管理器,使用适用于Hibernte的事务管理器-->   
  2.      <bean id="transactionManager"   class="org.springframework.orm.hibernate3.HibernateTransactionManager">   
  3.       <!--   HibernateTransactionManager   bean需要依赖注入一个SessionFactory bean的引用-->   
  4.          <property name="sessionFactory">   
  5.              <ref local="sessionFactory" />   
  6.          </property>   
  7.      </bean> 
<!--   定义事务管理器,使用适用于Hibernte的事务管理器-->  
     <bean id="transactionManager"   class="org.springframework.orm.hibernate3.HibernateTransactionManager">  
      <!--   HibernateTransactionManager   bean需要依赖注入一个SessionFactory bean的引用-->  
         <property name="sessionFactory">  
             <ref local="sessionFactory" />  
         </property>  
     </bean>

Java代码 复制代码 收藏代码
  1. <!--定义数据源-->   
  2. <bean id="dataSource"   
  3.     class="org.apache.commons.dbcp.BasicDataSource">   
  4.     <!--   定义数据库驱动-->   
  5.     <property name="driverClassName">   
  6.         <value>oracle.jdbc.driver.OracleDriver</value>   
  7.     </property>   
  8.     <!--   定义数据库url-->   
  9.     <property name="url">   
  10.         <value>jdbc:oracle:thin:@192.168.1.96:1521:yxdb</value>   
  11.     </property>   
  12.     <!--   定义数据库用户名-->   
  13.     <property name="username">   
  14.         <value>yxuser</value>   
  15.     </property>   
  16.     <!--   定义数据库密码-->   
  17.     <property name="password">   
  18.         <value>yxuser</value>   
  19.     </property>   
  20. </bean>   
  21.  
  22. <!--定义一个hibernate的SessionFactory-->   
  23. <bean id="sessionFactory"   
  24.     class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">   
  25.     <!--   定义SessionFactory必须注入DataSource-->   
  26.     <property name="dataSource">   
  27.         <ref local="dataSource" />   
  28.     </property>   
  29.     <property name="mappingResources">   
  30.         <list>   
  31.             <!--以下用来列出所有的PO映射文件-->   
  32.             <value>test/mapping/Tao_Templates.hbm.xml</value>   
  33.         </list>   
  34.     </property>   
  35.     <property name="hibernateProperties">   
  36.         <props>   
  37.             <prop key="hibernate.dialect">   
  38.                 org.hibernate.dialect.Oracle10gDialect   
  39.             </prop>   
  40.             <prop key="hibernate.show_sql">true</prop>   
  41.             <!--此处用来定义hibernate的SessionFactory的属性:   
  42.                 不同数据库连接,启动时选择create,update,create-drop -->   
  43.             <prop key="hibernate.hbm2ddl.auto">update</prop>   
  44.         </props>   
  45.     </property>   
  46. </bean>  
     <!--定义数据源-->  
     <bean id="dataSource"  
         class="org.apache.commons.dbcp.BasicDataSource">  
         <!--   定义数据库驱动-->  
         <property name="driverClassName">  
             <value>oracle.jdbc.driver.OracleDriver</value>  
         </property>  
         <!--   定义数据库url-->  
         <property name="url">  
             <value>jdbc:oracle:thin:@192.168.1.96:1521:yxdb</value>  
         </property>  
         <!--   定义数据库用户名-->  
         <property name="username">  
             <value>yxuser</value>  
         </property>  
         <!--   定义数据库密码-->  
         <property name="password">  
             <value>yxuser</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>test/mapping/Tao_Templates.hbm.xml</value>  
             </list>  
         </property>  
         <property name="hibernateProperties">  
             <props>  
                 <prop key="hibernate.dialect">  
                     org.hibernate.dialect.Oracle10gDialect  
                 </prop>  
                 <prop key="hibernate.show_sql">true</prop>  
                 <!--此处用来定义hibernate的SessionFactory的属性:  
                     不同数据库连接,启动时选择create,update,create-drop -->  
                 <prop key="hibernate.hbm2ddl.auto">update</prop>  
             </props>  
         </property>  
     </bean> 

《Spring IN Action》例子:


Java代码 复制代码 收藏代码
  1. <bean id="courseServiceTarget" class="com.test.CourseServiceImpl"
  2. </bean> 
<bean id="courseServiceTarget" class="com.test.CourseServiceImpl">
</bean>

当Service比较多时,这种方式XML比较庞大,有以下两种解决方式:

1、Bean继承

2、AOP自动代理


Bean继承:

Java代码 复制代码 收藏代码
  1. <bean id="abstractTxDefinition" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean "  lazy-init="true"
  2.  
  3.    <property name="transactionManager"
  4.         <ref bean="transactionManager"
  5.    </property> 
  6.  
  7.    <property name="transactionAttributeSource"
  8.          <ref bean="attributeSource"
  9.    </property> 
  10. </bean> 
<bean id="abstractTxDefinition" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean "  lazy-init="true">

   <property name="transactionManager">
        <ref bean="transactionManager">
   </property>

   <property name="transactionAttributeSource">
         <ref bean="attributeSource">
   </property>
</bean>


Java代码 复制代码 收藏代码
  1. <bean id="courseService" parent="abstractTxDefinition"
  2.     <property name="target"
  3.         <bean class="com.test.CourceServiceImpl"
  4.      </property> 
  5. </bean> 
  6.  
  7. //将另一个bean事务化 
  8.  
  9. <bean id="studentService" parent="abstractTxDefinition"
  10.     <property name="target"
  11.         <bean class="com.test.StudentServiceImpl"
  12.      </property> 
  13. </bean> 
<bean id="courseService" parent="abstractTxDefinition">
    <property name="target">
        <bean class="com.test.CourceServiceImpl">
     </property>
</bean>

//将另一个bean事务化

<bean id="studentService" parent="abstractTxDefinition">
    <property name="target">
        <bean class="com.test.StudentServiceImpl">
     </property>
</bean>

AOP自动代理:

http://uule.iteye.com/admin/blogs/894055

 

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值