JDK中的AOP、動態代理

AOP(Aspect Oriented Programming,面向切面編程、面向方面編程)應用到項目中能夠將與業務邏輯不相關的代碼(如:日誌、權限等)分離出來,減小相關業務類負擔,並能讓一些通用需求(如:事務)得到更廣泛的複用。 AOP的實現是利用了java的代理機制。

代理模式是常用的java設計模式,他的特徵是代理類與委託類有同樣的接口,代理類主要負責爲委託類預處理消息、過濾消息、把消息轉發給委託類,以及事後處理消息等。代理類與委託類之間通常會存在關聯關係,一個代理類的對象與一個委託類的對象關聯,代理類的對象本身並不真正實現服務,而是通過調用委託類的對象的相關方法,來提供特定的服務。 按照代理的創建時期,代理類可以分爲兩種:

  • 靜態代理:由程序員創建或特定工具自動生成源代碼,再對其編譯。在程序運行前,代理類的.class文件就已經存在了;
  • 動態代理:在程序運行時,運用反射機制動態創建而成。

靜態代理

要求代理對象與被代理對象都實現同一個接口,以下代碼就是通過靜態代理實現了AOP,UserManagerProxy代理了UserManagerImpl的addUser方法。但是靜態代理一般不能滿足我們項目開發的需求,如果業務需求很多它得爲每一個業務方法一一做代理。

JDK動態代理

與靜態代理類對照的是動態代理類,動態代理類的字節碼在程序運行時由Java反射機制動態生成,無需程序員手工編寫它的源代碼。動態代理類不僅簡化了編程工作,而且提高了軟件系統的可擴展性,因爲Java 反射機制可以生成任意類型的動態代理類。java.lang.reflect 包中的Proxy類和InvocationHandler 接口提供了生成動態代理類的能力。 Java Proxy只能代理接口,不能代理類。

需實現java.lang.reflect.InvocationHandler的接口,重寫invoke(Object proxy,Method method,Object[] args)方法,代理對象實例由Proxy.newProxyInstance(ClassLoader loader,Class interfaces,InvocationHandler h)方法生成,當代理對象的方法被執行時,通知執行器(InvocationHandler)執行invoke(Object proxy,Method method,Object[] args)方法,invoke方法內調用了method.invoke(Object obj,Object… args)方法,該方法對帶有指定參數的指定對象調用由此 Method 對象表示的基礎方法,應該這時才真正代理執行了業務邏輯。

CGLIB動態代理

JDK的動態代理機制只能代理實現了接口的類,而不能實現接口的類就不能實現JDK的動態代理,cglib是針對類來實現代理的,它的原理是對指定的目標類生成一個子類,並覆蓋其中方法實現增強,但因爲採用的是繼承,所以不能對final修飾的類進行代理。

JDK動態代理和CGLIB字節碼生成的區別?

  • JDK動態代理只能對實現了接口的類生成代理,而不能針對類;
  • CGLIB是針對類實現代理,主要是對指定的類生成一個子類,覆蓋其中的方法。因爲是繼承,所以該類或方法最好不要聲明成final。

發佈了52 篇原創文章 · 獲贊 3 · 訪問量 14萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章