1. 程式人生 > >spring-aop註解程式設計

spring-aop註解程式設計

 

今天價紹的是AspectJ的註解開發:

一  AOP術語

要想面向切面程式設計,我們首先得了解一些基本的術語以及幾種不同的通知:

1.target目標類:需要被代理的類,我們可以簡單的理解為需要服務層中需要公共模組能力的類;

2.JoinPoint連線點:可能被攔截的方法(服務層中所有的方法);

3.CutPoint切入點:需要被增強的方法,也即需要公共能力(事務)的方法,當然查詢時不需要的;

4.Advice:通知:它指的就是公共模組的能力;

5.Weaving織入:它是一個虛擬的概念,把通知應用到目標類中建立代理的過程就叫做織入;

6.Proxy代理類:由Spring提供的代理類來完成通知和切入點的整合

7.Aspect切面:連線點和Advice的結合,比如說將日誌這種能力加如到tel()這個方法中,就形成一個切面,當你每次呼叫這個方法的時候,也同時回執行這個dan

注意:Aop用到的地方就是專案的服務層,其實IOC與DI就是用來給服務層中的一些屬性複製的;

 

 

再上面的七個名詞當中Advice有有三中不同的型別:

1.前置通知 MethodBeforeAdvice

2.後置通知:afterreturnAdvice

3.環繞通知:around

 

註解還是之前再IOC裡面將的那些註解在加上一下註解:

   @Before   @AfterReturning  @Around @Aspect 具體用法將會再下文中提到:

 

1首先我們同樣應該建立通知類,但建立通知類的時候應該加註解,還有一些要注意的點:

1) 我們應該先建一個通知類再類名之前

加註解@Component 然後再加 @Aspect—表面這是一個切面

2) 在類裡面我們應該首先建立一個切點函式(我是這麼命名的方便理解)、

切面函式的特點就是沒有引數 沒有函式體 而且函式名稱隨意(本文以myPoint為例);

在這個函式之上我們加註解

@PointCut(“ execution(* com.ww.service.*.*(..))”)//切入點表示式+PointCut宣告表面這是一個切入點;

3) 首先類建立前置通知

註解是@Before(“myPoint()”)

這樣的註解,首先Before表示這是一個前置通知,括號內的函式表示切入點

配置檔案掃描註解的時候,從這裡得到切入點;程式碼如下:

@Before("mypoint()")
public void myBefore(JoinPoint joinPoint){這裡的引數也要寫和之前一樣
        System.out.println("前置通知");

             }

4) 在來建立後置通知

註解是@AfterRuturning(“value=mypoint()”,returning=”res”)

同樣AfterRuturning表示這是一個後置通知;

Value表示的是切入點,returning表示的是返回值,

讀過前文應該都知道返回引數,這就不做贅述了。程式碼是:

@AfterReturning(value= "mypoint()",returning="res")
public void myAfter(JoinPoint joinPoint,Object res){
    System.out.println("後置通知"+res);
}

這裡再強調一下注意的地方:

第一:與之前在配置檔案中配置後置通知時,引數的名稱要與方法裡的引數名稱一致,同樣在這裡註解中的返回值名稱也要和方法裡的一樣。

第二:為什麼之前的幾個沒有value?

     因為當你的引數只有一個的時候value是可以省略的;

        有多個引數的時候要表明你的每一個引數代表什麼所以必須寫;

第三:也是小編經常犯的錯誤就是引數之間的逗號一定記得寫,否則報錯;

5) 最後來建立環繞通知

註解是@Around(“myPoint”)

意思一樣就不多贅述程式碼如下:

@Around("mypoint()")
      public Object myAround(ProceedingJoinPointproceedingJoinPoint) throws Throwable   {
        System.out.println("環繞錢");
        Objecta=proceedingJoinPoint.proceed();//執行目標方法
        System.out.println("還繞後");
        return  a;
    }

解釋一下:環繞通知的引數和之前的不一樣它的型別是ProceedingJoinPoint

在這就是使用環繞通知是必須手動呼叫方法,用的就是引數.proceed()’;它是由返回值的;

2 我們來建立目標類

  對於目標類與之前的區別IOC是註解的沒什麼區別註解就是

@Service(“該實現類的父介面名稱”)

需要注意的就是註解一定是加在實現類上的,就像配置的時候class的值是它的實現類的包名+類名是一樣的;

3我們類配置核心檔案applicotionContext.xml

像之前一樣註解方式我們只需要開啟註解掃描即可

但是此處我們用的是AspectJ的註解方式,所以我們還應該開啟的就是AspectJ的自動掃描,程式碼如下:

開啟註解掃描

<context:component-scan base-package= "com.qf.advice,com.qf.service"></context:component-scan>

開啟的就是AspectJ的自動掃描
   <aop:aspectj-autoproxy></aop:aspectj-autoproxy>