外贸企业网站红色风格,镇江市建设工程招投标网站,深圳十大建筑工程公司排行榜,论文中网站数据如何做脚注ejb java尽管EJB继承有时使用Java继承#xff0c;但事实并非总是如此。 就像您在我以前的文章中可以读到的那样 #xff0c;EJB不必实现任何接口即可公开业务接口。 反之亦然-仅仅是因为EJB实现了某个接口或扩展了其他EJB#xff0c;并不意味着它公开了全部或任何视图。 假… 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(nameSubclassEJB1) 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(nameSubclassEJB2) 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(nameSubclassEJB3) 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.htmlejb java