Spring注解配置AOP導致通知執(zhí)行順序紊亂解決方案
今天在測試Spring的AOP時,發(fā)現使用注解配置AOP的方式會導致通知的執(zhí)行順序紊亂?!咀罱K通知居然在異常通知之前執(zhí)行了】

測試代碼
(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)運行結果:

【最終通知在異常通知之前執(zhí)行了!!!】
(7)解決方法:
(7.1)使用xml配置方式配置AOP;
(7.2)注解使用@Around(環(huán)繞通知)方式配置AOP(修改TargetAspect類使用環(huán)繞通知);
@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("環(huán)繞通知");
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)運行結果

[運行順序正確]
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關文章
java 利用HttpClient PostMethod提交json數據操作
這篇文章主要介紹了java 利用HttpClient PostMethod提交json數據操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-01-01

