在軟件開發中,分佈於應用多出的功能被稱爲和橫切關注點. 一般,這些橫切關注點從概念上是與應用的業務邏輯相分離的(可是每每直接嵌入到應用的業務邏輯中).將這些橫切關注點與業務邏輯相分離正是面向切面編成(AOP)所要解決的 java
要了解什麼是AOP,首先應該瞭解AOP相關術語,只有徹底理解這些,才能更好的掌握AOP spa
描述切面的經常使用術語有 通知(advice), 切點(pointcut), 鏈接點(join point). 代理
通知(advice) code
切面有目標-他必需要完成的工做,成爲通知.通知定義了切面是什麼以及什麼時候使用. xml
Spring切面能夠應用5種類型的通知 開發
鏈接點是在應用執行過程當中可以插入切面的一個點.這個點能夠是調用方法時,拋出異常時,甚至修改一個字段時.切面代碼能夠利用這些點插入到應用的正常流程之中,並添加新的行爲 io
切點(pointcut) class
切點的定義會匹配通知所要織入的一個或多個鏈接點 軟件
切面(Aspect) aop
切面是通知和切點的結合,通知和切點共同定義了關於切面的所有內容-它是什麼,在什麼時候和何處完成其功能
Spring提供了4種各具特點的AOP支持
在XML文件中添加以下代碼
<aop:aspectj-autoproxy>如今開始就可使用@AspectJ註解來開啓AOP,有意思的是,雖然咱們使用@AspectJ註解做爲指引來建立基於代理的切面,但本質上它仍然是一個Spring風格的切面.
如下代碼建立一個POJO使其成爲切面
@Aspect public class LogAOP { //sevice包及其子包全部類的全部方法 @Pointcut("execution(* com.kenshiro.service..*.*(..))") public void log(){} @Before("log()") public void beforeLog(){ System.out.println("方法前執行"); } @AfterReturning("log()") public void AfterLog(){ System.out.println("方法成功返回執行"); } @Around("log()") public void AroundLog(ProceedingJoinPoint joinpoint){ System.out.println("方法以前執行"); joinpoint.proceed(); //執行業務代碼 System.out.println("方法以後執行"); } }
就是這麼簡單,一個簡單的POJO加上一個@Aspect ,定義一個或者多個切點(pointcut).N個通知方法(advice).
切點配合通知即是切面,切面即是AOP(在什麼位置,何時,作什麼)