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

网友投稿 357 2022-11-16


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

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

测试代码

(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文件

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

[运行顺序正确]


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:Java private修饰符失效的原因
下一篇:详解SpringBoot整合MyBatis详细教程
相关文章

 发表评论

暂时没有评论,来抢沙发吧~