手动实现SPring中的AOP(1)
生活随笔
收集整理的這篇文章主要介紹了
手动实现SPring中的AOP(1)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
Spring中的AOP是基于JDK的API動態的在內存中創建代理對象的。所以這里先介紹一些設計模式之----代理模式:
a)???????? 代理模式的定義:代理(Proxy)模式是一種提供對目標對象另外訪問方式的設計模式;即客戶端通過代理對象訪問目標對象.這樣做的好處是:可以在目標對象實現的基礎上,增強額外的功能操作,實現對目標對象功能的擴展。
?
?
RealSubject相當于是目標對象,這就是客戶端實際要操作的對象;
ProxySubject相當于是代理對象;
Subject是目標對象和代理對象的抽象接口,該接口中存放的是兩者相同的方法。要想使用靜態代理或者動態代理,就必須保證目標對象和代理對象都實現了相同的接口。
b)???????? 代理模式的實現方式:
- 靜態代理:使用靜態代理的大致過程就是:先創建一個接口里邊包含目標對象的方法,然后目標對象和代理對象都要實現這個接口,這樣在客戶端使用的時候就可以調用相同的方法來實現對目標對象方法的調用,做到對用戶是透明的。
?
- 動態代理:動態代理中代理對象不需要實現和目標對象一樣的接口(目標對象還是要實現接口的,否則不能代理),并且代理對象的生成是根據JDK中的API動態的在內存中構建代理對象(我們需要指明將要創建的代理對象/目標對象的接口類型)。所以動態代理也叫做JDK代理或者接口代理。
- Cglib代理:上面的靜態代理和動態代理模式都是要求目標對象是實現一個接口的目標對象,但是有時候目標對象只是一個單獨的對象,并沒有實現任何的接口,這個時候就可以使用以目標對象子類的方式來實現代理,這種方法就叫做:Cglib代理。
c)???????? 三者的區別和比較:
- 靜態代理一般使用的比較少,主要是因為在這種方法中代理對象和目標對象需要實現相同的方法,如果目標方法實現的接口比較多,那么就會導致一個目標對象有多個代理對象;如果接口中的方法有改動代理對象和目標對象的代碼都需要改動,不符合開閉原則。
- 動態代理能夠使用JDK中的API在內存中動態生成代理對象,并且代理對象不需要實現和目標對象一樣的接口(目標對象需要實現接口),但是在動態生成代理對象的時候還是需要知道目標對象的接口類型。
- Cglib方法是通過在內存中創建目標對象的子類對象的方式動態實現對目標功能的擴展,目標對象不需要實現接口,在Spring的AOP編程中:如果加入容器的目標對象有實現接口,用JDK代理;如果目標對象沒有實現接口,用Cglib代理。
轉載于:https://www.cnblogs.com/BaoZiY/p/11375767.html
總結
以上是生活随笔為你收集整理的手动实现SPring中的AOP(1)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 手动实现Spring中的IOC容器
- 下一篇: 手动实现SPring中的AOP(2)