[英]EJB 3.1 @LocalBean vs no annotation
我理解本地視圖,遠程視圖和無界面視圖之間的區別。 我只是不明白“無視圖”(無注釋)和無界面視圖之間的區別。 還有為什么我要用@Local
注釋我的界面? 如果我根本不對界面進行注釋會有什么不同呢?
規則是(來自記憶):
@LocalBean
注釋 - > bean有一個無界面視圖 @Local
注釋 - > bean有一個本地視圖 @Remote
注釋 - > bean有一個遠程視圖 因此,使用@LocalBean
並且根本不使用注釋都是獲得無界面視圖的兩種方式。 如果您只想要一個無界面視圖,那么最簡單的事情就是不要注釋。 如果您還沒有實現任何接口。
@LocalBean
存在的部分原因是為具有接口視圖的bean添加無接口視圖。 我想在規范作者的頭腦中最重要的場景就是你有一個像你這樣的bean:
@Stateless
public class UserPreferences {
public String getPreference(String preferenceName);
public Map<String, String> getPreferences();
}
您希望在本地公開這兩種方法的位置,但只能遠程顯示粗粒度的getPreferences()
。 您可以通過僅使用該方法聲明遠程接口,然后在bean類上@LocalBean
來實現。 沒有它,你必須編寫一個無意義的本地接口,只是為了在本地公開這兩種方法。
或者,從另一個角度來看,@ @LocalBean
存在,因為存在無界面視圖這樣的東西,並且no-annotation選項作為便捷的快捷方式存在。
本地/無接口視圖比遠程EJB更有效,因為可以傳遞對象引用。
我認為你/我們感到的困惑是歷史/向后兼容性的結果(可以這么說)。 我無法區分任何差異(除非規范要求實現在我們使用本地視圖時創建接口)
無接口視圖與EJB 3.0本地視圖具有相同的行為,例如,它支持諸如傳遞引用調用語義以及事務和安全傳播之類的功能。 但是,無接口視圖不需要單獨的接口,也就是說,bean類的所有公共方法都會自動向調用者公開。 默認情況下,任何具有空implements子句且未定義任何其他本地或遠程客戶端視圖的會話Bean都會公開無接口客戶端視圖。
如果您對更多技術細節感興趣,請告訴我們真正發生的事情......您無法直接訪問EJB對象,這意味着您沒有實際EJB對象的引用(地址)。 當您查找或注入EJB時,容器提供一個對象作為該EJB的客戶端(我們可以調用代理或Wrapper),並在該代理對象上調用您的業務方法。 (這就是為什么你不應該使用new關鍵字來創建EJB類的對象)
現在,對於每種類型的注釋,容器生成具有不同方法和功能的不同類型的代理。
@LocalBean
(或無注釋)您的代理對象具有:
setOptionalLocalIntfProxy()
getSerializableObjectFactory()
@Local
你的代理對象使用本地調用和com.sun.proxy
類型所以它有:
getSerializableObjectFactory()
isProxyClass()
getProxyClass()
getInvocationHandler()
newProxyInstance()
@Remote
You Wrapper對象使用遠程調用,它具有:
readResolve()
writeReplace()
getStub()
getBusinessInterfaceName()
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.