怎样通过spring进行事务管理呢?下面进行简单的介绍~
假设我们现在有一个接口叫IBusinessService,里面有一个方法叫doSaveInformation(),有一个实现这个接口的类叫BusinessService,在doSaveInformation中有一系列的数据库操作,如下:
public interface IBusinessService{
public void doSaveInformation();
}
public class BusinessService implements IBusinessService{
public void doSaveInformation(){
进行一系列数据库操作;
}
}
我们想通过spring对这个方法进行事务管理,把这个方法当做一个事务去处理,该怎么做呢?
首先,在spring上下文中定义业务类:
<bean id="businessService" class="BusinessService">
</bean>
其次,为spring上下文添加拦截器:
<!--定义拦截的类-->
<bean class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">
<property name="proxyTargetClass">
<value>true</value>
</property>
<property name="beanNames">
<value>*Service</value>
</property>
<property name="interceptorNames">
<list>
<value>transactionInterceptor</value>
</list>
</property>
</bean>
再次,定义拦截器需要管理的事务(假设sessionFactory以及数据源再spring上下文中已经有定义):
<!--定义Hibernate 的 事务-->
<bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory">
<ref local="sessionFactory"/>
</property>
</bean>
最后,定义拦截器的拦截策略:
<!--定义事务拦截器的拦截策略-->
<bean id="transactionInterceptor" class="org.springframework.transaction.interceptor.TransactionInterceptor">
<property name="transactionManager" ref="transactionManager"/>
<property name="transactionAttributes">
<props>
<prop key="doSave*">PROPAGATION_REQUIRED,-BusinessException</prop>
</props>
</property>
</bean>
在java代码中通过getBean("businessService")来获得业务类,然后调用业务类的doSaveInformation()方法,这样spring就能对BusinessService类中的doSaveInformation()方法进行拦截,把这个方法作为一个事务进行管理了。
spring是怎样做的呢?
此处进介绍spring通过接口方式实现的代理模式
这里做一个浅显的解释,在通过getBean("businessService")获得的业务类时,实际上得到的是一个代理类,假设这个类叫做BusinessServiceProxy:
注意,spring已经获取了上述的配置,并在下面生成的代理类的doSaveInformation()方法中添加了事务管理的代码(上文中配置的含义是,针对类名符合“*Service”且类中的方法名符合“doSave*”的方法进行事务包裹,并且当在方法中捕获到BusinessException时,事务回滚)
public class BusinessServiceProxy implements IBusinessService{
private IBusinessService businessService;
BusinessServiceProxy(IBusinessService businessService){
this.businessService = businessService;
}
public void doSaveInformation(){
try{
启动事务的代码;
businessService.doSaveInformation();
事务提交的代码;
}catch(BusinessExcepiton e){
回滚事务的代码;
}
}
}
也就是说实际执行的代码是BusinessServiceProxy.doSaveInformation(),自然就是带事务管理的了~
在项目中编写代码是有一个常见的错误,我们会发现,如果这样做,spring的事务管理不管用,错误实例如下:
还那上面的类和方法来说,如果做一点小小的变动,在BusinessService类中增加一个方法,doProcessAndSave(),如下:
public interface IBusinessService{
public void doProcessAndSave();
public void doSaveInformation();
}
public class BusinessService implements IBusinessService{
public void doProcessAndSave(){
进行一些业务处理操作;
this.doSaveInformation();
}
public void doSaveInformation(){
进行一系列数据库操作;
}
}
这是,我们同样通过spring的getBean("businessService")获得的业务类,然后调用该类的doProcessAndSave()方法,在这个方法中我们调用了doSaveInformation()方法,我们发现,doSaveInformation()的事务失效了!
其实原理一样,spring一样构造了一个代理类,在代理类中调用了doProcessAndSave()而不是doSaveInformation()方法,spring会发现我们并没有对doProcessAndSave()方法进行事务包裹,因此spring所生成的代理类是不带事务的。所以想把doSaveInformation()方法当做一个事务使用时,需要直接通过spring创建的代理类去调用该方法,而非套在其他的方法中。
欢迎大家指正~
分享到:
相关推荐
Java Spring AOP(面向切面编程)是Spring框架的核心特性之一,它允许开发者在不修改原有代码的情况下,通过代理方式插入额外的功能,如日志、事务管理等。在这个主题中,我们将深入探讨Spring AOP如何处理事务管理...
Spring AOP(面向切面编程)是Spring框架的重要组成部分,它提供了一种模块化和声明式的方式来处理系统中的交叉关注点问题,如日志、事务管理、安全性等。本示例将简要介绍如何在Spring应用中实现AOP,通过实际的...
例如,可以在方法调用前后添加日志记录或事务管理的逻辑。 4. 目标对象(Target)是增强逻辑所要织入的目标类。AOP让开发者可以将横切逻辑与主要业务逻辑分离,只关注业务逻辑的实现。 5. 引介(Introduction)是一...
总结一下,Spring AOP提供了一种优雅的方式来处理系统的横切关注点,如日志记录、事务管理或性能监控。通过定义切点、创建切面和配置通知,我们可以实现代码的解耦,提高可维护性和复用性。这个例子提供了学习Spring...
现在,我们回到主题——"springaop依赖的jar包"。在Spring 2.5.6版本中,使用Spring AOP通常需要以下核心jar包: - `spring-aop.jar`:这是Spring AOP的核心库,包含了AOP相关的类和接口。 - `spring-beans.jar`:...
总的来说,Spring AOP事务管理是强大的工具,但理解和规避其潜在问题至关重要。通过深入学习和实践,我们可以更好地利用Spring AOP事务,提升代码质量,降低维护成本。在遇到问题时,及时查阅文档,分析调用链路,...
Spring AOP(面向切面编程)是Spring框架的核心特性之一,它允许程序员在不修改源代码的情况下,通过“切面”来插入额外的业务逻辑,如日志、事务管理等。AOP的引入极大地提高了代码的可复用性和可维护性。 ### 1. ...
接下来,我们通过一个简单的Spring AOP示例来加深对上述概念的理解。假设我们需要在调用某个公共方法前记录日志,我们可以定义一个`BeforeAdvice`,并在目标方法上应用此通知。 ```java package com.example.aop; ...
在Spring框架中,AOP(面向切面编程)被广泛用于实现事务管理,因为它允许我们以声明式的方式处理事务,从而让业务代码更加简洁、易维护。本篇将详细讲解Spring AOP如何进行事务配置,包括注解和非注解两种方式。 1...
Spring AOP,即Spring的面向切面编程模块,是Spring框架的重要组成部分,它允许开发者在不修改源代码的情况下,对程序进行横切关注点的处理,如日志、事务管理等。实现这一功能,主要依赖于三个核心的jar包:aop...
1. **概念理解**:AOP 是一种编程范式,它将关注点分离,让通用的横切关注点(如日志、事务管理)与业务逻辑解耦。在 Spring 中,切面可以通过注解或 XML 配置定义。 2. **通知类型**:包括前置通知(Before)、...
本篇文章将重点讨论如何在Spring框架中集成Hibernate,并探讨编程式事务管理和Spring AOP的声明式事务。 首先,让我们理解Spring与Hibernate的集成。为了整合这两个库,你需要在Spring配置文件中定义Hibernate的...
Spring提供了声明式事务管理,通过@Transactional注解在方法级别声明事务边界。事务传播行为(如REQUIRED、REQUIRES_NEW等)定义了方法调用如何参与当前事务。 9. JdbcTemplate与Spring JDBC: JdbcTemplate是...
Spring AOP(面向切面编程)是Spring框架的重要组成部分,它提供了一种模块化和抽象化的方法来处理系统中的交叉关注点,如日志、事务管理、安全性等。本学习笔记将深入探讨Spring AOP的核心概念、工作原理以及实际...
3. spring-context.jar:提供了上下文支持,包括AOP的配置和声明式事务管理。 4. spring-core.jar:Spring的核心工具包,包含核心的IoC(Inversion of Control)服务和基本的类型转换系统。 5. aspectjrt.jar:...
在`springAop1`这个压缩包中,可能包含了一个简单的应用示例,展示了如何定义一个切面类,以及如何在该类中定义通知方法。例如,我们可能会看到一个名为`LoggingAspect`的类,其中包含了`@Before`注解的方法,用于在...
通过这些练习,你可以深入理解Spring如何整合AOP、JDBC和事务管理,并提升你的实际开发技能。在实践中,你可能会遇到的问题包括事务传播行为、异常回滚规则、事务隔离级别等,这些都是进一步学习和研究的方向。
Spring 框架是Java开发中...理解并熟练掌握Spring事务管理,对于提升应用程序的稳定性和可靠性至关重要。在实际开发中,结合声明式事务管理、事务传播行为、隔离级别和回滚规则,可以有效地确保数据的完整性和一致性。
Spring AOP模块提供了实现AOP规范的功能,它允许开发者定义“切面”来封装系统中的横切关注点,如日志、事务管理等。该jar文件包含了Spring AOP的核心类和接口,如`org.springframework.aop.*`包下的`...
结合给出的标签"源码"和"工具",我们可以进一步理解,本文可能会深入到源码层面解析Spring AOP和Hibernate事务管理的实现原理,或者提供一些实用的工具或技巧来帮助开发者更好地管理和调试事务。 通过阅读博文...