動態代理, 講到動態代理,就有對應的靜態代理
靜態代理的實作,方式1 繼承目標類,生成一個子類,代理類和目標類是父子的關系, 然后在子類中進行邏輯的擴展,完成了靜態代理, 方式2 基于介面的實作,目標類也是實作了介面,那么新建一個實作了同一介面的代理類,然后代理類中持有目標物件,通過代理類的構造方法注入目標物件,然后在代理類的方法中執行增強的業務邏輯,
動態代理的實作, jdk的動態代理,為什么只能給予介面來實作呢? 以為jdk生成的代理類已經繼承了Proxy類,實作了目標物件,所以只能是給予介面的實作了,是由于java的單繼承多實作造成的,
1) JDK實作動態代理需要兩個組件,首先第一個就是InvocationHandler介面,我們在使用JDK的動態代理時,需要撰寫一個類,去實作這個介面,然后重寫invoke方法,這個方法其實就是我們提供的代理方法,然后JDK動態代理需要使用的第二個組件就是Proxy這個類,我們可以通過這個類的newProxyInstance方法,回傳一個代理物件,生成的代理類實作了原來那個類的所有介面,并對介面的方法進行了代理,我們通過代理物件呼叫這些方法時,底層將通過反射,呼叫我們實作的invoke方法,
2)cblig的動態實作 JDK的動態代理存在限制,那就是被代理的類必須是一個實作了介面的類,代理類需要實作相同的介面,代理介面中宣告的方法,若需要代理的類沒有實作介面,此時JDK的動態代理將沒有辦法使用,于是Spring會使用CGLib的動態代理來生成代理物件,CGLib直接操作位元組碼,生成類的子類,重寫類的方法完成代理,重寫類的所有的可以重寫的方法,重寫的程序中,就把我們定義的額外的邏輯,即spring的切面織入到方法中,對方法進行了增強, 如果類被final修飾,不能代理,如果方法是被final、private修飾,不能代理,
注意,jdk動態代理生成的代理類是繼承了Proxy這個類,而cglib動態代理生成的代理類是繼承了需要進行代理的那個類,所以,我們可以通過輸出代理物件所屬類的父類,來判斷spring使用了何種代理方式, cglib動態代理生成代理類的速度相對jdk低,但是執行代理方法的速度相對jdk高,因為jdk是利用了反射的技術執行被代理物件的具體方法,而cglib是利用位元組碼技術生成了被代理類的子類,
所以,spring的aop的核心是jdk和cglib的動態代理,加上spring內部的beanPostProcessor,達到對spring中的bean增強的效果,
本文由博客一文多發平臺 OpenWrite 發布!
作者:RichardCui
出處:https://www.cnblogs.com/yachao1120/
本文著作權歸作者和博客園共有,歡迎轉載,但未經作者同意必須保留此段宣告,且在文章頁面明顯位置給出原文連接,否則保留追究法律責任的權利,該文章也同時發布在我的獨立博客中-RichardCuiBlog,
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/456972.html
標籤:Java
下一篇:Java-GUI編程之事件處理
