码迷,mamicode.com
首页 > 编程语言 > 详细

Spring基于注解配置AOP,通知执行顺序紊乱。

时间:2020-10-12 20:03:14      阅读:26      评论:0      收藏:0      [点我收藏+]

标签:pac   lazy   autowire   interface   ssr   point   代码   abstract   get   

今天在测试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)运行结果

技术图片

[运行顺序正确]

Spring基于注解配置AOP,通知执行顺序紊乱。

标签:pac   lazy   autowire   interface   ssr   point   代码   abstract   get   

原文地址:https://www.cnblogs.com/dqlai/p/13800494.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!