Java動態(tài)代理機(jī)制

我們知道Spring主要有兩大思想苞氮,一個是IoC,另一個就是AOP瓤逼,對于IoC笼吟,依賴注入就不用多說了,而AOP的原理就是java的動態(tài)代理機(jī)制

在java的動態(tài)代理機(jī)制中抛姑,有兩個重要的類或接口,一個是InvocationHandler(Interface)艳狐、另一個則是 Proxy(Class)

實(shí)例:在現(xiàn)在常見的系統(tǒng)中定硝,登錄和退出是用戶必備的操作之一毫目,下面我就設(shè)計(jì)這么一個接口蔬啡,用于處理用戶的登錄和退出操作

public interface User {  
    /**
     * 登錄
     * @param name 用戶名
     * @param pwd 密碼
     * @return
     */
    public boolean login(String username, String pwd);

    /**
     * 退出
     */
    public void logout(String username);
}```
委托類:

public class UserImpl implements User{

@Override
public boolean login(String username, String pwd) {
    // 簡化問題,直接登錄成功
    System.out.println(username+" 登錄成功.");
    return true;
}

@Override
public void logout(String username) {
    System.out.println(username+" 成功退出.");
}

}```
代理類:

import java.lang.reflect.InvocationHandler;  
import java.lang.reflect.Method;  
import java.lang.reflect.Proxy;

/**
 * 繼承動態(tài)代理接口的代理類
 */
public class UserDynamicProxy implements InvocationHandler{

    // 在線人數(shù)
    public static int count = 0;
    // 委托對象
    private Object target; 

    /**
     * 返回代理對象
     * @param target
     * @return
     */
    @SuppressWarnings("unchecked")
    public <T> T getProxyInstance(Object target) {
        // 委托對象镀虐,真正的業(yè)務(wù)對象
        this.target = target;
        // 獲取Object類的ClassLoader
        ClassLoader cl = target.getClass().getClassLoader();
        // 獲取接口數(shù)組
        Class<?>[] cs = target.getClass().getInterfaces();
        // 獲取代理對象并返回
        return (T)Proxy.newProxyInstance(cl, cs, this);
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        Object r = null;
        // 執(zhí)行之前
        r = method.invoke(target, args);
        // 判斷如果是登錄方法
        if("login".equals(method.getName())) {
            if((boolean)r == true) {
                // 當(dāng)前在線人數(shù)+1
                count += 1;
            }
        } 
        // 判斷如果是退出方法
        else if("logout".equals(method.getName())) {
            // 當(dāng)前在線人數(shù)-1
            count -= 1;
        }
        showCount(); // 輸出在線人數(shù)
        // 執(zhí)行之后
        return r;
    }

    /**
     * 輸出在線人數(shù)
     */
    public void showCount() {
        System.out.println("當(dāng)前在線人數(shù):"+count+" 人.");
    }

}```
測試類:

public class Main {

public static void main(String[] args) {
    // 真實(shí)角色箱蟆,委托人
    User user = new UserImpl();    // 可執(zhí)行真正的登錄退出功能

    // 代理類
    UserDynamicProxy proxy = new UserDynamicProxy();

    // 獲取委托對象user的代理對象
    User userProxy = proxy.getProxyInstance(user);

    // 系統(tǒng)運(yùn)行,用戶開始登錄退出
    userProxy.login("小明", "111");
    userProxy.login("小紅", "111");
    userProxy.login("小剛", "111");
    userProxy.logout("小明");
    userProxy.logout("小剛");
    userProxy.login("小黃", "111");
    userProxy.login("小黑", "111");
    userProxy.logout("小黃");
    userProxy.login("小李", "111");
    userProxy.logout("小李");
    userProxy.logout("小黃");
    userProxy.logout("小紅");
}

}```
輸出結(jié)果如下:

