ejb java_EJB继承与Java继承不同

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/348823.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

UART原理

UART原理 通用异步收发传输器(Universal Asynchronous Receiver / Transmitter),通常称作UART,是一种异步收发传输器,是电脑硬件的一部分。将资料由串行通信与并行通信间作传输转换,作为并行输入成为串行输出的芯片&am…

Java 9:流API的增强

Java 9向Stream接口添加了4种新方法: 1. dropWhile dropWhile方法类似于skip方法,但使用Predicate而不是固定的整数值。 当Predicate为true时,它将从输入流中删除元素。 然后将所有剩余的元素传递到输出流。 例如: IntStream.ra…

AttributeError: module 'tensorflow' has no attribute 'placeholder'等一系列tensorflow版本导致的问题

新人tensorflow2.1版本导致程序我无法运行最简单的办法 法1 tensorflow.compat.v1 import tensorflow.compat..v1 as tf tf.disable_v2_behavior() 亲测不好用 法2 卸载2.1,安装老版本 在Terminal界面输入 pip uninstall tensorflow接着输入Y确定卸载。 安装t…

正则表达式 guava_带有正则表达式模式的Google Guava Cache

正则表达式 guava最近我看到了一个关于Google Guava的不错的介绍 ,我们在我们的项目中得出结论,使用它的缓存功能真的很有趣。 让我们看一下regexp Pattern类及其编译功能 。 在代码中我们经常可以看到,每次使用正则表达式时,程序…

word中一直提示校对错误,如何关闭当前文档校对功能

关闭当前文档校对功能 文件>选项>校对>例外项,选中两个,如图 对比效果:

微信小程序开发学习记录01

微信小程序结构 根目录 app.js:小程序逻辑文件(必须) app.json:小程序配置文件(必须) app.wxss:全局公共样式文件(非必须) pages 组成小程序的多个页面&#xff0c…

Java Optionals获得更具表现力的代码

我们中任何人使用允许空引用的语言进行编程时,都会遇到尝试取消引用一个引用时发生的情况。 无论是导致segfault还是NullPointerException,它始终是一个错误。 托尼霍尔将其描述为他十亿美元的错误 。 当函数向客户端的开发人员未预料到的客户端返回空引…

Atom使用方法(快捷键,插件,汉化)

Atom文本编辑软件 使用方法 常用快捷键 Ctrl Shift M :打开markdown调试窗口 Crtl m:相应括号之间,html tag之间等跳转 Crtl Alt B: 格式化代码(需要安装atom-beautify) Crtl :调起CLI…

将测微仪与Spring Boot 2一起使用

这是快速入门,介绍了如何使用出色的Micrometer库来检测基于Spring Boot 2的应用程序并在Prometheus中记录指标 介绍 Micrometer在各种监视工具提供的客户端库上提供了基于Java的外观。 以Prometheus为例,如果我要将Java应用程序与Prometheus集成&#…

学习笔记整理

毕设学习笔记整理说明Python和Pycharm使用方面因网络问题导致pycharm安装第三方库失败的解决办法将python程序打包为exe程序pyinstallerpy2exepycharm取消缩进Python函数方面python中 if __name__ __main__: 的作用与意义cv2.resize的用法只读取图像的单通道数值最值索引图像增…

与Maven的集成测试

用Maven实施单元测试是很普通的事情,我们大多数人都熟悉项目结构以及单元测试所在的位置。 但是,集成测试是一种不同的情况,大多数情况下它们具有完全不同的要求。 例如,可以让您的单元测试在内存数据库中的h2上运行,…

通信原理-通信系统的组成

第一章 通信系统的组成 1、通信系统一般模型 发送设备:将信源产生的原始电信号变换成适合在信道中传输的形式。变换方式有调制、放大、滤波、编码、多路复用等。 信道:传输信号的通道.即传输媒质。在给子信号通道的同时,信道也会对信号产生损…

使用log4j2免费分配日志记录

介绍 最近,我正在为一个客户端工作,试图为大型精心制作的Java系统消除一些GC暂停。 经过分析后,我意识到大部分垃圾都是通过日志记录产生的! 是否有一种简单的方法来删除所有分配? 原来有:) 我应该使用哪个框架进行GC…

Verilog中fork...join 的用法

特点 中间的语句并行执行;(延时不累加) 不能用于综合; 代码 module signal_gen; reg wave; parameter cycle 5; initial beginforkwave 0;#(cycle) wave 1;#(2*cycle) wave 0;#(3*cycle) wave 1;#(4*cycle…

使用JWT的Cloud Native应用程序

本机云应用程序是为云计算环境开发的应用程序。 对于“ 什么是云原生应用程序 ”这个问题没有具体答案,但是必须满足不同的概念。 在我看来,最重要的功能之一就是能够快速缩放 。 这意味着我们的应用程序在每台服务器上都无法具有任何状态,…

stackexchange_通过Spring Social发推StackExchange问​​题

stackexchange1.简介 这是有关小型辅助项目的第三篇也是最后一篇文章-该机器人自动在专用帐户上发布来自各个Q&A StackExchange网站上的问题的推文(文章末尾的完整列表)。 第一篇文章讨论了为StackExchange REST API构建简单的客户端 。 在第…

使用JCache缓存方法结果

在JCache中,有一个方便的功能可以透明地缓存方法的结果。 您可以使用CacheResult注释托管bean的方法,并且将再次返回第一次调用的结果,而无需再次调用实际方法。 import javax.cache.annotation.CacheResult; // ...public class Calculator…

开源项目GoodView点赞效果

点赞1效果: GoodView方法: 使用GoodView的Demo: public class MainActivity extends Activity { Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main)final Good…

开源RefreshListView下拉刷新效果

1、AnimationDrawable java.lang.Object ↳android.graphics.drawable.Drawable ↳android.graphics.drawable.DrawableContainer ↳android.graphics.drawable.AnimationDrawable 文档概述:An object used to create frame-by-frame animations, defined …

Neo4j:遍历查询超时

在过去的几周中,我一直在花一些业余时间来创建一个应用程序,该应用程序从Open Roads数据生成运行路线-当然已转换并导入到Neo4j中! 我创建了一个用户定义的过程,该过程结合了几个最短路径查询,但是如果它们花费的时间…