/***作者: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框架中,声明式事务管理是实现事务处理...在博文"Spring使用XML配置声明式事务"中,作者详细讲解了每个步骤,并可能通过示例代码展示了如何实际应用这些配置,帮助读者更好地理解和掌握Spring声明式事务管理。
本篇文章将深入探讨如何使用Spring的声明式事务,特别是通过Annotation注解方式进行设置。 首先,我们需要理解什么是声明式事务。与编程式事务(即手动编写事务管理代码)不同,声明式事务是通过AOP(面向切面编程...
在Spring框架中,声明式事务管理是一种非常重要的特性,它允许开发者通过XML配置或注解来定义事务的边界,而无需在业务代码中显式地管理事务。这种方式极大地提高了代码的可读性和可维护性。本篇文章将深入探讨如何...
Spring提供两种事务管理方式:编程式事务管理和声明式事务管理。编程式事务管理通过编写代码来控制事务的开始、提交、回滚等操作,灵活性高但侵入性强。相比之下,声明式事务管理则更加简洁,它通过配置或注解来...
总的来说,Spring 3和Hibernate 4结合使用声明式事务管理,使得我们无需在代码中显式调用事务开始、提交和回滚,而是通过注解和配置文件来声明事务的边界和行为。这种方式降低了代码的复杂度,提高了可维护性和可...
1. **配置Spring容器**:在Spring的配置文件(如`applicationContext.xml`)中,我们需要定义一个`<tx:annotation-driven>`元素,这将启用基于注解的声明式事务管理。同时,需要配置数据源(DataSource)和事务管理...
本篇将详细介绍如何在Spring 3和Hibernate 4中配置声明式事务管理,采用注解方式。 一、Spring的事务管理 Spring提供了两种事务管理方式:编程式事务管理和声明式事务管理。编程式事务管理需要在代码中显式地调用...
Spring提供了两种声明式事务管理方式:基于XML的配置和基于注解的配置。 2. **基于XML的声明式事务管理** 在`spring-demo26-声明式事务-xml`示例中,我们会在Spring的配置文件中定义事务管理器(如...
- 在传统的Spring配置中,你可以通过`<tx:annotation-driven>`元素启用声明式事务管理,并指定事务管理器。例如: ```xml <bean id="transactionManager" class="org.springframework.jdbc.datasource....
本教程将深入探讨如何使用XML配置来设置Spring3和Hibernate4的声明式事务管理。 首先,我们需要了解什么是声明式事务管理。与编程式事务管理不同,声明式事务管理允许开发者通过注解或XML配置来声明事务边界,而...
总之,Spring的声明式事务管理使得开发者可以专注于业务逻辑,而不必关心事务管理的细节,极大地提高了开发效率和代码质量。通过理解这些配置方式,你可以根据项目需求灵活选择,确保事务管理的正确性和高效性。
Spring 声明式事务管理是Spring框架中的一个重要特性,它允许开发者在不编写任何事务管理代码的情况下,通过配置来管理事务。这种方式极大地简化了事务处理,并提高了代码的可维护性。以下是关于Spring声明式事务...
本篇文章将重点讨论如何在Spring框架中集成Hibernate,并探讨编程式事务管理和Spring AOP的声明式事务。 首先,让我们理解Spring与Hibernate的集成。为了整合这两个库,你需要在Spring配置文件中定义Hibernate的...
接下来,为了启用声明式事务管理,我们通常会在Spring的配置文件中添加`<tx:annotation-driven>`元素,这样Spring会自动扫描带有特定事务注解(如@Transactional)的方法,并根据注解的属性来管理事务。 ```xml ...
在Spring框架中,AOP(面向切面编程)和声明式事务管理是两个核心特性,它们极大地简化了Java企业级应用中的事务处理。本实例将深入探讨如何在Spring中使用AOP来实现声明式事务配置。 一、Spring AOP基础 AOP允许...
本实例工程展示了如何在Spring 3和Hibernate 4中使用注解进行声明式事务管理,这是一种高效且易于维护的方法。接下来,我们将详细讨论相关知识点。 1. **Spring框架**:Spring是一个全面的后端开发框架,它提供了...
实验 "Spring 声明事务" 是 Java 高级编程中的一个重要环节,旨在让学生掌握 Spring 框架中声明式事务管理的配置和使用。在实际应用中,事务管理是确保数据一致性、完整性和可靠性的关键组件。Spring 提供了声明式...
在Spring中,声明式事务管理主要有两种方式:基于XML的配置和基于注解的配置。基于XML的配置通常在`<tx:annotation-driven>`元素中声明,然后在Service层的方法上使用`@Transactional`注解来定义事务边界。基于注解...
通过上述配置和理解,开发者可以轻松地在Spring应用中实现声明式事务管理,确保业务操作的原子性和一致性,从而提高系统的可靠性和稳定性。在实际项目中,根据业务需求和性能考虑,选择合适的事务管理方式和配置是...