Day55~56(spring註解高階AOP)56
一、設計模式-代理模式
代理模式:給某一個物件提供一個代理物件,並由代理物件控制對源物件的引用。代理 就是一個人或一個機構代表另一個人或者一個機構採取行動。某些情況下,客戶不想或者不 能夠直接引用一個物件,代理物件可以在客戶和目標物件直接起到中介的作用。客戶端分辨 不出代理主題物件與真實主題物件。代理模式可以並不知道真正的被代理物件,而僅僅持有 一個被代理物件的介面,這時候代理物件不能夠建立被代理物件,被代理物件必須有系統的 其他角色代為建立並傳入。 為什麼要使用代理模式呢? 第一,它有間接的特點,可以起到中介隔離作用。就好比在租房的時候,房東可能不在 本地,而短期內又不能趕回來,此時中介的出場,就作為房東的代理實現和我們簽訂承租合 同。而我們和房東之間就沒有耦合了。 第二,它有增強的功能。還以租房為例,我們首先考慮的是找一個靠譜的中介,由中介 給我們提供房源資訊,並且告訴我們房屋的細節,合同的細節等等。當然我們也可以自己去 找一些個人出租的房屋,但是在這之中,我們要了解租賃合同,房屋驗收,租金監管等情 況,這無疑對我們是繁重的工作。而有了中介作為我們的代理中間人,他把了解到的資訊告 訴我們,我們一樣可以租到房子,而不必做那些繁重的工作。
二、AOP思想及實現原理
1、AOP思想
在軟體業,AOP為Aspect Oriented Programming的縮寫,意為:面向切面程式設計,通 過預編譯方 式和執行期動態代理實現程式功能的統一維護的一種技術。AOP是OOP的延續,是軟體開發中 的一個 熱點,也是Spring框架中的一個重要內容,是函數語言程式設計的一種衍生範型。利用AOP可以對 業務邏輯 的各個部分進行隔離,從而使得業務邏輯各部分之間的耦合度降低,提高程式的可重用性, 同時提高 了開發的效率。
2、實現原理
在上面的概念中描述出aop的實現原理是基於動態代理技術實現的。下面是針對動態代 理的一些介紹:
特點: 位元組碼隨用隨建立,隨用隨載入
分類: 基於介面的動態代理,基於子類的動態代理
作用: 不修改原始碼的基礎上對方法增強 基於介面的動態代理:
提供者是:JDK官方
使用要求:被代理類最少實現一個介面。
涉及的類:Proxy
建立代理物件的方法:newProxyInstance
方法的引數: ClassLoader:類載入器。用於載入代理物件的位元組碼的。和被代理物件使 用相同的類載入器。固定寫法。
Class[]:位元組碼陣列。用於給代理物件提供方法。和被代理物件具有相同的 方法。 被代理類是一個普通類:
被代理類對 象.getClass().getInterfaces();
被代理類是一個介面:new Class[]{被代理了.class}
它也是固定寫法
InvocationHanlder:要增強的方法。此處是一個介面,我們需要提供它的 實現類。 通常寫的是匿名內部類。增強的程式碼誰用誰寫。 基於子類的動態代理
提供者是:第三方cglib包,在使用時需要先導包(maven工程匯入座標即可)
使用要求:被代理類不能是最終類,不能被final修飾
涉及的類:Enhancer
建立代理物件的方法:create
方法的引數: Class:位元組碼。被代理物件的位元組碼。可以建立被代理物件的子類,還可以 獲取被代理物件的類載入器。
Callback:增強的程式碼。誰用誰寫。通常都是寫一個介面的實現類或者匿名 內部類。
Callback中沒有任何方法,所以我們一般使用它的子介面: MethodInterceptor
3、Spring中AOP的術語
Joinpoint(連線點):
所謂連線點是指那些被攔截到的點。在spring中,指的是方法,因為spring只支援方 法型別的連線點。
Pointcut(切入點):
所謂切入點是指我們要對哪些Joinpoint進行攔截的定義。
Advice(通知/增強):
所謂通知是指攔截到Joinpoint之後所要做的事情就是通知。 通知的型別:前置通知,後置通知,異常通知,最終通知,環繞通知。
Introduction(引介):
引介是一種特殊的通知在不修改類程式碼的前提下, 可以在執行期為類動態地新增一 些方法或Field。
Target(目標物件): 代理的目標物件。
Weaving(織入):
是指把增強應用到目標物件來建立新的代理物件的過程。 spring採用動態代理織入,而AspectJ採用編譯期織入和類裝載期織入。
Proxy(代理): 一個類被AOP織入增強後,就產生一個結果代理類。
Aspect(切面):
是切入點和通知(引介)的結合。
三、Spring註解驅動AOP開發入門
1、寫在最前
a.Spring的aop是基於ioc的。所以需要有spring的ioc基礎。(本篇內容不對ioc進行講 解)
b.本章節我們只是對aop的使用做基本功能展示,目的是為了以此講解aop中的註解和執行原 理分析。
2、註解驅動入門案例介紹
需求: 實現在執行service方法時輸出執行日誌。(除了業務層外,表現層和持久層也可 以實現)
3、案例實現
實體類:(在本案例中沒有實際作用)
/**
* @author 黑馬程式設計師
* @Company http://www.itheima.com
*/
public class User implements Serializable {
private String id;
private String username;
private String password;
private String email;
private Date birthday;
private String gender;
private String mobile;
private String nickname;
}
業務層介面:
/**
* @author 黑馬程式設計師
* @Company http://www.itheima.com
*/
public interface UserService {
/**
* 儲存使用者
* @param user
*/
void save(User user);
}
業務層實現類:
/**
* 使用者的業務層實現類
* @author 黑馬程式設計師
* @Company http://www.itheima.com
*/