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)运行结果

[运行顺序正确]

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

相关文章

  • springboot如何获取yml里面的属性值

    springboot如何获取yml里面的属性值

    这篇文章主要介绍了springboot如何获取yml里面的属性值,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-02-02
  • java面试常见模式问题---代理模式

    java面试常见模式问题---代理模式

    代理模式是常用的java设计模式,他的特征是代理类与委托类有同样的接口,代理类主要负责为委托类预处理消息、过滤消息、把消息转发给委托类,以及事后处理消息
    2021-06-06
  • java连接mysql数据库详细步骤解析

    java连接mysql数据库详细步骤解析

    以下是对java连接mysql数据库的具体详细步骤进行了分析介绍,需要的朋友可以过来参考下
    2013-08-08
  • 详解Springboot之Logback的使用学习

    详解Springboot之Logback的使用学习

    Logback是SpringBoot内置的日志处理框架,你会发现spring-boot-starter其中包含了spring-boot-starter-logging,该依赖内容就是Spring Boot默认的日志框架logback,本文详细介绍了该框架 ,需要的朋友可以参考下
    2021-05-05
  • java 利用HttpClient PostMethod提交json数据操作

    java 利用HttpClient PostMethod提交json数据操作

    这篇文章主要介绍了java 利用HttpClient PostMethod提交json数据操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-01-01
  • java类的全限定名是什么

    java类的全限定名是什么

    Java中的全限定名指的是包含包名和类名的完整标识,例如“java.lang.String”,而非限定名仅指类名,如“String”,全限定名用于区分不同包中相同名字的类,避免引用混淆,特别是在有多个包含相同类名的库时
    2024-09-09
  • Java控制台输入数组并逆序输出的方法实例

    Java控制台输入数组并逆序输出的方法实例

    这篇文章主要介绍了Java手动输入数组并逆向输出的方法实例,需要的朋友可以参考下。
    2017-08-08
  • Java如何简单快速入门JWT(token生成与验证)

    Java如何简单快速入门JWT(token生成与验证)

    这篇文章主要给大家介绍了关于Java如何简单快速入门JWT(token生成与验证)的相关资料,JWT是一个加密的字符串,JWT传输的信息经过了数字签名,因此传输的信息可以被验证和信任,需要的朋友可以参考下
    2023-12-12
  • java开发微信公众号支付

    java开发微信公众号支付

    这篇文章主要给大家结合微信支付接口开发的实践,从获取用户授权到各主要接口的使用方法等方面介绍微信支付的关键点技术,有需要的小伙伴可以参考下
    2015-08-08
  • spring中的ObjectPostProcessor详解

    spring中的ObjectPostProcessor详解

    这篇文章主要介绍了spring中的ObjectPostProcessor详解,Spring Security 的 Java 配置不会公开其配置的每个对象的每个属性,这简化了大多数用户的配置,毕竟,如果每个属性都公开,用户可以使用标准 bean 配置,需要的朋友可以参考下
    2024-01-01

最新评论