`

Spring Annotation和XML风格的声明式事务

    博客分类:
  • java
阅读更多
/**
*作者:andyao,email:andyaoy@gmail.com
*http://andyao.iteye.com/blog/153087
*/

简介

    Annotation还是XML的配置方式一直是Java world争论的焦点; 声明式事务管理(Declarative Transaction Management)是现在用的最多的一种事务管理方式。Spring同时提供了Annotation和XML配置方式的声明式事务管理。本文主要讨论这两种方式的各自特点,以及如何选择适当的声明式事务配置方式

声明式事务
    自从EJB提出了声明式事务管理的概念,声明式事务管理就成为事务管理的最佳选择。在Spring出来之前,使用声明式事务需要使用符合J2EE规范的应用服务器,例如Weblogic, Websphere等。Spring出来以后,可以通过 AOP非常优雅的实现了声明式事务,而不必需要应用服务器的支持,这也是很多人选择使用Spring的原因。
    Spring提供了Annotation风格和XML风格的声明式事务管理。下文将分别讨论这两种方式的优缺点。

XML风格

    从Sping1.x就开始支持的风格,在spirng2.0中同时使用AspectJ风格的AOP更加简化了这种风格的配置。这种方式也是目前使用最多的一种方式。

<beans>
    <aop:config>
        <aop:pointcut id="defaultServiceOperation" expression="execution(* x.y.service.*Service.*(..))"/>
        <aop:advisor pointcut-ref="defaultServiceOperation" advice-ref="defaultTxAdvice"/>
        <aop:pointcut id="noTxServiceOperation" expression="execution(* x.y.service.ddl.DefaultDdlManager.*(..))"/>
        <aop:advisor pointcut-ref="noTxServiceOperation" advice-ref="noTxAdvice"/>
    </aop:config>
   
    <!-- this bean will be transactional (c.f. the 'defaultServiceOperation' pointcut) -->
    <bean id="fooService" class="x.y.service.DefaultFooService"/>
   
    <!-- this bean will also be transactional, but with totally different transctional settings -->
    <bean id="anotherFooService" class="x.y.service.ddl.DefaultDdlManager"/>
   
    <tx:advice id="defaultTxAdvice">
        <tx:attributes>
            <tx:method name="get*" read-only="true"/>
            <tx:method name="*"/>
        </tx:attributes>
    </tx:advice>  

    <tx:advice id="noTxAdvice">
        <tx:attributes>
            <tx:method name="*" propagation="NEVER"/>
        </tx:attributes>
    </tx:advice>

    <!-- other transaction infrastructure beans such as a PlatformTransactionManager omitted... -->

</beans> 
  
优点: 简单明了,事务的配置在一个配置文件中体现,事务切面比较清楚。更改事务定义,不需要修改源代码。

缺点:不够灵活,对单个方法的事务管理不好配置。例如有如下类和方法
public class A {
  public m() {
     //需要事务
    a();
    //不需要事务,操作时间比较长。
    b();
  }
  //需要事务定义
  public n() {
   …
  }
}
 
Method a,而method b不需要事务。如果method b需要运行的时间比较长,这时:
  • 在method m上声明事务定义,那么method m很容易事务超时。当然你可以将transaction time out设的时间长一点,但这显然不是最好的解决办法。
  • 不在method m上声明事务定义,只在a上声明事务,但是class A的method n又需要事务定义,这时spring xml方式的声明式事务就无法定义了。只能将method m从class A中移除,放入一个单独的不需要事务定义的类中。这就有可能将一些语义上内聚的方法拆分到不同的类中。

Annotation风格

Spring2.0开始支持Annotation风格的声明式事务。可以在类或者方法级别声明事务,具体可参考spring手册

public class A { 
  public m() {
    a();
    //不需要事务,操作时间比较长
    b();
  }
  @Transactional
  public n() {
   …
  }
}

优点: 比较灵活,在一个类中,我可以选择指定哪些方法需要事务。在上一节的例子中,我们就可以在方法 n上声明事务, 而方法m不用声明事务,不用新建一个类。
缺点:事务定义分散在源代码中,没有一个统一的事务切面视图。修改事务定义,需要修改源代码。 

Summary

   在选择XML还是Annotation的问题上,java社区还是有很多争论,Annotation风格越来越受到重视。实际应用中,是一个case by case的问题。在经典的3层体系结构(presentation,service,persistent)中,现在通常会把事务边界定义在业务层,而选择以哪种方式声明事务可以参考以下几点建议:

  • 如果service层的方法绝大部分都是数据库操作,我们可以使用XML风格在service层声明事务边界。
  • 如果service层的方法除了数据库操作外,还有很多耗时的业务方法(例如XML风格一节的例子),那么就可以采用Annotation风格。
  • 也可以将XML风格和Annotation风格结合起来一起使用。这是我推荐使用的,只使用两种风格的优点,而避免了它们的缺点。
分享到:
评论

相关推荐

    Spring使用XML配置声明式事务

    在Spring框架中,声明式事务管理是实现事务处理...在博文"Spring使用XML配置声明式事务"中,作者详细讲解了每个步骤,并可能通过示例代码展示了如何实际应用这些配置,帮助读者更好地理解和掌握Spring声明式事务管理。

    使用Spring的声明式事务----Annotation注解方式

    本篇文章将深入探讨如何使用Spring的声明式事务,特别是通过Annotation注解方式进行设置。 首先,我们需要理解什么是声明式事务。与编程式事务(即手动编写事务管理代码)不同,声明式事务是通过AOP(面向切面编程...

    Xml文件配置实现声明式事务管理

    在Spring框架中,声明式事务管理是一种非常重要的特性,它允许开发者通过XML配置或注解来定义事务的边界,而无需在业务代码中显式地管理事务。这种方式极大地提高了代码的可读性和可维护性。本篇文章将深入探讨如何...

    spring+mybatis的声明式事务

    Spring提供两种事务管理方式:编程式事务管理和声明式事务管理。编程式事务管理通过编写代码来控制事务的开始、提交、回滚等操作,灵活性高但侵入性强。相比之下,声明式事务管理则更加简洁,它通过配置或注解来...

    spring3,hibernate4 配置声明式事务管理(annotation方式)

    总的来说,Spring 3和Hibernate 4结合使用声明式事务管理,使得我们无需在代码中显式调用事务开始、提交和回滚,而是通过注解和配置文件来声明事务的边界和行为。这种方式降低了代码的复杂度,提高了可维护性和可...

    spring声明式事务处理demo

    1. **配置Spring容器**:在Spring的配置文件(如`applicationContext.xml`)中,我们需要定义一个`&lt;tx:annotation-driven&gt;`元素,这将启用基于注解的声明式事务管理。同时,需要配置数据源(DataSource)和事务管理...

    spring3、 hibernate4 配置声明式事务管理(annotation方式)

    本篇将详细介绍如何在Spring 3和Hibernate 4中配置声明式事务管理,采用注解方式。 一、Spring的事务管理 Spring提供了两种事务管理方式:编程式事务管理和声明式事务管理。编程式事务管理需要在代码中显式地调用...

    spring声明式事务.zip

    Spring提供了两种声明式事务管理方式:基于XML的配置和基于注解的配置。 2. **基于XML的声明式事务管理** 在`spring-demo26-声明式事务-xml`示例中,我们会在Spring的配置文件中定义事务管理器(如...

    spring声明式事务管理配置方式

    - 在传统的Spring配置中,你可以通过`&lt;tx:annotation-driven&gt;`元素启用声明式事务管理,并指定事务管理器。例如: ```xml &lt;bean id="transactionManager" class="org.springframework.jdbc.datasource....

    spring3+hibernate4声明式事务配置(xml方式)

    本教程将深入探讨如何使用XML配置来设置Spring3和Hibernate4的声明式事务管理。 首先,我们需要了解什么是声明式事务管理。与编程式事务管理不同,声明式事务管理允许开发者通过注解或XML配置来声明事务边界,而...

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

    总之,Spring的声明式事务管理使得开发者可以专注于业务逻辑,而不必关心事务管理的细节,极大地提高了开发效率和代码质量。通过理解这些配置方式,你可以根据项目需求灵活选择,确保事务管理的正确性和高效性。

    Spring声明式事务配置管理方法

    Spring 声明式事务管理是Spring框架中的一个重要特性,它允许开发者在不编写任何事务管理代码的情况下,通过配置来管理事务。这种方式极大地简化了事务处理,并提高了代码的可维护性。以下是关于Spring声明式事务...

    Hibernate编程式事务与Spring Aop的声明式事务(spring与hibernate集成)

    本篇文章将重点讨论如何在Spring框架中集成Hibernate,并探讨编程式事务管理和Spring AOP的声明式事务。 首先,让我们理解Spring与Hibernate的集成。为了整合这两个库,你需要在Spring配置文件中定义Hibernate的...

    Spring与Hibernate集成---声明式事务

    接下来,为了启用声明式事务管理,我们通常会在Spring的配置文件中添加`&lt;tx:annotation-driven&gt;`元素,这样Spring会自动扫描带有特定事务注解(如@Transactional)的方法,并根据注解的属性来管理事务。 ```xml ...

    Spring ax/aop声明式事务配置实例

    在Spring框架中,AOP(面向切面编程)和声明式事务管理是两个核心特性,它们极大地简化了Java企业级应用中的事务处理。本实例将深入探讨如何在Spring中使用AOP来实现声明式事务配置。 一、Spring AOP基础 AOP允许...

    spring3+hibernate4配置声明式事务管理(annotation方式)

    本实例工程展示了如何在Spring 3和Hibernate 4中使用注解进行声明式事务管理,这是一种高效且易于维护的方法。接下来,我们将详细讨论相关知识点。 1. **Spring框架**:Spring是一个全面的后端开发框架,它提供了...

    实验 spring 声明事务

    实验 "Spring 声明事务" 是 Java 高级编程中的一个重要环节,旨在让学生掌握 Spring 框架中声明式事务管理的配置和使用。在实际应用中,事务管理是确保数据一致性、完整性和可靠性的关键组件。Spring 提供了声明式...

    spring+ibatis声明式事务Demo

    在Spring中,声明式事务管理主要有两种方式:基于XML的配置和基于注解的配置。基于XML的配置通常在`&lt;tx:annotation-driven&gt;`元素中声明,然后在Service层的方法上使用`@Transactional`注解来定义事务边界。基于注解...

    Spring 事务 (二) Spring 声明式事务 配置

    通过上述配置和理解,开发者可以轻松地在Spring应用中实现声明式事务管理,确保业务操作的原子性和一致性,从而提高系统的可靠性和稳定性。在实际项目中,根据业务需求和性能考虑,选择合适的事务管理方式和配置是...

Global site tag (gtag.js) - Google Analytics