今天在测试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)运行结果
[运行顺序正确]
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持自学编程网。
- 本文固定链接: https://zxbcw.cn/post/198063/
- 转载请注明:必须在正文中标注并保留原文链接
- QQ群: PHP高手阵营官方总群(344148542)
- QQ群: Yii2.0开发(304864863)