2011-03-03 96 views
2

我在任何地方都會一直在閱讀,當您要求在bean中注入依賴關係時,您會爲該資源的實例注入代理。我相信我知道代理是什麼,它是一個知道如何將消息轉發到另一個實例的實例。還有人說,這種模式允許容器爲這個託管的bean提供服務。JAVA EE代理模式

我不太明白這一點。爲什麼代理必需?這是如何實施的?是否有每個bean的代理對象?或者我有很多代理轉發到一個實例?或者可能都不是?

此外,從GoF的書籍設計模式中,我已經讀到,你必須提供一個充當佔位符的代理類。但是我從來沒有在Java EE中這樣做,應用程序服務器在運行時創建代理類嗎?

回答

4

代理模式背後的基本假設是,你不應該從「用戶」的角度來關心它。代理僞裝成聲明的類型,並且應該以相同的方式運行。附加值來自代理在轉發或返回到目標實例的調用之前或之後執行的操作。這是如何交易和安全在容器中執行。

至於添加的問題:是的,應用程序服務器在必要時創建這些代理類。

+1

Martin。我在想你的答案和在運行時創建代理類的可能實現。我想出了這個如何工作的想法。假設我有一個測試課。應用程序服務器所做的是使用Java反射api,它擴展了測試類,並遍歷每個操作覆蓋它們,例如在調用超類方法之前和之後添加begin()和end()事務調用,然後返回一個對這個孩子班,這是正確的嗎? – arg20 2011-03-03 19:16:13

+1

是的,這基本上是發生了什麼事情。當然,有不同的技術方法來實現代理。如果你想自己使用這種技術,一個非常簡單但功能強大的方法是使用標準庫中的DynamicProxy類。其他方法是字節碼增強和麪向方面的編程(在大多數情況下依靠字節碼增強)。 – 2011-03-03 21:06:30