代理模式

代理模式一般分為兩種,即靜態(tài)代理和動(dòng)態(tài)代理,靜態(tài)代理限制比較嚴(yán)格,代理類(lèi)和委托類(lèi)必須實(shí)現(xiàn)相同的接口;而動(dòng)態(tài)代理則更加靈活,除了jdk的動(dòng)態(tài)代理,其他的代理方式,如cglib和javassist則沒(méi)有此限制。Hibernate框架加載用戶信息時(shí)有用到cglib動(dòng)態(tài)代理模式,只有在真正查詢用戶實(shí)體信息(如姓名)時(shí),才去數(shù)據(jù)庫(kù)查詢;獲取用戶實(shí)體時(shí),返回的其實(shí)是真實(shí)實(shí)體的一個(gè)子類(lèi)代理而已。

靜態(tài)代理

靜態(tài)代理類(lèi)圖

一般來(lái)講,代理模式可以用在延遲加載,有效提升系統(tǒng)的啟動(dòng)速度。


動(dòng)態(tài)代理

動(dòng)態(tài)代理流程圖

JDK動(dòng)態(tài)代理

jdk動(dòng)態(tài)代理主要原理與靜態(tài)代理基本一致,不過(guò)更加靈活,一般涉及到的核心接口或類(lèi)為InvocationHandlerProxy,使用方式及實(shí)現(xiàn)原理在參考1中有較為詳細(xì)的解釋。

特別是為什么代理類(lèi)會(huì)執(zhí)行方法時(shí)會(huì)調(diào)用處理分發(fā)器** InvocationHandler的invoke方法的分析特別到位。**

cglib動(dòng)態(tài)代理

cglib動(dòng)態(tài)代理,不用限制代理類(lèi)和委托類(lèi)實(shí)現(xiàn)相同的接口,它的基本使用在參考2中有詳細(xì)的說(shuō)明。

核心示例代碼如下:

//cglib生成動(dòng)態(tài)代理
Enhancer enhancer = new Enhancer();
enhancer.setCallback(new CgLibDBQueryInterceptor()); //指定切入器,一個(gè)實(shí)現(xiàn)MethodInterceptor接口的類(lèi)
enhancer.setInterfaces(new Class[]{IDBQuery.class}); //指定實(shí)現(xiàn)的接口
//enhancer.setSuperclass();指定實(shí)現(xiàn)的父類(lèi)
//生成代理類(lèi)的實(shí)例(沒(méi)有接口限制,此處只不過(guò)恰好是接口而已,如果是普通類(lèi),則代理類(lèi)實(shí)質(zhì)上是普通類(lèi)的子類(lèi))
IDBQuery cglibProxy = (IDBQuery) enhancer.create(); //生成代理類(lèi)實(shí)例

參考

1 Java JDK 動(dòng)態(tài)代理(AOP)使用及實(shí)現(xiàn)原理分析
2 AOP的底層實(shí)現(xiàn)-CGLIB動(dòng)態(tài)代理和JDK動(dòng)態(tài)代理
3 Java動(dòng)態(tài)代理機(jī)制詳解

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 一> 代理模式 概述 代理(Proxy)是一種設(shè)計(jì)模式, 提供了對(duì)目標(biāo)對(duì)象另外的訪問(wèn)方式;即通過(guò)代理訪問(wèn)目標(biāo)對(duì)象。...
    奮斗的老王閱讀 1,213評(píng)論 0 50
  • 代理模式是常用的結(jié)構(gòu)型設(shè)計(jì)模式之一,當(dāng)無(wú)法直接訪問(wèn)某個(gè)對(duì)象或訪問(wèn)某個(gè)對(duì)象存在困難時(shí)可以通過(guò)一個(gè)代理對(duì)象來(lái)間接訪問(wèn),...
    SnDragon閱讀 1,402評(píng)論 2 4
  • 前言 之前已經(jīng)完成了IOC的源碼分析,接下來(lái)分析下AOP相關(guān)代碼。在分析之前,先記錄下aop的概念。 概念:作為面...
    阿亮私語(yǔ)閱讀 1,290評(píng)論 3 7
  • 在網(wǎng)上看到這樣一個(gè)問(wèn)題: 鄙人男,90年出生,2013畢業(yè)于一所普通二本大學(xué),會(huì)計(jì)專(zhuān)業(yè),身高178,體重55KG,...
    內(nèi)蒙古中新教育閱讀 10,440評(píng)論 3 2
  • 心慌慌的時(shí)刻 坐過(guò)山車(chē)飛駛而下心無(wú)限下墜落空的感覺(jué) 說(shuō)白了,安全感的缺失 大學(xué)四年 轉(zhuǎn)眼第一年即將過(guò)去 英語(yǔ)老師說(shuō)...
    Pulan777閱讀 194評(píng)論 0 0

友情鏈接更多精彩內(nèi)容