Spring注解配置AOP導致通知執(zhí)行順序紊亂解決方案
今天在測試Spring的AOP時,發(fā)現(xiàn)使用注解配置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)定義切面類(內(nèi)含增強方法)
@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)運行結果
[運行順序正確]
以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關文章
Java高并發(fā)BlockingQueue重要的實現(xiàn)類詳解
這篇文章主要給大家介紹了關于Java高并發(fā)BlockingQueue重要的實現(xiàn)類的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2021-01-01修改idea的這些啟動參數(shù),令你的idea健步如飛
這篇文章主要介紹了修改idea的這些啟動參數(shù),令你的idea健步如飛~具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-01-01詳解SpringMVC實現(xiàn)圖片上傳以及該注意的小細節(jié)
本篇文章主要介紹了詳解SpringMVC實現(xiàn)圖片上傳以及該注意的小細節(jié),具有一定的參考價值,感興趣的小伙伴們可以參考一下。2017-02-02