Spring注解配置AOP导致通知执行顺序紊乱解决方案

 更新时间:2020年10月23日 10:22:51   作者:dqlai  
这篇文章主要介绍了Spring注解配置AOP导致通知执行顺序紊乱解决方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

今天在测试Spring的AOP时,发现使用注解配置AOP的方式会导致通知的执行顺序紊乱。【最终通知居然在异常通知之前执行了】

测试代码

(1)定义TargetInterface目标接口

public interface TargetInterface {
public abstract void targetProxy();
}

(2)定义TargetImpl目标类

@Component("target")
public class TargetImpl implements TargetInterface {
public void targetProxy() {
  System.out.println("target proxy ......");
  int i = 1/0;//异常
}
}

(3)定义切面类(内含增强方法)

@Component("myAspect")//定义切面类
@Aspect//声明当前类是切面类
public class TargetAspect {

//定义切点表达式
@Pointcut("execution(* com.ahzyy.target.impl.*.*(..))")
public void pt() {
}

@Before("pt()")
public void before() {

  System.out.println("前置通知......");
}

@After("pt()")
public void after() {

  System.out.println("最终通知......");
}

@AfterReturning("pt()")
public void afterReturning() {

  System.out.println("后置通知......");
}

@AfterThrowing("pt()")
public void afterThrowing() {

  System.out.println("异常通知......");
}
}

(4)配置applicationContextAnno.xml文件

<!--配置组件扫描的包-->
<context:component-scan base-package="com.ahzyy"/>
<!--配置AOP自动代理-->
<aop:aspectj-autoproxy/>

(5)定义测试类

@RunWith(SpringJUnit4ClassRunner.class)
//@ContextConfiguration("classpath:applicationContext.xml")
@ContextConfiguration("classpath:applicationContextAnno.xml")
public class AopTest {

@Autowired
private TargetInterface target;

@Test
public void test01() {

  target.targetProxy();
}
}

(6)运行结果:


【最终通知在异常通知之前执行了!!!】

(7)解决方法:

(7.1)使用xml配置方式配置AOP;

(7.2)注解使用@Around(环绕通知)方式配置AOP(修改TargetAspect类使用环绕通知);

@Component("myAspect")//定义切面类
@Aspect//声明当前类是切面类
public class TargetAspect {

//定义切点表达式
@Pointcut("execution(* com.ahzyy.target.impl.*.*(..))")
public void pt() {
}

@Around("pt()")
public Object aroundNotice(ProceedingJoinPoint pjp) {

  System.out.println("环绕通知");
  Object result = null;

  before();//前置通知
  try {
    result = pjp.proceed();

    afterReturning();//后置通知
  } catch (Throwable throwable) {
    
    afterThrowing();//异常通知
    throwable.printStackTrace();
  }
  after();//最终通知

  return result;
}

public void before() {

  System.out.println("前置通知......");
}

public void afterReturning() {

  System.out.println("后置通知......");
}

public void afterThrowing() {

  System.out.println("异常通知......");
}

public void after() {

  System.out.println("最终通知......");
}
}

(7.3)运行结果

[运行顺序正确]

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • 关于JVM默认堆内存大小问题

    关于JVM默认堆内存大小问题

    这篇文章主要介绍了关于JVM默认堆内存大小问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-02-02
  • Java高并发BlockingQueue重要的实现类详解

    Java高并发BlockingQueue重要的实现类详解

    这篇文章主要给大家介绍了关于Java高并发BlockingQueue重要的实现类的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-01-01
  • Java设计模式笔记之Builder模式

    Java设计模式笔记之Builder模式

    建造者模式是日常开发中比较常见的设计模式,它的主要作用就是将复杂事物创建的过程抽象出来,该抽象的不同实现方式不同,创建出的对象也不同,这篇文章主要给大家介绍了关于Java设计模式笔记之Builder模式的相关资料,需要的朋友可以参考下
    2022-03-03
  • Java虚拟机JVM性能优化(二):编译器

    Java虚拟机JVM性能优化(二):编译器

    这篇文章主要介绍了Java虚拟机JVM性能优化(二):编译器,本文先是讲解了不同种类的编译器,并对客户端编译,服务器端编译器和多层编译的运行性能进行了对比,然后给出了几种常见的JVM优化方法,需要的朋友可以参考下
    2014-09-09
  • java实现文件上传下载至ftp服务器

    java实现文件上传下载至ftp服务器

    这篇文章主要为大家详细介绍了java实现文件上传下载至ftp服务器的方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-06-06
  • 修改idea的这些启动参数,令你的idea健步如飞

    修改idea的这些启动参数,令你的idea健步如飞

    这篇文章主要介绍了修改idea的这些启动参数,令你的idea健步如飞~具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-01-01
  • java Date类详解及使用总结

    java Date类详解及使用总结

    这篇文章主要介绍了java Date类详解及使用总结的相关资料,需要的朋友可以参考下
    2017-02-02
  • java编程实现邮件定时发送的方法

    java编程实现邮件定时发送的方法

    这篇文章主要介绍了java编程实现邮件定时发送的方法,涉及Java基于定时器实现计划任务的相关技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-11-11
  • 详解SpringMVC实现图片上传以及该注意的小细节

    详解SpringMVC实现图片上传以及该注意的小细节

    本篇文章主要介绍了详解SpringMVC实现图片上传以及该注意的小细节,具有一定的参考价值,感兴趣的小伙伴们可以参考一下。
    2017-02-02
  • java算法之余弦相似度计算字符串相似率

    java算法之余弦相似度计算字符串相似率

    这篇文章主要介绍了java算法之余弦相似度计算字符串相似率,对算法感兴趣的同学,可以参考下
    2021-05-05

最新评论