`
uule
  • 浏览: 6352156 次
  • 性别: Icon_minigender_1
  • 来自: 一片神奇的土地
社区版块
存档分类
最新评论

用TransactionProxyFactoryBean实现spring的声明式事务

阅读更多

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

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

网上的一个例子:

     <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>

 主要地方:

     <!--   定义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> 
 
<!--   定义事务管理器,使用适用于Hibernte的事务管理器-->  
     <bean id="transactionManager"   class="org.springframework.orm.hibernate3.HibernateTransactionManager">  
      <!--   HibernateTransactionManager   bean需要依赖注入一个SessionFactory bean的引用-->  
         <property name="sessionFactory">  
             <ref local="sessionFactory" />  
         </property>  
     </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》例子:


<bean id="courseServiceTarget" class="com.test.CourseServiceImpl">
</bean>

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

1、Bean继承

2、AOP自动代理


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>

 

 

<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

  • 大小: 46 KB
  • 大小: 48.3 KB
分享到:
评论
1 楼 footman265 2012-08-13  
虽然基础,但是写的很清楚,不错

相关推荐

    Spring源代码解析(六):Spring声明式事务处理.doc

    在 Spring 中,声明式事务处理可以通过配置 TransactionProxyFactoryBean 来实现。TransactionProxyFactoryBean 是一个 FactoryBean,它可以创建一个代理对象,该代理对象可以拦截业务方法的调用,并对事务进行管理...

    Spring使用TransactionProxyFactoryBean声明式事务配置实例

    总的来说,Spring的TransactionProxyFactoryBean是声明式事务管理的一种高效实现方式,它通过代理对象实现了事务策略与业务逻辑的解耦,使我们的代码更加简洁和易于维护。通过深入理解和灵活运用,我们可以更好地...

    spring声明式事务配置

    ### 标题解读:Spring声明式事务配置 Spring框架提供了两种主要类型的事务管理方式:编程式事务管理和声明式事务管理。声明式事务管理通过XML配置或注解的形式定义事务边界,使得业务逻辑与事务控制分离。 ### ...

    spring 事务管理例子(TransactionProxyFactoryBean代理机制 和 tx/aop)

    总结来说,本例子通过`TransactionProxyFactoryBean`和`@Transactional`展示了如何在Spring中实现声明式事务管理,这两种方式都利用了AOP来封装事务逻辑,使代码更加整洁,降低了事务管理的复杂性。在实际应用中,...

    Spring实战之使用TransactionProxyFactoryBean实现声明式事务操作示例

    总结一下,本示例展示了如何使用Spring的`TransactionProxyFactoryBean`来实现声明式事务管理。通过配置事务代理,我们可以将事务控制逻辑与业务代码解耦,提高代码的可维护性和可复用性。在实际开发中,这种模式...

    spring声明式事务配置方法.docx

    首先,Spring声明式事务管理主要依赖于AOP(面向切面编程)实现。通过在配置文件中定义事务的规则,Spring可以在特定的方法执行前后自动地进行事务的开启、提交、回滚等操作。 在提供的代码示例中,可以看到一个...

    声明式事务控制spring+hibernate集成

    在"声明式事务控制,spring2.5+hibernate3集成源码"中,开发者可以学习如何配置Spring的事务管理器,以及如何在Hibernate的SessionFactory和SessionFactoryBuilder上使用Spring的TransactionProxyFactoryBean来创建...

    spring2.0声明式事务

    除了使用 XML 配置外,还可以通过继承特定的基类来实现声明式事务管理。这种方式更简洁,适合于多个具有相似事务属性的服务类。 ```xml class="org.springframework.transaction.interceptor....

    spring基于AOP实现事务

    总结一下,Spring基于AOP实现的事务管理通过TransactionProxyFactoryBean,结合声明式事务配置,能够提供一种高效且易于维护的事务解决方案。它允许我们在不修改业务逻辑的情况下,统一管理和控制事务,提升了代码的...

    Spring中的四种声明式事务的配置

    在Spring框架中,声明式事务管理是通过AOP(面向切面编程)实现的,它允许开发者无需在业务代码中显式处理事务,而是通过配置来控制事务的边界。Spring提供了四种不同的方式来配置声明式事务,这使得事务管理更加...

    Spring编程式和声明式事务实例讲解小结

    * 基于TransactionInterceptor的声明式事务:Spring声明式事务的基础,通常也不建议使用这种方式。 * 基于TransactionProxyFactoryBean的声明式事务:第一种方式的改进版本,简化了配置文件的书写。 * 基于和命名...

    Spring配置事务在DAO层和业务逻辑层

    Spring通过AOP实现声明式事务管理。通常通过TransactionProxyFactoryBean设置Spring事务代理。

    spring 事务代理配置

    本文将深入探讨如何在Spring框架中使用`TransactionProxyFactoryBean`来实现声明式事务代理配置。 #### 声明式事务管理概述 声明式事务管理通过在配置文件或注解中定义事务边界,而不是在业务代码中显式地管理事务...

    spring学习事务源码

    首先,Spring事务管理有两种主要模式:编程式事务管理和声明式事务管理。编程式事务管理通过调用`PlatformTransactionManager`接口提供的方法进行显式控制,如`beginTransaction()`, `commit()`, 和`rollback()`。...

    Spring事务原理、Spring事务配置的五种方式

    Spring事务管理创造性的解决了很多以前要用重量级的应用服务器才能解决的事务问题,那么其实现原理一定很深奥吧?可是如果读者仔细研究了Spring事务管理的代码以后就会发现,事务管理其实也是如此简单的事情。这也...

    Spring+Hibernate事务管理

    * 声明式事务管理: * 基于TransactionProxyFactoryBean的方式.(很少使用) * 需要为每个进行事务管理的类,配置一个TransactionProxyFactoryBean进行增强. * 基于AspectJ的XML方式.(经常使用) * 一旦配置好之后,...

    详解Spring学习之声明式事务管理

    本文将深入探讨Spring声明式事务管理的原理和配置。 首先,理解声明式事务管理的核心概念。声明式事务管理是基于Spring的AOP(面向切面编程)实现的,它会在目标方法执行前后自动插入事务控制逻辑。这意味着,我们...

    Spring事务相关类Uml图

    首先,Spring提供了两种事务管理方式:编程式事务管理和声明式事务管理。编程式事务管理通过调用`PlatformTransactionManager`接口的`beginTransaction()`、`commit()`和`rollback()`方法来手动控制事务的开始、提交...

    详细说明spring事务配置的5种方式

    一般来说,声明式事务管理由于其简洁和低侵入性,是大部分Spring应用的首选。而编程式事务管理则在需要更细粒度控制或与其他框架集成时更为合适。了解这些配置方式,可以帮助你更灵活地在Spring应用中实现事务管理。

Global site tag (gtag.js) - Google Analytics