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继承,来自Piotr Nowicki主页博客上的JCG合作伙伴 Piotr Nowicki。
翻译自: https://www.javacodegeeks.com/2013/03/ejb-inheritance-is-different-from-java-inheritance.html
EJB继承与Java继承不同相关推荐
- ejb java_EJB继承与Java继承不同
ejb java 尽管EJB继承有时使用Java继承,但事实并非总是如此. 就像您在我以前的文章中可以读到的那样 ,EJB不必实现任何接口即可公开业务接口. 反之亦然-仅仅是因为EJB实现了某个接口或 ...
- java 继承 意义_Java中继承,类的高级概念的知识点
1.继承含义 在面向对象编程中,可以通过扩展一个已有的类,并继承该类的属性和行为,来创建一个新的类,这种方式称为继承(inheritance). 2.继承的优点 A.代码的可重用性 B.子类可以扩展父 ...
- java继承详解加练习题
继承 继承是面向对象三大特征之一,可以使得子类具有父类的属性和方法,还可以在子类中重新定义,以及追加属性和方法 继承的好处 提高了代码的复用性(多个类相同的成员可以收到同一个类中) 提高了代码的维护性 ...
- java继承对象转换_java 继承的基础(转)
java 继承的基础(转)[@more@]继承是面向对象编程技术的一块基石,因为它允许创建分等级层次的类.运用继承,你能够创建一个通用类,它定义了一系列相关项目的一般特性.该类可以被更具体的类继承,每 ...
- java继承类大全_Java 面向对象继承部分(示例代码)
被继承的类称为父类(超类),继承父类的类称为子类(派生类) 通过继承可以实现代码重用 子类拥有父类非 private 的属性.方法. 子类可以拥有自己的属性和方法,即子类可以对父类进行扩展. 子类可以 ...
- java继承的知识点_Java知识点梳理——继承
1.定义:继承允许创建分等级层次的类,就是子类继承父类的特征行为,使得子类对象具有父类实例的方法, 使得子类具有父类相同的行为. 2.继承的特性: a.子类拥有父类非priavte的属性.方法: b. ...
- Java继承_Hachi君浅聊Java三大特性之 封装 继承 多态
Hello,大家好~我是你们的Hachi君,一个来自某学院的资深java小白.最近利用暑假的时间,修得满腔java语言学习心得.今天小宇宙终于要爆发了,决定在知乎上来一场根本停不下来的Hachi君个人 ...
- Java继承Exception自定义异常类教程以及Javaweb中用Filter拦截并处理异常
Java继承Exception自定义异常类教程以及Javaweb中用Filter拦截并处理异常 参考文章: (1)Java继承Exception自定义异常类教程以及Javaweb中用Filter拦截并 ...
- JAVA 继承基本类、抽象类、接口
Java是一个面向对象的语言,java面向对象一般有三大特征:封装.继承.多态. 封装:就是把一些属性和方法封装到一个类里. 继承:就如子类继承父类的一些属性和方法. 多态:就如一个父类有多个不同特色 ...
最新文章
- 求s = k ! + n ! / m !的值
- 订阅者java_RxJava:“java.lang.IllegalStateException:只允许一个订阅者!”
- “汇新杯”新兴科技+互联网创新大赛青年创客专项赛即将截止报名
- iOS 选择的照片或者拍照的图片上添加日期水印
- MATLAB实战系列(十七)-大学生数学建模赛题解析-水塔中水流量估计(附MATLAB源码)
- JDATA绝对语义识别挑战大赛-季军方案
- C#操作静态路由表(增、删、改、查、遍历)
- 菜鸟学习笔记:Java提升篇8(线程2——线程的基本信息、线程安全、死锁、生产者消费者模式、任务调度)
- bzoj 1698: [Usaco2007 Feb]Lilypad Pond 荷叶池塘(BFS)
- oracle中between and闭合性
- iOS底层探索之类的结构(下):objc_setProperty
- 社会管理不妨向大数据要效率
- 全球餐厅库存管理软件行业调研及趋势分析报告
- html中output标签详细介绍
- Mac 通过adb拉取dropbox中的内容
- 运用VBA将Excel中【以文本存储的数字】转换为【数字】格式(去除绿色小三角)
- 外卖优惠券公众号怎么做回复小程序链接
- 自学python能不能找到工作,学会了python好找工作吗
- 对称加密/非对称加密
- 多个git账号的登录与切换
热门文章
- flask执行python脚本_如何在flask后端运行python脚本?
- POJ1321(DFS)
- javafx按钮设计风格_Java,JavaFX的流畅设计风格按钮,切换按钮和工具提示
- okta-spring_通过Okta的单点登录保护Spring Boot Web App的安全
- java开发常见异常_最常见的Java异常及其对Java开发人员的评价
- logback redis_使用Spring Boot和Logback登录到Redis
- intellij 快捷键_IntelliJ中的键盘快捷键
- Java:从Java 8开始受益于内联类属性
- 自动化测试在CI CD管道中的作用
- guava缓存数据到本地_扩展Guava缓存以溢出到磁盘