小明 登錄成功.
當(dāng)前在線人數(shù):1 人.
小紅 登錄成功.
當(dāng)前在線人數(shù):2 人.
小剛 登錄成功.
當(dāng)前在線人數(shù):3 人.
小明 成功退出.
當(dāng)前在線人數(shù):2 人.
小剛 成功退出.
當(dāng)前在線人數(shù):1 人.
小黃 登錄成功.
當(dāng)前在線人數(shù):2 人.
小黑 登錄成功.
當(dāng)前在線人數(shù):3 人.
小黃 成功退出.
當(dāng)前在線人數(shù):2 人.
小李 登錄成功.
當(dāng)前在線人數(shù):3 人.
小李 成功退出.
當(dāng)前在線人數(shù):2 人.
小黃 成功退出.
當(dāng)前在線人數(shù):1 人.
小紅 成功退出.
當(dāng)前在線人數(shù):0 人.```
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末刮便,一起剝皮案震驚了整個濱河市空猜,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖辈毯,帶你破解...
    沈念sama閱讀 222,252評論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件坝疼,死亡現(xiàn)場離奇詭異,居然都是意外死亡谆沃,警方通過查閱死者的電腦和手機(jī)钝凶,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,886評論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來唁影,“玉大人耕陷,你說我怎么就攤上這事【萆颍” “怎么了哟沫?”我有些...
    開封第一講書人閱讀 168,814評論 0 361
  • 文/不壞的土叔 我叫張陵,是天一觀的道長卓舵。 經(jīng)常有香客問我南用,道長,這世上最難降的妖魔是什么掏湾? 我笑而不...
    開封第一講書人閱讀 59,869評論 1 299
  • 正文 為了忘掉前任裹虫,我火速辦了婚禮,結(jié)果婚禮上融击,老公的妹妹穿的比我還像新娘筑公。我一直安慰自己,他們只是感情好尊浪,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,888評論 6 398
  • 文/花漫 我一把揭開白布匣屡。 她就那樣靜靜地躺著,像睡著了一般拇涤。 火紅的嫁衣襯著肌膚如雪捣作。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,475評論 1 312
  • 那天鹅士,我揣著相機(jī)與錄音券躁,去河邊找鬼。 笑死掉盅,一個胖子當(dāng)著我的面吹牛也拜,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播趾痘,決...
    沈念sama閱讀 41,010評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼慢哈,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了永票?” 一聲冷哼從身側(cè)響起卵贱,我...
    開封第一講書人閱讀 39,924評論 0 277
  • 序言:老撾萬榮一對情侶失蹤滥沫,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后艰赞,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體佣谐,經(jīng)...
    沈念sama閱讀 46,469評論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,552評論 3 342
  • 正文 我和宋清朗相戀三年方妖,在試婚紗的時候發(fā)現(xiàn)自己被綠了狭魂。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,680評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡党觅,死狀恐怖雌澄,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情杯瞻,我是刑警寧澤镐牺,帶...
    沈念sama閱讀 36,362評論 5 351
  • 正文 年R本政府宣布,位于F島的核電站魁莉,受9級特大地震影響睬涧,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜旗唁,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,037評論 3 335
  • 文/蒙蒙 一畦浓、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧检疫,春花似錦讶请、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,519評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至烛谊,卻和暖如春风响,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背丹禀。 一陣腳步聲響...
    開封第一講書人閱讀 33,621評論 1 274
  • 我被黑心中介騙來泰國打工状勤, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人湃崩。 一個月前我還...
    沈念sama閱讀 49,099評論 3 378
  • 正文 我出身青樓荧降,卻偏偏與公主長得像接箫,于是被迫代替她去往敵國和親攒读。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,691評論 2 361

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

  • 之前介紹的反射和注解都是Java中的動態(tài)特性辛友,還有即將介紹的動態(tài)代理也是Java中的一個動態(tài)特性薄扁。這些動態(tài)特性使得...
    Single_YAM閱讀 2,055評論 0 9
  • 基礎(chǔ):class文件簡介及加載流程 Java編譯器編譯好Java文件之后剪返,產(chǎn)生.class 文件在磁盤中。這種cl...
    jiangmo閱讀 478評論 0 1
  • 我痛恨煙邓梅,十分地脱盲。 小時候,因抵制爸爸吸煙日缨,軟硬兼施過钱反。也曾因此放狠話斷絕父女關(guān)系。 結(jié)果是匣距,不在我這個女兒面前抽...
    gengyy閱讀 394評論 3 1
  • 桐桐今天第一次坐寶寶椅~好開心的樣子面哥。 今天我們?nèi)ス溆斜聘竦氖辏┩┮呀?jīng)開始有意識的挑選自己喜歡的物件兒了毅待。三...
    帝嚳閱讀 453評論 0 49
  • 老妖1963閱讀 175評論 0 2