簡體   English   中英

EJB 3.1 @LocalBean與沒有注釋

[英]EJB 3.1 @LocalBean vs no annotation

我理解本地視圖,遠程視圖和無界面視圖之間的區別。 我只是不明白“無視圖”(無注釋)和無界面視圖之間的區別。 還有為什么我要用@Local注釋我的界面? 如果我根本不對界面進行注釋會有什么不同呢?

規則是(來自記憶):

  1. Bean有一個@LocalBean注釋 - > bean有一個無界面視圖
  2. Bean有一個@Local注釋 - > bean有一個本地視圖
  3. Bean有一個@Remote注釋 - > bean有一個遠程視圖
  4. Bean沒有視圖注釋,但直接實現了一個具有@Local注釋的接口 - > bean具有本地視圖
  5. Bean沒有視圖注釋,但是直接實現了一個具有@Remote注釋的接口 - > bean具有遠程視圖
  6. Bean沒有視圖注釋,但是直接實現了一個沒有視圖注釋的接口 - > bean有一個本地視圖
  7. Bean沒有視圖注釋,並且沒有實現接口 - > 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:可以從遠程客戶端(在不同JVM上運行的客戶端,例如在用戶計算機上運行的Swing或JavaFX客戶端)訪問
  • 本地EJB:只能從運行在同一JVM上的其他“組件”訪問,例如Web前端,其他EJB
  • 無接口視圖:與Local相同,但未指定業務接口
  • 沒有注釋:一個簡單的POJO而不是一個EJB

本地/無接口視圖比遠程EJB更有效,因為可以傳遞對象引用。

我認為你/我們感到的困惑是歷史/向后兼容性的結果(可以這么說)。 我無法區分任何差異(除非規范要求實現在我們使用本地視圖時創建接口)

無接口視圖與EJB 3.0本地視圖具有相同的行為,例如,它支持諸如傳遞引用調用語義以及事務和安全傳播之類的功能。 但是,無接口視圖不需要單獨的接口,也就是說,bean類的所有公共方法都會自動向調用者公開。 默認情況下,任何具有空implements子句且未定義任何其他本地或遠程客戶端視圖的會話Bean都會公開無接口客戶端視圖。

在發布EJB 3.1之前的Oracle博客

如果您對更多技術細節感興趣,請告訴我們真正發生的事情......您無法直接訪問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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM