Spring注解配置AOP導(dǎo)致通知執(zhí)行順序紊亂解決方案
今天在測試Spring的AOP時(shí),發(fā)現(xiàn)使用注解配置AOP的方式會導(dǎo)致通知的執(zhí)行順序紊亂?!咀罱K通知居然在異常通知之前執(zhí)行了】
測試代碼
(1)定義TargetInterface目標(biāo)接口
public interface TargetInterface { public abstract void targetProxy(); }
(2)定義TargetImpl目標(biāo)類
@Component("target") public class TargetImpl implements TargetInterface { public void targetProxy() { System.out.println("target proxy ......"); int i = 1/0;//異常 } }
(3)定義切面類(內(nèi)含增強(qiáng)方法)
@Component("myAspect")//定義切面類 @Aspect//聲明當(dāng)前類是切面類 public class TargetAspect { //定義切點(diǎn)表達(dá)式 @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)運(yùn)行結(jié)果:
【最終通知在異常通知之前執(zhí)行了!!!】
(7)解決方法:
(7.1)使用xml配置方式配置AOP;
(7.2)注解使用@Around(環(huán)繞通知)方式配置AOP(修改TargetAspect類使用環(huán)繞通知);
@Component("myAspect")//定義切面類 @Aspect//聲明當(dāng)前類是切面類 public class TargetAspect { //定義切點(diǎn)表達(dá)式 @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)運(yùn)行結(jié)果
[運(yùn)行順序正確]
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
關(guān)于JVM默認(rèn)堆內(nèi)存大小問題
這篇文章主要介紹了關(guān)于JVM默認(rèn)堆內(nèi)存大小問題,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-02-02Java高并發(fā)BlockingQueue重要的實(shí)現(xiàn)類詳解
這篇文章主要給大家介紹了關(guān)于Java高并發(fā)BlockingQueue重要的實(shí)現(xiàn)類的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-01-01Java虛擬機(jī)JVM性能優(yōu)化(二):編譯器
這篇文章主要介紹了Java虛擬機(jī)JVM性能優(yōu)化(二):編譯器,本文先是講解了不同種類的編譯器,并對客戶端編譯,服務(wù)器端編譯器和多層編譯的運(yùn)行性能進(jìn)行了對比,然后給出了幾種常見的JVM優(yōu)化方法,需要的朋友可以參考下2014-09-09java實(shí)現(xiàn)文件上傳下載至ftp服務(wù)器
這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)文件上傳下載至ftp服務(wù)器的方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-06-06修改idea的這些啟動參數(shù),令你的idea健步如飛
這篇文章主要介紹了修改idea的這些啟動參數(shù),令你的idea健步如飛~具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-01-01java編程實(shí)現(xiàn)郵件定時(shí)發(fā)送的方法
這篇文章主要介紹了java編程實(shí)現(xiàn)郵件定時(shí)發(fā)送的方法,涉及Java基于定時(shí)器實(shí)現(xiàn)計(jì)劃任務(wù)的相關(guān)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-11-11詳解SpringMVC實(shí)現(xiàn)圖片上傳以及該注意的小細(xì)節(jié)
本篇文章主要介紹了詳解SpringMVC實(shí)現(xiàn)圖片上傳以及該注意的小細(xì)節(jié),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下。2017-02-02