Spring-註解實現AOP
阿新 • • 發佈:2022-04-06
基於註解的AOP開發
1. 建立介面和目標類(內部有切點)
package com.sjj.anno;
public interface TargetInterface {
public void print_hello();
}
package com.sjj.anno; import org.springframework.stereotype.Component; @Component("target") // 交予spring public class Target implements TargetInterface { @Override public void print_hello() { System.out.println("HHHHHello"); } }
2. 建立切面類(內部有增強方法)
package com.sjj.anno; import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.Before; import org.springframework.stereotype.Component; @Aspect // 宣告切面類 @Component("myAspect") // 交予spring public class MyAspect { @Before("execution(* com.sjj.anno.*.*(..))") public void before(){ System.out.println("=====前置增強====="); } }
3. 將目標類和切面類的物件建立權交給spring
// Component註解
4. 在切面類中使用註解配置織入關係
// Aspect註解和通知方法註解(Before之類的)
5. 在配置檔案中開啟元件掃描和AOP自動代理
<!--元件掃描-->
<context:component-scan base-package="com.sjj.anno" />
<!--aop自動代理-->
<aop:aspectj-autoproxy/>
6. 測試
package com.sjj.anno; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration("classpath:appContext-anno.xml") public class AnnoTest { @Autowired private TargetInterface target; @Test public void test_anno01(){ target.print_hello(); } }
註解解析
註解通知的型別
名稱 | 註解 | 說明 |
---|---|---|
前置 | @Before | 切入點方法之前 |
後置 | @AfterReturning | 切入點方法之後 |
環繞 | @Around | 切入點方法前後都執行 |
異常丟擲 | @Throwing | 出現異常時執行 |
最終 | @After | 最終通知,無論是否有異常都執行 |