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>