ejb java

尽管EJB继承有时使用Java继承,但事实并非总是如此。 就像您在我以前的文章中可以读到的那样 ,EJB不必实现任何接口即可公开业务接口。
反之亦然-仅仅是因为EJB实现了某个接口或扩展了其他EJB,并不意味着它公开了全部或任何视图。

假设我们要具有一些公开远程业务接口的基本EJB。 然后,我们想扩展此EJB并覆盖远程业务方法。
没什么好看的,对吧? 但是,让我们看一些例子。

远程业务接口:

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是我们的基础EJB。 它通过一种方法公开了一个远程业务接口。 现在,让我们转到EJB的子类:

案例1 – Java继承

@Stateless
public class SubclassEJB1 extends SuperclassEJB {// 'remoteA' is not EJB business method. EJB inheritance is strictly for implementation reusing.
}

SubclassEJB1是一个EJB –可以肯定。 但是它公开了哪些接口? 因为EJB组件必须显式定义其定义的业务接口,所以我们的EJB根本没有任何实际的业务方法! 它是新的,全新的无接口视图EJB。

这意味着,如果在您的代码中,您将执行以下操作:

  • @EJB SubclassEJB1 myEJB它将注入没有业务方法的无接口视图EJB。
  • @EJB(name='SubclassEJB1') RemoteA myEJB它将拒绝进行此注入,因为RemoteA不是我们EJB的业务接口。

有趣的是–如果不是使用@EJB进行容器注入,而是进行如下查找:

RemoteA subclassEJB1 = (RemoteA) initialContext.lookup('java:module/SubclassEJB1');
subclassEJB1.remoteA();

它不会引发任何异常并正确调用remoteA()方法。 为什么? 因为我们真正查找的是EJB的无接口视图。 然后,我们将其转换为RemoteA (从纯Java角度来看这是正确的),并调用了无接口视图方法。 我想您会同意这会造成很大的混乱–我们没有使用远程接口,而是最终正确调用了本地bean方法。

案例2 –接口实现的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.
}

现在看起来真的很奇怪。 我们的EJB扩展了其他EJB并实现了远程业务接口,对吗? 好吧,不完全是。 我们正在实现纯Java RemoteA接口。 该接口本身没有@Remote批注, SuperclassEJB也没有。 这意味着我们要将RemoteA公开为本地业务接口 。 这是我以前的文章中讨论的EJB的默认行为之一。

这意味着,如果在您的代码中,您将执行以下操作:

  • @EJB(name='SubclassEJB2') RemoteA myEJB将使用本地业务接口。 搞砸了,你不觉得吗?

案例3 –具有接口实现和视图声明的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扩展的正确示例。 我们已经正确地重用了Java继承的实现,实现了EJB远程业务接口,并使用@Remote公开了它。 甚至不需要implements子句– @Remote就足够了。 但是,@ @Remote部分至关重要。

这意味着,如果在您的代码中,您将执行以下操作:

  • @EJB(name='SubclassEJB3') RemoteA myEJB它将正确使用远程业务接口。

结论

如您所见,EJB继承有时可能不如预期的那么容易。 它要求您了解组件和视图定义的基础。 默认情况下,组件继承显然是为了代码重用,而不是组件扩展。 没有这些知识,您可能会遇到一些非常奇怪和令人沮丧的问题。 所有示例都在JBoss AS 7.1.1上进行了测试。

参考: EJB继承与Java继承不同 ,我们的JCG合作伙伴 Piotr Nowicki在Piotr Nowicki的首页博客中进行了介绍。

翻译自: https://www.javacodegeeks.com/2013/03/ejb-inheritance-is-different-from-java-inheritance.html

ejb java

