spring aop是面向切麵編程,使用了動態代理的技術,這樣可以使業務邏輯的代碼不摻入其他亂七八糟的代碼 可以在切麵上實現合法性校驗、許可權檢驗、日誌記錄。。。 spring aop 用的多的有兩種配置方法:註解配置和xml配置 註解配置更好,友好重構、錯誤也好檢查 在這裡只講註解配置 aop概念 ...
spring aop是面向切麵編程,使用了動態代理的技術,這樣可以使業務邏輯的代碼不摻入其他亂七八糟的代碼
可以在切麵上實現合法性校驗、許可權檢驗、日誌記錄。。。
spring aop 用的多的有兩種配置方法:註解配置和xml配置
註解配置更好,友好重構、錯誤也好檢查
在這裡只講註解配置
aop概念
- 切麵:切麵類,裡面有切點有通知,切麵包括了一切(在哪切,乾什麼)
- 切點:定義了在個地方切
- 通知:定義了在切點處做些什麼
- 連接點:所有可以被切的地方
切麵配置
@Aspect public class LibraryAOPConf {} |
@Aspect標記的類即是一個切麵,在這個類中定義切麵和通知
開啟自動代理
因為AOP是代理實現的,將切麵放進bean容器是不會生成代理對象的,所以要開啟自動代理
@Configuration @EnableAspectJAutoProxy public class LibraryConf {} |
在裝配bean的配置類加上@EnableAspectJAutoProxy就可以了
或者在xml中加上<aop:aspectj-autoproxy>
切點配置
配置切點需要用到切點表達式
當通知方法需要拿到切點的參數的時候,就需要參數傳遞
@Pointcut("execution(* aop.library.BookShop.sell(Book))"+"&&"+"args(book)") public void sell(Book book){} @Before("sell(book)") public void charge(Book book){ System.out.println("這本書叫:"+book); } |
切點攔截了aop.library.BookShop.sell(Book)方法,並且將參數Book賦給了sell(book)切點方法,然後通知方法又獲取了切點方法中的book
通知配置
//基於切點表達式配置 @Before("execution (* *.*.*(..))")//*號依次為返回類型、包名、類名、方法名 public void charge(Book book){ System.out.println("這本書叫:"+book); } //基於切點配置 @Before("sell(book)")//sell(book)是一個切點 public void charge(Book book){ System.out.println("這本書叫:"+book); } |
通知有5種類型:
- 前置通知@Before
- 後置通知(不管是否異常)@After
- 異常通知@AfterThrowing
- 返回通知@AfterReturning
- 環繞通知@Around