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

在開始為Spring做記錄之前,我把之前學(xué)代理的筆記整理一番畏鼓,方便寫AOP的時(shí)候拿出來(lái)看看酱酬。

首先搞懂什么是代理,誰(shuí)代理誰(shuí)云矫,誰(shuí)又被誰(shuí)代理膳沽;然后清楚代理的目的,代理的好處让禀。這是我的方向挑社。

簡(jiǎn)單點(diǎn)說(shuō):當(dāng)對(duì)象a需要和對(duì)象b合作時(shí),b可能不太方便直接與a碰面(更多的是為了解耦巡揍,或者為了保護(hù)b)痛阻。這時(shí)候就出現(xiàn)了對(duì)象c,它是對(duì)象b的代理腮敌,由c和a直接打交道阱当。

注意三點(diǎn):
  • a可以不知道b的存在
  • 干實(shí)事的是b
  • c可以在b做事前后調(diào)用自己的方法
ps:代理對(duì)象一般要和被代理對(duì)象實(shí)現(xiàn)同一個(gè)接口,為了保證行為的一致性糜工。

靜態(tài)代理

先貼出代碼:

public class WangPoStatic implements KindWomen{
    
    private String name = "王婆";
    private KindWomen kindWomen;
    
    public WangPoStatic(KindWomen kindWomen) {
        this.kindWomen = kindWomen;
    }
    
    public void makeEyesToMen() {
        getMoneyFromMen();
        kindWomen.makeEyesToMen();
        dealWithLastThing();
    }
    
    @Override
    public void happyWithMen() {
        getMoneyFromMen();
        kindWomen.happyWithMen();
        dealWithLastThing();
    }
    
    //代理類動(dòng)作
    private void getMoneyFromMen() {
        System.out.println(name + "收好處了弊添。。捌木。");   
    }
    
    private void dealWithLastThing() {
        System.out.println(name + "善后了油坝。。钮莲。");    
    }
}

很明顯了免钻,通過(guò)構(gòu)造方法注入的就是真實(shí)對(duì)象,當(dāng)通過(guò)代理類調(diào)用公共接口中的方法時(shí)崔拥,真正干活的是真實(shí)對(duì)象极舔,只是被隱藏起來(lái)了。

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

上面的靜態(tài)代理就可以搞明白了我們?cè)鹊囊蓡?wèn)链瓦。即代理類在委托類(真實(shí)對(duì)象)執(zhí)行前后進(jìn)行自己的操作拆魏。但是靜態(tài)代理并不能滿足開發(fā)人員的要求盯桦,原因是若是公共接口有很多方法呢?那豈不是每個(gè)方法都要手動(dòng)操作一番渤刃?

這里介紹JDK中的一種動(dòng)態(tài)代理方式拥峦,這種代理方式能在運(yùn)行期間動(dòng)態(tài)地創(chuàng)建代理對(duì)象。

實(shí)現(xiàn)步驟:
i:創(chuàng)建實(shí)現(xiàn)接口InvocationHandler的類卖子,作為調(diào)用處理器略号;
ii:創(chuàng)建被代理的類以及接口;
iii:通過(guò)Proxy的靜態(tài)方法創(chuàng)建一個(gè)代理

newProxyInstance(ClassLoader loader, Class[] interfaces, InvocationHandler h) 

iV: 通過(guò)代理調(diào)用方法

貼出部分代碼:
// 實(shí)現(xiàn)了 InvocationHandler 接口的處理器
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
//第一個(gè)參數(shù)是代理對(duì)象洋闽,第二個(gè)是被調(diào)用的方法對(duì)象玄柠,第三個(gè)是方法對(duì)象執(zhí)行invoke時(shí)需要的參數(shù)
        getMoneyFromMen();
        Object object = method.invoke(kw, args);   //kw 為委托對(duì)象
        dealWithLastThing();
        return object;
    }