ejb java_EJB继承与Java继承不同相关推荐

  1. EJB继承与Java继承不同

    尽管EJB继承有时使用Java继承,但它们并不总是相同的. 就像您在我以前的文章中可以读到的那样 ,EJB不必实现任何接口即可公开业务接口. 另一种方法也是正确的-仅仅是因为EJB实现了某个接口或扩展 ...

  2. java 继承 意义_Java中继承,类的高级概念的知识点

    1.继承含义 在面向对象编程中,可以通过扩展一个已有的类,并继承该类的属性和行为,来创建一个新的类,这种方式称为继承(inheritance). 2.继承的优点 A.代码的可重用性 B.子类可以扩展父 ...

  3. java继承详解加练习题

    继承 继承是面向对象三大特征之一,可以使得子类具有父类的属性和方法,还可以在子类中重新定义,以及追加属性和方法 继承的好处 提高了代码的复用性(多个类相同的成员可以收到同一个类中) 提高了代码的维护性 ...

  4. java继承对象转换_java 继承的基础(转)

    java 继承的基础(转)[@more@]继承是面向对象编程技术的一块基石,因为它允许创建分等级层次的类.运用继承,你能够创建一个通用类,它定义了一系列相关项目的一般特性.该类可以被更具体的类继承,每 ...

  5. java继承类大全_Java 面向对象继承部分(示例代码)

    被继承的类称为父类(超类),继承父类的类称为子类(派生类) 通过继承可以实现代码重用 子类拥有父类非 private 的属性.方法. 子类可以拥有自己的属性和方法,即子类可以对父类进行扩展. 子类可以 ...

  6. java继承的知识点_Java知识点梳理——继承

    1.定义:继承允许创建分等级层次的类,就是子类继承父类的特征行为,使得子类对象具有父类实例的方法, 使得子类具有父类相同的行为. 2.继承的特性: a.子类拥有父类非priavte的属性.方法: b. ...

  7. Java继承_Hachi君浅聊Java三大特性之 封装 继承 多态

    Hello,大家好~我是你们的Hachi君,一个来自某学院的资深java小白.最近利用暑假的时间,修得满腔java语言学习心得.今天小宇宙终于要爆发了,决定在知乎上来一场根本停不下来的Hachi君个人 ...

  8. Java继承Exception自定义异常类教程以及Javaweb中用Filter拦截并处理异常

    Java继承Exception自定义异常类教程以及Javaweb中用Filter拦截并处理异常 参考文章: (1)Java继承Exception自定义异常类教程以及Javaweb中用Filter拦截并 ...

  9. JAVA 继承基本类、抽象类、接口

    Java是一个面向对象的语言,java面向对象一般有三大特征:封装.继承.多态. 封装:就是把一些属性和方法封装到一个类里. 继承:就如子类继承父类的一些属性和方法. 多态:就如一个父类有多个不同特色 ...

最新文章

  1. 图灵LAMP类图书精彩荟萃
  2. 《黑客秘笈——渗透测试实用指南(第2版)》目录—导读
  3. Android init.rc文件解析过程详解(二)
  4. php 更新页面代码,php – 自动更新页面的代码大纲
  5. android硬编码封装mp4,【Android 音视频开发打怪升级:音视频硬解码篇】四、音视频解封和封装:生成一个MP4...
  6. python django部署docker_centos利用docker部署django项目
  7. php命令行(cli)下相对路径的问题
  8. 下拉框根据输入文字自动选择和输入提示
  9. tplink软件升级有用吗_TP-LINK路由器升级方法 | 吴文辉博客
  10. c#退出窗口跳转_详解C#切换窗口
  11. python安装包国内地址
  12. eclipse字体大小调整
  13. 区块链入门系列之P2P
  14. 基、维数和坐标 过渡矩阵与坐标变换
  15. 2159: H.ly的小迷弟
  16. 如何更新R以及RStudio
  17. 三人同行七十稀 - 中国剩余定理浅析
  18. 图形工作站计算机大全,总结:高品质专业图形工作站_戴尔 Precision T7500(Xeon E5606/2GB/500GB)_台式电脑评测-中关村在线...
  19. 解决:springmvc中接收date数据问题
  20. Vue+Openlayer实现点击地图添加图标要素信息,编辑点位信息

热门文章

  1. jar包天天见,可是你知道它的运行机制吗
  2. 常用公有云接入——谷歌
  3. 十面阿里,菜鸟,天猫,蚂蚁金服题目总汇
  4. 获取一个 Byte 的各个 Bit 值
  5. ConcurrentHashMap能完全替代HashTable吗?
  6. vue中如何在地图中标点…
  7. 16年国庆假期期间兼职所悟
  8. 对查询出来的结果进行筛选(having)
  9. Ubuntu C++ Thread Sleep
  10. JS (intermediate value).Format is not a function问题解决