靜態代理和動態代理的區別和理解

            靜態代理

                     概念:由程序員創建代理類或特定工具自動生成源代碼再對其編譯。在程序運行前代理類的.class文件就已經存在了。

                     優點:代理使客戶端不需要知道實現類是什麼,怎麼做的,而客戶端只需知道代理即可(解耦合)

                     缺點:      

                            1)代理類和委託類實現了相同的接口,代理類通過委託類實現了相同的方法。這樣就出現了大量的代碼重複。如果接口增加一個方法,除了所有實現類需要實現這個方法外,所有代理類也需要實現此方法。增加了代碼維護的複雜度。

                            2)代理對象只服務於一種類型的對象,如果要服務多類型的對象。勢必要爲每一種對象都進行代理,靜態代理在程序規模稍大時就無法勝任了。

                   說明:代理可以對實現類進行統一的管理,如在調用具體實現類之前,需要打印日誌等信息,這樣我們只需要添加一個代理類,在代理類中添加打印日誌的功能,然後調用實現類,這樣就避免了修改具體實現類。滿足我們所說的開閉原則。但是如果想讓每個實現類都添加打印日誌的功能的話,就需要添加多個代理類,以及代理類中各個方法都需要添加打印日誌功能(如上的代理方法中刪除,修改,以及查詢都需要添加上打印日誌的功能)

                          即靜態代理類只能爲特定的接口(Service)服務。如想要爲多個接口服務則需要建立很多個代理類。

 

           動態代理

                         概念:在程序運行時運用反射機制動態創建而成。

                         優點:動態代理與靜態代理相比較,最大的好處是接口中聲明的所有方法都被轉移到調用處理器一個集中的方法中處理(InvocationHandler.invoke)。這樣,在接口方法數量比較多的時候,我們可以進行靈活處理,而不需要像靜態代理那樣每一個方法進行中轉。而且動態代理的應用使我們的類職責更加單一,複用性更強。

                        

 代理的通俗理解:其實所謂代理,就是一個人或者一個機構代表另一個人或者另一個機構採取行動。在一些情況下,一個客戶不想或者不能夠直接引用一個對象,而代理對象可以在客戶端和目標對象之前起到中介的作用。

案例說明:代理對象就是把被代理對象包裝一層,在其內部做一些額外的工作,比如用戶需要上facebook,而普通網絡無法直接訪問,網絡代理幫助用戶先FQ,然後再訪問facebook。這就是代理的作用了。

總結:

縱觀靜態代理與動態代理,它們都能實現相同的功能,而我們看從靜態代理到動態代理的這個過程,我們會發現其實動態代理只是對類做了進一步抽象封裝,使其複用性易用性得到進一步提升而這不僅僅符合了面向對象的設計理念,其中還有AOP的身影,這也提供給我們對類抽象的一種參考。關於動態代理與AOP的關係,個人覺得AOP是一種思想,而動態代理是一種AOP思想的實現!

               

                                                                                       注:部分參考文檔:https://www.cnblogs.com/baizhanshi/p/6611164.html

 

筆記:創建Bean的方式

BeanFactory與FactoryBean的區別

1,BeanFactory接口,頂層父工廠,容器,獲取bean的實例

2,FactoryBean 接口,實例化不能通過默認無參構造方法獲取的bean通過子類的getObject方法來返回實例,如SessionFactory

如果一個類沒有構造方法,但是可以用其它方式拿到它的對象,就可以用FactoryBean

多用於Spring的框架集成

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章