Spring注解配置AOP Spring注解配置AOP导致通知执行顺序紊乱解决方案
dqlai 人气:1想了解Spring注解配置AOP导致通知执行顺序紊乱解决方案的相关内容吗,dqlai在本文为您仔细讲解Spring注解配置AOP的相关知识和一些Code实例,欢迎阅读和指正,我们先划重点: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)运行结果
[运行顺序正确]
加载全部内容