SSH框架之Spring的代理模式

一、概述:
1、代理(Proxy)是一種設計模式, 提供了對目標對象另外的訪問方式;即通過代理訪問目標對象。
2、這樣好處:可以在目標對象實現的基礎上,增強額外的功能操作。(擴展目標對象的功能)。
3、舉例:

明星(鄧紫棋)<---經紀人<---用戶  
   目標         (代理)


4、代理模式的關鍵點: 代理對象與目標對象。

二、靜態代理
1、概述:
1) 代理對象,要實現與目標對象一樣的接口;
2) 舉例:

2、總結靜態代理:
1)可以做到在不修改目標對象的功能前提下,對目標對象功能擴展。
2)缺點:
a)因爲代理對象,需要與目標對象實現一樣的接口。所以會有很多代理類,類太多。
b)一旦接口增加方法,目標對象與代理對象都要維護。

如何解決靜態代理的缺點:
1、代理工廠
2、可以使用動態代理

三、動態代理
1、概述:
1)代理對象,不需要實現接口。
2)代理對象的生成,是利用JDKAPI, 動態的在內存中構建代理對象(需要我們指定創建 代理對象/目標對象 實現的接口的類型)。
3)動態代理又稱爲JDK代理或接口代理。

2、JDK中生成代理對象的API:

|-- Proxy
    static Object newProxyInstance(
            ClassLoader loader,      //指定當前目標對象使用類加載器
            Class<?>[] interfaces,   //目標對象實現的接口的類型
            InvocationHandler h      //事件處理器
)  

3、動態代理總結:
代理對象不需要實現接口,但是目標對象一定要實現接口;否則不能用動態代理!(class $Proxy0 implements IuserDao)

思考:有一個目標對象,想要功能擴展,但目標對象沒有實現接口,怎樣功能擴展?

Class  UserDao{}
// 子類的方式
Class subclass  extends  UserDao{}

以子類的方式實現(cglib代理)。

四、Cglib代理
1、概述:Cglib代理,也叫做子類代理。在內存中構建一個子類對象從而實現對目標對象功能的擴展。

JDK的動態代理有一個限制,就是使用動態代理的對象必須實現一個或多個接口。如果想代理沒有實現接口的類,就可以使用CGLIB實現。
CGLIB是一個強大的高性能的代碼生成包,它可以在運行期擴展Java類與實現Java接口。它廣泛的被許多AOP的框架使用,例如Spring
AOP和dynaop,爲他們提供方法的interception(攔截)。
CGLIB包的底層是通過使用一個小而快的字節碼處理框架ASM,來轉換字節碼並生成新的類。不鼓勵直接使用ASM,因爲它要求你必須對JVM內部結構包括class文件的格式和指令集都很熟悉。

2、Cglib子類代理:
1)需要引入cglib – jar文件, 但是spring的核心包中已經包括了cglib功能,所以直接引入spring-core-3.2.5.jar即可。
2)引入功能包後,就可以在內存中動態構建子類。
3)代理的類不能爲final, 否則報錯。
4)目標對象的方法如果爲final/static, 那麼就不會被攔截,即不會執行目標對象額外的業務方法。

五、在Spring的AOP編程中:
1、如果加入容器的目標對象有實現接口,用JDK代理。
2、如果目標對象沒有實現接口,用Cglib代理。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章