定义EJB 3.1视图(本地,远程,无接口)
這篇文章將討論使用批注定義EJB視圖的可能方法(最后我將只提到使用EJB部署描述符)。我將重點介紹最新的EJB 3.1視圖,這些視圖將省略舊的本地,遠程和本地接口。 因此,我們可以選擇:
- 遠程業務界面視圖,
- 本地業務界面視圖,
- 無接口視圖
我不會討論這些視圖之間的功能差異,而將重點放在定義它們的可能方法上。
本地業務界面視圖
EJB正在實現此接口。
@Local public interface LocalA {void localA(); }@Stateless public class MeineEJB implements LocalA {@Overridepublic void localA() {} }優點:
- 您不必在EJB中指定接口類型。 您只需“用Java實現”它,其余的工作就由容器完成。
- 有關接口類型的信息牢固地附加在接口上,因此對于其他開發人員來說可能更容易理解。
- 由于有了Java implements子句,您可以使用javac或IDE來確保實現了所有EJB業務方法。
缺點:
- 現在,您的界面已與EJB技術緊密結合(導入javax.ejb.*包。)現在,您必須為API客戶端提供使用它所需的庫。
具有
EJB必須定義應該作為本地業務接口公開的接口(這是默認設置,請參見第3點。)
public interface LocalA {void localA(); }@Stateless @Local(LocalA.class) public class MeineEJB implements LocalA {@Overridepublic void localA() {} }優點:
- 有關接口類型的信息是松散耦合的。 您可以將API交付給客戶端,而不必關心EJB語義。 如果您將其隱藏在外立面上,則最終用戶(甚至是開發人員)甚至不必知道它在幕后使用EJB技術。
- 由于有了Java implements子句,您可以使用javac或IDE來確保實現了所有EJB業務方法。
缺點:
- 您的EJB現在必須使用@Local注釋定義其所有業務接口,因此這是您的附加工作。 不僅實現接口,還需要記住聲明EJB正在公開它。 (從javac角度來看)沒有什么可以阻止您將接口放入@Local批注中,而該接口實際上并未由EJB實現。
EJB正在實現它。
因為它是EJB唯一實現的接口,所以容器假定它必須是本地業務接口。 如果EJB實現多個接口,那么容器將無法識別哪個接口是您的本地業務接口。
public interface LocalA {void localA(); }@Stateless public class MeineEJB implements LocalA {@Overridepublic void localA() {} }優點:
- 具有上述第一種和第二種方法的所有優點。
缺點:
- 它假定EJB容器的默認行為以及開發人員對此的了解。 如果你使用一個以上的EJB圖。它不會起作用。 此外,它甚至不會 ,如果你的EJB正在實施一個以上的工作界面(不一定是EJB視圖)。
具有
在這種情況下,有趣的是,因為您沒有使用Java implements子句,所以實際上接口和EJB中的方法可以具有不同的簽名。 任何此類不匹配都會導致容器拋出異常。 另請注意,業務接口方法實現上缺少@Override批注。 這是因為我們沒有使用Java術語實現任何接口。
public interface LocalA {void localA(); }@Stateless @Local(LocalA.class) public class MeineEJB {public void localA() {} }優點:
- 有關接口類型的信息是松散耦合的。 您可以將API交付給客戶端,而不必關心EJB語義。 如果您將其隱藏在外立面上,則最終用戶(甚至是開發人員)甚至不必知道它在幕后使用EJB技術。
缺點:
- 具有上面討論的第二種方法的所有缺點。
- 您聲明為@Local接口的某些方法未實現的知識在很大程度上取決于使用的IDE。 Intellij IDEA會將其標記為錯誤,但AFAIR Eclipse則不會。
- 在我看來,這是最重要的缺點的組合,因此是定義EJB視圖的最差的方法。
遠程業務界面視圖
本地業務接口視圖的情況1、2和4對遠程業務接口視圖也有效。 點號 3是一個例外。 容器將永遠不會承擔有關遠程接口的任何事情。 如果EJB正在實現某個接口,并且未定義接口的類型,則它將始終假定它是本地的。
無接口視圖
我確定閱讀完上述部分后,您將能夠了解使用以下兩種方法定義無接口EJB視圖的利弊。 因此,我將不在這里討論它們。
EJB注釋為
該EJB可以但不一定要實現某些接口(普通Java或業務本地/遠程接口)。 @LocalBean僅對EJB類有效。
@Stateless @LocalBean public class MeineEJB {public void localMethod() {} }EJB沒有任何特殊的注釋。
該容器假定,如果將一個類注釋為EJB,但未實現任何接口,并且沒有任何與視圖相關的注釋–它將公開一個無接口視圖。
@Stateless public class MeineEJB {public void localMethod() {} }EJB部署描述符(ejb-jar.xml)
前面的所有部分都在考慮使用批注定義的EJB視圖。 您還可以使用部署描述符( ejb-jar.xml )定義EJB視圖。 例:
public interface LocalA {void localA(); }public interface RemoteA {void remoteA(); }@Stateless public class MeineEJB {public void localA() {}public void remoteA() {} }<ejb-jar xmlns='http://java.sun.com/xml/ns/javaee' xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' xsi:schemaLocation='http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/ejb-jar_3_1.xsd' version='3.1'><enterprise-beans><session><ejb-name>MeineEJB</ejb-name><business-local>com.piotrnowicki.remotelocalejb.LocalA</business-remote><business-remote>com.piotrnowicki.remotelocalejb.RemoteA</business-remote><local-bean/></session></enterprise-beans> </ejb-jar>上面的代碼和DD定義了一個EJB,它公開了三個視圖(本地業務,遠程業務和無接口)。 在語義上與以下內容相同:
@Stateless@Local(LocalA.class)@Remote(RemoteA.class)@LocalBeanpublic class MeineEJB {public void localA() {}public void remoteA() {}}參考:在Piotr Nowicki主頁博客上,我們的JCG合作伙伴 Piotr Nowicki 定義了EJB 3.1視圖(本地,遠程,無接口) 。
翻譯自: https://www.javacodegeeks.com/2013/03/defining-ejb-3-1-views-local-remote-no-interface.html
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的定义EJB 3.1视图(本地,远程,无接口)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: win7蓝屏修复工具(求电脑蓝屏修复工具
- 下一篇: 通过运行示例从WSO2 ESB开始