ejb java_EJB继承与Java继承不同
ejb java
盡管EJB繼承有時(shí)使用Java繼承,但事實(shí)并非總是如此。 就像您在我以前的文章中可以讀到的那樣 ,EJB不必實(shí)現(xiàn)任何接口即可公開(kāi)業(yè)務(wù)接口。
反之亦然-僅僅是因?yàn)镋JB實(shí)現(xiàn)了某個(gè)接口或擴(kuò)展了其他EJB,并不意味著它公開(kāi)了全部或任何視圖。
假設(shè)我們要具有一些公開(kāi)遠(yuǎn)程業(yè)務(wù)接口的基本EJB。 然后,我們想擴(kuò)展此EJB并覆蓋遠(yuǎn)程業(yè)務(wù)方法。
沒(méi)什么好看的,對(duì)吧? 但是,讓我們看一些例子。
遠(yuǎn)程業(yè)務(wù)接口:
public interface RemoteA {void remoteA(); }基本EJB:
@Stateless @Remote(RemoteA.class) public class SuperclassEJB implements RemoteA { public void remoteA() {// Some basic code that can be overriden.} }上面的SuperclassEJB是我們的基礎(chǔ)EJB。 它通過(guò)一種方法公開(kāi)了一個(gè)遠(yuǎn)程業(yè)務(wù)接口。 現(xiàn)在,讓我們轉(zhuǎn)到EJB的子類(lèi):
案例1 – Java繼承
@Stateless public class SubclassEJB1 extends SuperclassEJB {// 'remoteA' is not EJB business method. EJB inheritance is strictly for implementation reusing. }SubclassEJB1是一個(gè)EJB –可以肯定。 但是它公開(kāi)了哪些接口? 因?yàn)镋JB組件必須顯式定義其定義的業(yè)務(wù)接口,所以我們的EJB根本沒(méi)有任何實(shí)際的業(yè)務(wù)方法! 它是新的,全新的無(wú)接口視圖EJB。
這意味著,如果在您的代碼中,您將執(zhí)行以下操作:
- @EJB SubclassEJB1 myEJB它將注入沒(méi)有業(yè)務(wù)方法的無(wú)接口視圖EJB。
- @EJB(name='SubclassEJB1') RemoteA myEJB它將拒絕進(jìn)行此注入,因?yàn)镽emoteA不是我們EJB的業(yè)務(wù)接口。
有趣的是–如果不是使用@EJB進(jìn)行容器注入,而是進(jìn)行如下查找:
RemoteA subclassEJB1 = (RemoteA) initialContext.lookup('java:module/SubclassEJB1'); subclassEJB1.remoteA();它不會(huì)引發(fā)任何異常并正確調(diào)用remoteA()方法。 為什么? 因?yàn)槲覀冋嬲檎业氖荅JB的無(wú)接口視圖。 然后,我們將其轉(zhuǎn)換為RemoteA (從純Java角度來(lái)看這是正確的),并調(diào)用了無(wú)接口視圖方法。 我想您會(huì)同意這會(huì)造成很大的混亂–我們沒(méi)有使用遠(yuǎn)程接口,而是最終正確調(diào)用了本地bean方法。
案例2 –接口實(shí)現(xiàn)的Java繼承
@Stateless public class SubclassEJB2 extends SuperclassEJB implements RemoteA {// 'remoteA' is correctly exposed as EJB business method BUT as an implicit local i-face. // Method implementation is correctly inherited. }現(xiàn)在看起來(lái)真的很奇怪。 我們的EJB擴(kuò)展了其他EJB并實(shí)現(xiàn)了遠(yuǎn)程業(yè)務(wù)接口,對(duì)嗎? 好吧,不完全是。 我們正在實(shí)現(xiàn)純Java RemoteA接口。 該接口本身沒(méi)有@Remote批注, SuperclassEJB也沒(méi)有。 這意味著我們要將RemoteA公開(kāi)為本地業(yè)務(wù)接口 。 這是我以前的文章中討論的EJB的默認(rèn)行為之一。
這意味著,如果在您的代碼中,您將執(zhí)行以下操作:
- @EJB(name='SubclassEJB2') RemoteA myEJB將使用本地業(yè)務(wù)接口。 搞砸了,你不覺(jué)得嗎?
案例3 –具有接口實(shí)現(xiàn)和視圖聲明的Java繼承
@Stateless @Remote(RemoteA.class) public class SubclassEJB3 extends SuperclassEJB {// Method 'remoteA' is correctly exposed as EJB business method (thanks to @Remote on EJB). // Method implementation is correctly inherited. }這是EJB擴(kuò)展的正確示例。 我們已經(jīng)正確地重用了Java繼承的實(shí)現(xiàn),實(shí)現(xiàn)了EJB遠(yuǎn)程業(yè)務(wù)接口,并使用@Remote公開(kāi)了它。 甚至不需要implements子句– @Remote就足夠了。 但是,@ @Remote部分至關(guān)重要。
這意味著,如果在您的代碼中,您將執(zhí)行以下操作:
- @EJB(name='SubclassEJB3') RemoteA myEJB它將正確使用遠(yuǎn)程業(yè)務(wù)接口。
結(jié)論
如您所見(jiàn),EJB繼承有時(shí)可能不如預(yù)期的那么容易。 它要求您了解組件和視圖定義的基礎(chǔ)。 默認(rèn)情況下,組件繼承顯然是為了代碼重用,而不是組件擴(kuò)展。 沒(méi)有這些知識(shí),您可能會(huì)遇到一些非常奇怪和令人沮喪的問(wèn)題。 所有示例都在JBoss AS 7.1.1上進(jìn)行了測(cè)試。
參考: EJB繼承與Java繼承不同 ,我們的JCG合作伙伴 Piotr Nowicki在Piotr Nowicki的首頁(yè)博客中進(jìn)行了介紹。
翻譯自: https://www.javacodegeeks.com/2013/03/ejb-inheritance-is-different-from-java-inheritance.html
ejb java
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來(lái)咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)總結(jié)
以上是生活随笔為你收集整理的ejb java_EJB继承与Java继承不同的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 建设单位竣工验收后多少天备案(竣工验收后
- 下一篇: Java 9:流API的增强