Spring MVC AOP处理事务

只需两步:

1、引入 支持aop xml头,添加自己类:

xmlns:aop="http://www.springframework.org/schema/aop"

xsi:schemaLocation="http://www.springframework.org/schema/aop 
                        http://www.springframework.org/schema/aop/spring-aop-3.0.xsd"


...
...

     <!-- 启动AspectJ支持 -->  
    <aop:aspectj-autoproxy />  
	<bean id="aspectJAdvice" class="com.util.aop.AspectAdvice"></bean>

2、添加自己的 aop类,用注解来 切面 ,拦截。

package com.util.aop;
 
import java.sql.SQLException;
import java.util.Date;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.AfterThrowing;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;

import com.util.webapi.DBUtils;
/***
 * spring AOP 切面   自动控制事务
 * 
 * @author 姚林涛
 * 2017-9-22
 */
@Aspect
public class AspectAdvice {
    /**
     * Pointcut 定义Pointcut,Pointcut的名称为aspectjMethod(),此方法没有返回值和参数
     * 该方法就是一个标识,不进行调用
     */       //execution(* *(..))
    @Pointcut("execution(* com.service..*.*(..))")
    private void aspectjMethod() {
    };
 
    // 自定义After
    //@After("execution(* add*(..))")
    public void doSava(JoinPoint joinPoint) {
        System.out.println("-----------@After这是日志:新增用户成功---" + new Date());
    }
 
    /**
     * Before 在核心业务执行前执行,不能阻止核心业务的调用。
     * 
     * @param joinPoint
     * @throws SQLException 
     */
    @Before("aspectjMethod()")
    public void doBefore(JoinPoint joinPoint) throws SQLException {
    	DBUtils.openConn();
        System.out.println("-----@Before-----");
//        System.out.println(" 此处意在执行核心业务逻辑前,做一些安全性的判断等等");
//        System.out.println(" 可通过joinPoint来获取所需要的内容");
//        System.out.println("-----End of doBefore()------");
    }
 
    /**
     * Around 手动控制调用核心业务逻辑,以及调用前和调用后的处理,
     * 
     * 注意:当核心业务抛异常后,立即退出,转向AfterAdvice 执行完AfterAdvice,再转到ThrowingAdvice
     * 
     * @param pjp
     * @return
     * @throws Throwable
     */
    //@Around(value = "aspectjMethod()")
    public Object doAround(ProceedingJoinPoint pjp) throws Throwable {
        System.out.println("-----doingBefor-----");
        // 调用核心逻辑
        Object retVal = pjp.proceed();
        System.out.println("-----doingAfter-----");
        return retVal;
    }
 
    /**
     * After 核心业务逻辑退出后(包括正常执行结束和异常退出),执行此Advice
     * 
     * @param joinPoint
     * @throws SQLException 
     */
    @After(value = "aspectjMethod()")
    public void doAfter(JoinPoint joinPoint) throws SQLException {
    	DBUtils.commit();
    	DBUtils.closeConnection();
        System.out.println("-----@After-----");
//        System.out.println(" 此处意在执行核心业务逻辑之后,做一些日志记录操作等等");
//        System.out.println(" 可通过joinPoint来获取所需要的内容");
//        System.out.println("-----End of doAfter()------");
    }
 
    /**
     * AfterReturning 核心业务逻辑调用正常退出后,不管是否有返回值,正常退出后,均执行此Advice
     * 
     * @param joinPoint
     */
    //@AfterReturning(value = "aspectjMethod()", returning = "retVal")
    public void doReturn(JoinPoint joinPoint, String retVal) {
        System.out.println("-----@AfterReturning-----");
//        System.out.println("Return Value: " + retVal);
//        System.out.println(" 此处可以对返回值做进一步处理");
//        System.out.println(" 可通过joinPoint来获取所需要的内容");
//        System.out.println("-----End of doReturn()------");
    }
 
    /**
     * 核心业务逻辑调用异常退出后,执行此Advice,处理错误信息
     * 
     * 注意:执行顺序在Around Advice之后
     * 
     * @param joinPoint
     * @param ex
     * @throws SQLException 
     */
    @AfterThrowing(value = "aspectjMethod()", throwing = "ex")
    public void doThrowing(JoinPoint joinPoint, Exception ex) throws SQLException {
    	DBUtils.rollback();
        System.out.println("-----AOP Print: Exception :-----");
        ex.printStackTrace();
        //执行后  交给 spring 异常处理器 处理返回参数  -MyExceptionHandler
        
    }
}

跑起来  走两步 即可。(注意Jar包 pom.xml配置 也说一下吧)

<dependency>
      <groupId>org.aspectj</groupId>
      <artifactId>aspectjweaver</artifactId>
      <version>1.7.1</version>
    </dependency>

这是我引入的包,检查下自己是否引入。

转载于:https://my.oschina.net/u/2416491/blog/1542812

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值