2010-02-09 88 views

回答

11

dynamic proxy是JDK的一項功能。它可以用來實現使用an invocation handler的接口。

的動態代理類(簡稱 到如下的代理類)是一類 當類是 創建的,以行爲如下所述 實現在運行時指定的接口 列表。代理接口是由 代理類實現的接口。代理實例是代理類的一個 實例。每個代理 實例都有一個關聯的調用 處理程序對象,該對象實現了接口InvocationHandler。

動態代理有一些開銷。儘管如此,對於大多數使用情況來說,開銷不會很大。真正的問題是動態代理的(過度)使用會使應用程序難以理解和調試。例如,動態代理將在堆棧跟蹤中顯示多行。

動態代理通常用於實現decorators。其中一個例子是Spring的AOP。 (我不想詳述AOP,並且不會使用AOP術語來保持簡單)。某些問題在某一類中實施並在許多地方使用。動態代理(和調用處理程序)只是粘合代碼(由Spring提供)攔截方法調用。 (實際上,動態代理只是這種功能的實現細節,動態生成類是實現它的另一種可能性。)

+0

我們爲什麼要實現?我想問一下關於Methology或相同的東西 – Linh 2010-02-09 09:10:52

37

代理使用AOP。總之:

通常你有。

Caller --> Real object 

但是,當,例如,你想自動事務管理,春天把你的真實對象

Caller --> Proxy --> Real object 

在代理啓動事務的代理。

Here is nice article說明代理的兩個要素,他們在彈簧效率(性能)

+5

Bozho,這是一個非常好的解釋。 – lwpro2 2011-01-20 03:31:00

+0

下一個問題 - 爲什麼春天需要使用aop?我只知道@Transaction註釋 – gstackoverflow 2015-11-09 22:17:38

+0

很多其他的東西。例如,緩存。日誌記錄。審計跟蹤。或者任何你可以發展自己的東西 – Bozho 2015-11-14 21:23:21

0

我們可以通過修改源/字節碼或通過使用子類或代理中嵌入的附加功能添加到Java類中的功能性和將調用委託給基礎對象。

0

AOP也可以使用CGLIB代理。這用於代替類而不是接口。

0

其他答案是好的,但這是我如何以非常簡單的方式來想到它。

  1. 註解的意思是「爲額外行爲添加隱藏代碼」。例如,框架(或任何知道註解的含義)在運行時添加字節碼,Spring,編譯時添加AspectJ。
  2. 它將代碼作爲代理與攔截器一起添加。 (一個包裝器,裝飾器,適配器是類似的,比「代理」可能更容易理解)。你編碼的類,它「包裝」。