Spring框架_靜態(tài)代理 動(dòng)態(tài)代理

什么是代理

我們大家都知道微商代理褐隆,簡(jiǎn)單地說(shuō)就是代替廠(chǎng)家賣(mài)商品侦副,廠(chǎng)家“委托”代理為其銷(xiāo)售商品侦锯。關(guān)于微商代理,首先我們從他們那里買(mǎi)東西時(shí)通常不知道背后的廠(chǎng)家究竟是誰(shuí)秦驯,也就是說(shuō)尺碰,“委托者”對(duì)我們來(lái)說(shuō)是不可見(jiàn)的;我們把微商代理和廠(chǎng)家進(jìn)一步抽象,前者可抽象為代理類(lèi)汇竭,后者可抽象為委托類(lèi)(被代理類(lèi))葱蝗。通過(guò)使用代理穴张,通常有兩個(gè)優(yōu)點(diǎn)细燎,并且能夠分別與我們提到的微商代理的兩個(gè)特點(diǎn)對(duì)應(yīng)起來(lái):
優(yōu)點(diǎn)一:可以隱藏委托類(lèi)的實(shí)現(xiàn);
優(yōu)點(diǎn)二:可以實(shí)現(xiàn)客戶(hù)與委托類(lèi)間的解耦,在不修改委托類(lèi)代碼的情況下能夠做一些額外的處理皂甘。

靜態(tài)代理

由程序員創(chuàng)建或工具生成代理類(lèi)的源碼玻驻,再編譯代理類(lèi)。所謂靜態(tài)也就是在程序運(yùn)行前就已經(jīng)存在代理類(lèi)的字節(jié)碼文件偿枕,代理類(lèi)和委托類(lèi)的關(guān)系在運(yùn)行前就確定了璧瞬。若代理類(lèi)在程序運(yùn)行前就已經(jīng)存在,那么這種代理方式被成為 靜態(tài)代理 渐夸,這種情況下的代理類(lèi)通常都是我們?cè)贘ava代碼中定義的嗤锉。 通常情況下, 靜態(tài)代理中的代理類(lèi)和委托類(lèi)會(huì)實(shí)現(xiàn)同一接口或是派生自相同的父類(lèi)墓塌。 下面我們用Vendor類(lèi)代表生產(chǎn)廠(chǎng)家瘟忱,Business類(lèi)代表微商代理,來(lái)介紹下靜態(tài)代理的簡(jiǎn)單實(shí)現(xiàn)苫幢,委托類(lèi)和代理類(lèi)都實(shí)現(xiàn)了Sell接口.:

//接口
public interface Sell {
  void sell();
  
}
public class Business implements Sell{

    public void sell() {
        System.out.println("代理買(mǎi)東西");
        
    }

}
public class Vendor implements Sell{

    public void sell() {
        System.out.println("廠(chǎng)家買(mǎi)東西");
        
    }
   
}
public class Test {
    
    public static void main(String[] args) {
        Sell s=new Vendor();
        s.sell();
    }

}

測(cè)試結(jié)果:廠(chǎng)家買(mǎi)東西

靜態(tài)代理類(lèi)優(yōu)缺點(diǎn)

優(yōu)點(diǎn):業(yè)務(wù)類(lèi)只需要關(guān)注業(yè)務(wù)邏輯本身访诱,保證了業(yè)務(wù)類(lèi)的重用性。這是代理的共有優(yōu)點(diǎn)韩肝。
缺點(diǎn):
1)代理對(duì)象的一個(gè)接口只服務(wù)于一種類(lèi)型的對(duì)象触菜,如果要代理的方法很多,勢(shì)必要為每一種方法都進(jìn)行代理哀峻,靜態(tài)代理在程序規(guī)模稍大時(shí)就無(wú)法勝任了涡相。
2)如果接口增加一個(gè)方法哲泊,除了所有實(shí)現(xiàn)類(lèi)需要實(shí)現(xiàn)這個(gè)方法外,所有代理類(lèi)也需要實(shí)現(xiàn)此方法漾峡。增加了代碼維護(hù)的復(fù)雜度攻旦。

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

代理類(lèi)在程序運(yùn)行時(shí)創(chuàng)建的代理方式被成為 動(dòng)態(tài)代理。 也就是說(shuō)生逸,這種情況下牢屋,代理類(lèi)并不是在Java代碼中定義的,而是在運(yùn)行時(shí)根據(jù)我們?cè)贘ava代碼中的“指示”動(dòng)態(tài)生成的槽袄。相比于靜態(tài)代理烙无, 動(dòng)態(tài)代理的優(yōu)勢(shì)在于可以很方便的對(duì)代理類(lèi)的函數(shù)進(jìn)行統(tǒng)一的處理,而不用修改每個(gè)代理類(lèi)的函數(shù)遍尺。 這么說(shuō)比較抽象截酷,下面我們結(jié)合一個(gè)實(shí)例來(lái)介紹一下動(dòng)態(tài)代理的這個(gè)優(yōu)勢(shì)是怎么體現(xiàn)的

//代理商
public class Business implements InvocationHandler{

    //指示
    private Object obj;
    
    
//  public void sell() {
//      System.out.println("代理買(mǎi)東西");
//      
//  }

    public Object getObj() {
        return obj;
    }


    public void setObj(Object obj) {
        this.obj = obj;
    }


    public Business(Object obj) {
        super();
        this.obj = obj;
    }


    public Object invoke(Object proxy, Method method, Object[] args)
            throws Throwable {
        method.invoke(obj, args);
        //System.out.println("代理買(mǎi)東西");
        return obj;
    }

}

測(cè)試

public class Test {
    
