spring基于注解的AOP配置 中的环绕通知 步骤写法

由于,使用注解配置AOP的bug
在使用注解配置AOP时,会出现一个bug. 四个通知的调用顺序依次是:前置通知,最终通知,后置通知. 这会导致一些资源在执行最终通知时提前被释放掉了,而执行后置通知时就会出错.

所以注解的方式改用,注解环绕通知。能更为精确。
基于这层代码进行修改:https://blog.csdn.net/qq847196660/article/details/96442929
1.修改bean.xml 配置
spring基于注解的AOP配置 中的环绕通知 步骤写法_第1张图片




    


        


 

2.重写通知类:Logger
spring基于注解的AOP配置 中的环绕通知 步骤写法_第2张图片spring基于注解的AOP配置 中的环绕通知 步骤写法_第3张图片

//记录日志的工具类(也叫通知类),它里面提供了公共的代码
@Component("logger") //通知类的注解名称
@Aspect //表示当前类是一个切面类
public class Logger {
    //通用切入点表达式方法的注解
    @Pointcut("execution(* wuwei.service.impl.*.*(..))")
    private void pt1(){ }
//    环绕通知允许我们更自由地控制增强代码执行的时机
//
//    Spring框架为我们提供一个接口ProceedingJoinPoint,**可以理解为控制器**
//    它的实例对象可以作为环绕通知方法的参数,通过参数控制被增强方法的执行时机.
//
//    ProceedingJoinPoint对象的getArgs()方法返回被拦截的参数
//    ProceedingJoinPoint对象的proceed()方法执行被拦截的方法

    // 环绕通知方法,返回Object类型
    @Around("pt1()")
    public Object printLogAround(ProceedingJoinPoint pjp) {
        Object rtValue = null;
        try {
            Object[] args = pjp.getArgs();
            beforePrintlog();        // 执行前置通知
            rtValue = pjp.proceed(args);// 执行被拦截方法
            afterReturningPrintlog();     // 执行后置通知
        }catch(Throwable e) {
            afterThrowingPrintlog();   // 执行异常通知
        }finally {
            afterPrintlog();         // 执行最终通知
        }
        return rtValue;
    }

    //@Before("pt1()")//引用已提取出的通用表达式,也就是把这个通知指向某包下某实现类中的某实现方法
    public void beforePrintlog(){
        //用于打印日志:计划让其在切入点方法执行前执行,也就是前置通知
        //切入点方法就是业务层的方法
        System.out.println("logger类中 前置通知 方法开始记录日志了。。。");
    }
   // @AfterReturning("pt1()")
    public void afterReturningPrintlog(){
        //后置通知
        System.out.println("logger类中 后置通知 方法开始记录日志了。。。");
    }
   // @AfterThrowing("pt1()")
    public void afterThrowingPrintlog(){
        //异常通知
        System.out.println("logger类中 异常通知 方法开始记录日志了。。。");
    }
   // @After("pt1()")
    public void afterPrintlog(){
        //最终通知
        System.out.println("logger类中 最终通知 方法开始记录日志了。。。");
    }

}

3.其他的代码参照上面的xml 配置方式写就行

你可能感兴趣的:(spring基于注解的AOP配置 中的环绕通知 步骤写法)