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. 树莓派练习程序(蜂鸣器)
  2. vue全家桶 ---axios的使用和二次封装
  3. string.intern_使用String.intern()减少内存使用
  4. 服务器支持磁盘阵列,服务器磁盘阵列、RAID级别的阐述
  5. 三星Galaxy Z Fold 3通过3C认证:搭载屏下摄像头技术
  6. python subplots_python fig,ax = plt.subplots()
  7. python 串口助手 简书_【Python】PyQt5之串口助手【2】
  8. gdb调试时no debugging symbols found
  9. 硬件设计4---什么是电感磁珠?
  10. MongoDB day02
  11. python从右侧向左第三个字符_字符串是一个字符序列,例如,字符串s,从右侧向左第3个字符用什么索引?_学小易找答案...
  12. linux inactive,linux – systemctl status显示inactive dead
  13. js原生、jquery单选框radio总结(获取值、设置默认选中值、样式)
  14. 一些前端大牛都在学习的github库
  15. 温度补偿计算公式_热力管道补偿器补偿量计算公式
  16. 计算圆周率python实现
  17. 机器人主板需求配置参数有哪些呢?
  18. Java实现 LeetCode 416 分割等和子集
  19. 关于flex布局和九宫格布局的实现
  20. html创建目录6,VB6选择文件夹的时候有新建文件夹按钮

热门文章

  1. 漫画:什么是时间复杂度
  2. ItemCF,基于物品的协同过滤算法
  3. 面象对象设计6大原则之二:开放封闭原则
  4. Java趣味分享:try/finally
  5. 1分钟了解协同过滤,pm都懂了
  6. 求 1-100 之间不能被 3 整除的数之和
  7. 第六章连接和分组查询
  8. java实现遍历树形菜单方法——struts.xml实现
  9. 约瑟夫(环)问题(Josephu)(单向环形链表)
  10. mybatisplus 强制制空 空覆盖原来的字符串