spring aop是面向切面編程,使用了動態代理的技術,這樣可以使業務邏輯的代碼不摻入其他亂七八糟的代碼
可以在切面上實現合法性校驗、權限檢驗、日志記錄。。。
spring aop 用的多的有兩種配置方法:注解配置和xml配置
注解配置更好,友好重構、錯誤也好檢查
在這裡只講注解配置
@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種類型: