尽管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继承,来自Piotr Nowicki主页博客上的JCG合作伙伴 Piotr Nowicki。

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

EJB继承与Java继承不同相关推荐

  1. ejb java_EJB继承与Java继承不同

    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. 求s = k ! + n ! / m !的值
  2. 订阅者java_RxJava:“java.lang.IllegalStateException:只允许一个订阅者!”
  3. “汇新杯”新兴科技+互联网创新大赛青年创客专项赛即将截止报名
  4. iOS 选择的照片或者拍照的图片上添加日期水印
  5. MATLAB实战系列(十七)-大学生数学建模赛题解析-水塔中水流量估计(附MATLAB源码)
  6. JDATA绝对语义识别挑战大赛-季军方案
  7. C#操作静态路由表(增、删、改、查、遍历)
  8. 菜鸟学习笔记:Java提升篇8(线程2——线程的基本信息、线程安全、死锁、生产者消费者模式、任务调度)
  9. bzoj 1698: [Usaco2007 Feb]Lilypad Pond 荷叶池塘(BFS)
  10. oracle中between and闭合性
  11. iOS底层探索之类的结构(下):objc_setProperty
  12. 社会管理不妨向大数据要效率
  13. 全球餐厅库存管理软件行业调研及趋势分析报告
  14. html中output标签详细介绍
  15. Mac 通过adb拉取dropbox中的内容
  16. 运用VBA将Excel中【以文本存储的数字】转换为【数字】格式(去除绿色小三角)
  17. 外卖优惠券公众号怎么做回复小程序链接
  18. 自学python能不能找到工作,学会了python好找工作吗
  19. 对称加密/非对称加密
  20. 多个git账号的登录与切换

热门文章

  1. flask执行python脚本_如何在flask后端运行python脚本?
  2. POJ1321(DFS)
  3. javafx按钮设计风格_Java,JavaFX的流畅设计风格按钮,切换按钮和工具提示
  4. okta-spring_通过Okta的单点登录保护Spring Boot Web App的安全
  5. java开发常见异常_最常见的Java异常及其对Java开发人员的评价
  6. logback redis_使用Spring Boot和Logback登录到Redis
  7. intellij 快捷键_IntelliJ中的键盘快捷键
  8. Java:从Java 8开始受益于内联类属性
  9. 自动化测试在CI CD管道中的作用
  10. guava缓存数据到本地_扩展Guava缓存以溢出到磁盘