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

一筋蓖、動(dòng)態(tài)簡(jiǎn)單說明

  • jdk動(dòng)態(tài)代理:利用反射機(jī)制荤西,基于接口創(chuàng)建被代理對(duì)象的代理實(shí)例(僅支持基于接口進(jìn)行代理澜搅,無法對(duì)類進(jìn)行代理)代理類通過實(shí)現(xiàn)InvocationHander.invok();
  • cglib動(dòng)態(tài)代理:基于繼承的方式代理目標(biāo)類和方法,但是不能是final 類型的;
    通過實(shí)現(xiàn)MethodInterceptor.interceptor();
    CGLIB$intercept() 方法實(shí)際上是委托給 DynamicAdvisedInterceptor 的 intercept(),這個(gè)過程是由CGLIB庫(kù)通過字節(jié)碼生成技術(shù)(ASM)完成的邪锌。

二勉躺、動(dòng)態(tài)代理簡(jiǎn)單使用

public interface A {
    public void a();
    public void b();
}
public class Aimpl implements A{
    @Override
    public void a() {
        System.out.println("執(zhí)行方法A~~~~");
    }

    @Override
    public void b() {
        System.out.println("執(zhí)行方法B~~~~");
    }
}

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

public class JdkProxyTest implements InvocationHandler {

    private A a;

    public JdkProxyTest(A a){
        this.a = a;
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        System.out.println("jdk代理-invoke執(zhí)行~~~~");
        return method.invoke(a,args);
    }

    public static A newProxyInstance(A a){
        return (A) Proxy.newProxyInstance(JdkProxyTest.class.getClassLoader(),new Class[]{A.class},new JdkProxyTest(a));
    }

    public static void main(String[] args) {
        A a = new Aimpl();
        A jdkProxy = JdkProxyTest.newProxyInstance(a);
        jdkProxy.a();
        jdkProxy.b();
    }
}

輸出:


image.png

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

public class CglibProxyTest implements MethodInterceptor {

    @Override
    public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {

        System.out.println("cglib代理-interceptor執(zhí)行~~~~");

        return methodProxy.invokeSuper(o,objects);
    }


    public static  <T extends A>  A newProxyInstance(Class<T> targetInstanceClazz){
        Enhancer enhancer = new Enhancer();
        enhancer.setCallback(new CglibProxyTest());
        enhancer.setSuperclass(targetInstanceClazz);
        enhancer.setInterfaces(new Class[]{A.class});

        return  (A) enhancer.create();
    }
    public static void main(String[] args) {
        A cglibAgent = CglibProxyTest.newProxyInstance(Aimpl.class);
        cglibAgent.a();
        cglibAgent.b();
    }
}

輸出:


image.png

三、spring集成動(dòng)態(tài)代理源碼解析

  1. 使用@EnableAspectJAutoProxy 確認(rèn)使用哪種代理秃流。
  • 參數(shù):proxyTargetClass true表示使用cglib代理赂蕴,false表示使用jdk代理柳弄;參數(shù)
  • 參數(shù):exposeProxy 值為true 表示暴露代理類舶胀,目標(biāo)類中可以嵌套代理類,使用AopContext.currentProxy() 獲取代理類
  1. 源碼:
  • AbstractApplicationContext.java
public void refresh() throws BeansException, IllegalStateException {
        synchronized (this.startupShutdownMonitor) {
            
                      ...
            try {
            ... 
                finishBeanFactoryInitialization(beanFactory);
                        ...
    
            }
                        ...
        }
    }
  • 創(chuàng)建bean, AbstractAutowireCapableBeanFactory.createBean()


    createBean.png
applyBeanPostProcessorsBeforeInstantiation.png
applyBeanPostProcessorsBeforeInstantiation.png
  • AbstractAutoProxyCreator.postProcessBeforeInstantiation()
postProcessBeforeInstantiation.png
  • AspectJAwareAdvisorAutoProxyCreator.shouldSkip()


    shouldSkip.png
  • AnnotationAwareAspectJAutoProxyCreator.findCandidateAdvisors()

findCandidateAdvisors.png
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末碧注,一起剝皮案震驚了整個(gè)濱河市嚣伐,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌萍丐,老刑警劉巖轩端,帶你破解...
    沈念sama閱讀 211,194評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異逝变,居然都是意外死亡基茵,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,058評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門壳影,熙熙樓的掌柜王于貴愁眉苦臉地迎上來拱层,“玉大人,你說我怎么就攤上這事宴咧「疲” “怎么了?”我有些...
    開封第一講書人閱讀 156,780評(píng)論 0 346
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)烙肺。 經(jīng)常有香客問我纳猪,道長(zhǎng),這世上最難降的妖魔是什么桃笙? 我笑而不...
    開封第一講書人閱讀 56,388評(píng)論 1 283
  • 正文 為了忘掉前任氏堤,我火速辦了婚禮,結(jié)果婚禮上怎栽,老公的妹妹穿的比我還像新娘丽猬。我一直安慰自己,他們只是感情好熏瞄,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,430評(píng)論 5 384
  • 文/花漫 我一把揭開白布脚祟。 她就那樣靜靜地躺著,像睡著了一般强饮。 火紅的嫁衣襯著肌膚如雪由桌。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,764評(píng)論 1 290
  • 那天邮丰,我揣著相機(jī)與錄音行您,去河邊找鬼。 笑死剪廉,一個(gè)胖子當(dāng)著我的面吹牛娃循,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播斗蒋,決...
    沈念sama閱讀 38,907評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼捌斧,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了泉沾?” 一聲冷哼從身側(cè)響起捞蚂,我...
    開封第一講書人閱讀 37,679評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎跷究,沒想到半個(gè)月后姓迅,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,122評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡俊马,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,459評(píng)論 2 325
  • 正文 我和宋清朗相戀三年丁存,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片柴我。...
    茶點(diǎn)故事閱讀 38,605評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡解寝,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出屯换,到底是詐尸還是另有隱情编丘,我是刑警寧澤与学,帶...
    沈念sama閱讀 34,270評(píng)論 4 329
  • 正文 年R本政府宣布,位于F島的核電站嘉抓,受9級(jí)特大地震影響索守,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜抑片,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,867評(píng)論 3 312
  • 文/蒙蒙 一卵佛、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧敞斋,春花似錦截汪、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,734評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至焰枢,卻和暖如春蚓峦,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背济锄。 一陣腳步聲響...
    開封第一講書人閱讀 31,961評(píng)論 1 265
  • 我被黑心中介騙來泰國(guó)打工暑椰, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人荐绝。 一個(gè)月前我還...
    沈念sama閱讀 46,297評(píng)論 2 360
  • 正文 我出身青樓一汽,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親低滩。 傳聞我的和親對(duì)象是個(gè)殘疾皇子召夹,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,472評(píng)論 2 348

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