    public static void main(String[] args) {
        
        Business b=new Business(new Vendor());
        Sell s=(Sell)Proxy.newProxyInstance(Vendor.class.getClassLoader(), Vendor.class.getInterfaces(), b);
        s.sell();
    }

}

測(cè)試結(jié)果:廠(chǎng)家買(mǎi)東西

動(dòng)態(tài)代理實(shí)現(xiàn)步驟

具體步驟是:
a. 實(shí)現(xiàn)InvocationHandler接口創(chuàng)建自己的調(diào)用處理器
b. 給Proxy類(lèi)提供ClassLoader和代理接口類(lèi)型數(shù)組創(chuàng)建動(dòng)態(tài)代理類(lèi)
c. 以調(diào)用處理器類(lèi)型為參數(shù),利用反射機(jī)制得到動(dòng)態(tài)代理類(lèi)的構(gòu)造函數(shù)
d. 以調(diào)用處理器對(duì)象為參數(shù)乾戏,利用動(dòng)態(tài)代理類(lèi)的構(gòu)造函數(shù)創(chuàng)建動(dòng)態(tài)代理類(lèi)對(duì)象

動(dòng)態(tài)代理的優(yōu)點(diǎn)

優(yōu)點(diǎn):
動(dòng)態(tài)代理與靜態(tài)代理相比較迂苛,最大的好處是接口中聲明的所有方法都被轉(zhuǎn)移到調(diào)用處理器一個(gè)集中的方法中處理(InvocationHandler.invoke)。這樣鼓择,在接口方法數(shù)量比較多的時(shí)候三幻,我們可以進(jìn)行靈活處理,而不需要像靜態(tài)代理那樣每一個(gè)方法進(jìn)行中轉(zhuǎn)呐能。

推介:
http://doushini.iteye.com/blog/1847913
http://www.jb51.net/article/95685.htm

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末念搬,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子摆出,更是在濱河造成了極大的恐慌朗徊,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,039評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件偎漫,死亡現(xiàn)場(chǎng)離奇詭異爷恳,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)象踊,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,426評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)温亲,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人通危,你說(shuō)我怎么就攤上這事铸豁。” “怎么了菊碟?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,417評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵节芥,是天一觀(guān)的道長(zhǎng)。 經(jīng)常有香客問(wèn)我,道長(zhǎng)头镊,這世上最難降的妖魔是什么蚣驼? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,868評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮相艇,結(jié)果婚禮上颖杏,老公的妹妹穿的比我還像新娘。我一直安慰自己坛芽,他們只是感情好留储,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,892評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著咙轩,像睡著了一般获讳。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上活喊,一...
    開(kāi)封第一講書(shū)人閱讀 51,692評(píng)論 1 305
  • 那天丐膝,我揣著相機(jī)與錄音,去河邊找鬼钾菊。 笑死帅矗,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的煞烫。 我是一名探鬼主播浑此,決...
    沈念sama閱讀 40,416評(píng)論 3 419
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼红竭!你這毒婦竟也來(lái)了尤勋?” 一聲冷哼從身側(cè)響起喘落,我...
    開(kāi)封第一講書(shū)人閱讀 39,326評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤茵宪,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后瘦棋,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體稀火,經(jīng)...
    沈念sama閱讀 45,782評(píng)論 1 316
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,957評(píng)論 3 337
  • 正文 我和宋清朗相戀三年赌朋,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了凰狞。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,102評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡沛慢,死狀恐怖赡若,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情团甲,我是刑警寧澤逾冬,帶...
    沈念sama閱讀 35,790評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響身腻,放射性物質(zhì)發(fā)生泄漏产还。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,442評(píng)論 3 331
  • 文/蒙蒙 一嘀趟、第九天 我趴在偏房一處隱蔽的房頂上張望脐区。 院中可真熱鬧,春花似錦她按、人聲如沸牛隅。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,996評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)倔叼。三九已至,卻和暖如春宫莱,著一層夾襖步出監(jiān)牢的瞬間丈攒,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,113評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工授霸, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留巡验,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,332評(píng)論 3 373
  • 正文 我出身青樓碘耳,卻偏偏與公主長(zhǎng)得像显设,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子辛辨,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,044評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • 1捕捂、代理概念 為某個(gè)對(duì)象提供一個(gè)代理,以控制對(duì)這個(gè)對(duì)象的訪(fǎng)問(wèn)斗搞。 代理類(lèi)和委托類(lèi)有共同的父類(lèi)或父接口指攒,這樣在任何使用...
    孔垂云閱讀 7,670評(píng)論 4 54
  • 一、代理概念 為某個(gè)對(duì)象提供一個(gè)代理僻焚,以控制對(duì)這個(gè)對(duì)象的訪(fǎng)問(wèn)允悦。 代理類(lèi)和委托類(lèi)有共同的父類(lèi)或父接口,這樣在任何使用...
    wyatt_plus閱讀 791評(píng)論 0 5
  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理虑啤,服務(wù)發(fā)現(xiàn)隙弛,斷路器,智...
    卡卡羅2017閱讀 134,661評(píng)論 18 139
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語(yǔ)法狞山,類(lèi)相關(guān)的語(yǔ)法全闷,內(nèi)部類(lèi)的語(yǔ)法,繼承相關(guān)的語(yǔ)法萍启,異常的語(yǔ)法总珠,線(xiàn)程的語(yǔ)...
    子非魚(yú)_t_閱讀 31,639評(píng)論 18 399
  • 黑執(zhí)事·那個(gè)執(zhí)事姚淆,真愛(ài)【同人/耽美/不喜勿入】 入黑執(zhí)事的坑已經(jīng)四年了孕蝉,很喜歡塞夏這對(duì)別扭的主仆,今天我們來(lái)講述他...
    秦云渚閱讀 412評(píng)論 0 2