spring+aop管理事务

本文介绍使用Spring AOP配置事务管理的方法,包括注册事务管理器、配置事务advice及AOP切面等内容,并提供了手动回滚事务的解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

spring+aop管理事务的配置方法

 

1.注册事务管理器c3p0的配置参考以前的文章

	<!-- 事务管理器 -->
	<bean name="transactionManager"
		class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
		<property name="dataSource" ref="c3p0"></property>
	</bean>

 

2.配置advice

	<!-- 配置事务特性 -->
	<tx:advice id="transactionAdvice" transaction-manager="transactionManager">
		<tx:attributes>
			<tx:method name="delete*" propagation="REQUIRED" read-only="false"
				rollback-for="java.lang.Exception" />
			<tx:method name="insert*" propagation="REQUIRED" read-only="false"
				rollback-for="java.lang.Exception" />
			<tx:method name="update*" propagation="REQUIRED" read-only="false"
				rollback-for="java.lang.Exception" />
			<tx:method name="save*" propagation="REQUIRED" read-only="false"
				rollback-for="java.lang.Exception" />				
			<tx:method name="*" propagation="SUPPORTS" read-only="true" />
		</tx:attributes>
	</tx:advice>

 以delete,insert,update,save开头的方法,需要加上事务控制。

 

下面是Spring中Propagation类的事务属性详解:

REQUIRED:支持当前事务,如果当前没有事务,就新建一个事务。这是最常见的选择。 
SUPPORTS:支持当前事务,如果当前没有事务,就以非事务方式执行。 
MANDATORY:支持当前事务,如果当前没有事务,就抛出异常。 
REQUIRES_NEW:新建事务,如果当前存在事务,把当前事务挂起。
NOT_SUPPORTED:以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。 
NEVER:以非事务方式执行,如果当前存在事务,则抛出异常。 
NESTED:支持当前事务,如果当前事务存在,则执行一个嵌套事务,如果当前没有事务,就新建一个事务。

 

3.配置aop切面

把事务控制配置在service层的进出口

	<!-- 配置AOP切面 哪些类的方法需要进行事务管理 -->
	<aop:config>
		<!--把事务控制在Service层 -->
		<aop:pointcut id="allManagerMethod" expression="execution(public * hr.service..*.*(..))" />
		<aop:advisor pointcut-ref="allManagerMethod" advice-ref="transactionAdvice" />
	</aop:config>

 

 

4.手动rollback特殊处理

一般发生异常时,controller层捕获该异常,然后迁移到专用的异常出错画面并显示异常信息

上面advice的配置,当发生异常时,spring就会自动rollback。

但是,有时会有在程序处理中途,需要手动rollback并提示用户错误消息。

这种情况下,如果抛出RuntimeExcpetion,应用就会rollback并迁移到专用的异常出错画面。但这不是所希望的,该怎么办呢?

解决方法:

a)定义特殊的RollbackException类

public class RollbackException extends Exception {

}

 

b)程序处理中途需要rollback时,在service层方法中抛出RollbackException

		// 如果已抵扣金额 >0
		// 则报错 E000000255 
		// 否则的话,删除此记录。
		for(Map<String, Object> tmp : E_ACC_SUPPLIER_CANCEL_OUT){
			if(parseToBigDecimal(tmp.get("CANCEL_OUT_AMOUNT")).compareTo(new BigDecimal("0")) == 1){
				throw new RollbackException("E000000255","供应商");
			}
		}

 

c)在controller层捕获RollbackException,然后就不要再抛出Exception

    @RequestMapping("saveBatchRemark")
    @ResponseBody
    public Map<String, Object> saveBatchRemark(@RequestBody Map<String, Object> ajaxParam) throws Exception {
    	IBean bean = this.getAjaxBean(ajaxParam);
    	try{
    		// 插入批量备注
    		return batchRemarkService.insertBatchRemark(bean);
    	} catch (RollbackException re) {
            // 这里是 rollback 后的处理
    		commonService.setAjaxFailMsg(commonService.getMsg(re.getMsgKey(), re.getMsgParam()));
            return commonService.getAjaxResult();
        }
    } 

 这样,spring既可以自动控制事务,应用又可以在需要手动rollback的地方,做特殊处理。

 

 

 

Spring AOP(面向切面编程)是Spring框架中的一个重要模块,它提供了一种在程序运行期间动态地将额外的行为织入到代码中的方式。AOP可以帮助我们将与核心业务逻辑无关的横切关注点(如日志记录、事务管理、安全性等)从业务逻辑中分离出来,使得代码更加模块化、可维护性更高。 在Spring AOP中,通过定义切面(Aspect)和连接点(Join Point),我们可以将切面逻辑应用到目标对象的特定方法上。切面是一个包含了一组通知(Advice)和切点(Pointcut)的类,通知定义了在连接点上执行的逻辑,而切点则定义了哪些连接点会被应用通知。 Spring AOP支持以下几种类型的通知: 1. 前置通知(Before Advice):在目标方法执行之前执行。 2. 后置通知(After Advice):在目标方法执行之后执行,无论是否发生异常。 3. 返回通知(After Returning Advice):在目标方法成功执行并返回结果后执行。 4. 异常通知(After Throwing Advice):在目标方法抛出异常后执行。 5. 环绕通知(Around Advice):包围目标方法的执行,在方法调用前后都可以执行自定义的逻辑。 Spring AOP的实现方式主要有两种:基于代理的方式和基于字节码增强的方式。基于代理的方式使用JDK动态代理或CGLIB来生成代理对象,而基于字节码增强的方式则通过修改字节码来实现。 使用Spring AOP,我们可以将横切关注点与核心业务逻辑解耦,提高代码的可维护性和可重用性。同时,Spring AOP还提供了灵活的配置方式,可以通过XML配置、注解或者Java配置来定义切面和通知。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值