//test方法
KindWomen kinWomen = new PanJinlian(); //真實(shí)對(duì)象  (根據(jù)真實(shí)對(duì)象 創(chuàng)建不同的代理對(duì)象)
        //創(chuàng)建代理對(duì)象
        KindWomen proxyKw = null;
        WangPoDyn wpd = new WangPoDyn(kinWomen);
        Object proxyInstance = Proxy.newProxyInstance(KindWomen.class.getClassLoader(), Ruhua.class.getInterfaces(), wpd);
        if(proxyInstance != null && proxyInstance instanceof KindWomen) {
            proxyKw = (KindWomen) proxyInstance;
        }
        proxyKw.makeEyesToMen();
        System.out.println("******************");
        proxyKw.happyWithMen();

代理對(duì)象調(diào)用方法時(shí)會(huì)回到調(diào)用處理器的invoke()方法里面。這個(gè)處理器對(duì)象中的invoke方法可以分為兩部分:一部分是 method.invoke(obj, args) 即真實(shí)對(duì)象干活诫舅,另一部分是在其前后執(zhí)行的其它方法羽利,在AOP中叫做連接點(diǎn)。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末刊懈,一起剝皮案震驚了整個(gè)濱河市这弧,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌虚汛,老刑警劉巖匾浪,帶你破解...
    沈念sama閱讀 219,427評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異泽疆,居然都是意外死亡户矢,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,551評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門殉疼,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)梯浪,“玉大人,你說(shuō)我怎么就攤上這事瓢娜」衣澹” “怎么了?”我有些...
    開封第一講書人閱讀 165,747評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵眠砾,是天一觀的道長(zhǎng)虏劲。 經(jīng)常有香客問(wèn)我,道長(zhǎng)褒颈,這世上最難降的妖魔是什么柒巫? 我笑而不...
    開封第一講書人閱讀 58,939評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮谷丸,結(jié)果婚禮上堡掏,老公的妹妹穿的比我還像新娘。我一直安慰自己刨疼,他們只是感情好泉唁,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,955評(píng)論 6 392
  • 文/花漫 我一把揭開白布鹅龄。 她就那樣靜靜地躺著,像睡著了一般亭畜。 火紅的嫁衣襯著肌膚如雪扮休。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,737評(píng)論 1 305
  • 那天拴鸵,我揣著相機(jī)與錄音玷坠,去河邊找鬼。 笑死宝踪,一個(gè)胖子當(dāng)著我的面吹牛侨糟,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播瘩燥,決...
    沈念sama閱讀 40,448評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼不同!你這毒婦竟也來(lái)了厉膀?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,352評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤二拐,失蹤者是張志新(化名)和其女友劉穎服鹅,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體百新,經(jīng)...
    沈念sama閱讀 45,834評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡企软,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,992評(píng)論 3 338
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了饭望。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片仗哨。...
    茶點(diǎn)故事閱讀 40,133評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖铅辞,靈堂內(nèi)的尸體忽然破棺而出厌漂,到底是詐尸還是另有隱情,我是刑警寧澤斟珊,帶...
    沈念sama閱讀 35,815評(píng)論 5 346
  • 正文 年R本政府宣布苇倡,位于F島的核電站,受9級(jí)特大地震影響囤踩,放射性物質(zhì)發(fā)生泄漏旨椒。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,477評(píng)論 3 331
  • 文/蒙蒙 一堵漱、第九天 我趴在偏房一處隱蔽的房頂上張望综慎。 院中可真熱鬧,春花似錦怔锌、人聲如沸寥粹。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,022評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)涝涤。三九已至媚狰,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間阔拳,已是汗流浹背崭孤。 一陣腳步聲響...
    開封第一講書人閱讀 33,147評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留糊肠,地道東北人辨宠。 一個(gè)月前我還...
    沈念sama閱讀 48,398評(píng)論 3 373
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像货裹,于是被迫代替她去往敵國(guó)和親嗤形。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,077評(píng)論 2 355

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