EJB2 和 EJB3 可以在一个应用程序中共存吗?

2023-12-27

有谁知道是否可以在 Java EE 应用程序中用 EJB3 bean 迭代替换 EJB2.1 bean?

也就是说:一次从代码中删除一个 2.1 bean,并添加实现相同行为的相应 EJB3 bean,而无需触及代码的其余部分(+能够通过新 EJB3 中的注释注入旧版 EJB)。

我不是 EJB 规范方面的专家(并且我只具有 EJB3 的经验),但对我来说,EJB 是一个简单的组件,具有由应用程序服务器管理的给定业务接口。 AFAIK EJB3 极大地简化了如何编写组件(没有人工接口),并且大多数时候由于注释可以省略 xml 描述符,但基础知识是相同的。所以这似乎是合理的,它可以发挥作用。

EJB2.1和EJB3之间是否有不兼容的地方?

问题的核心是迁移 EJB2.1 --> EJB3 是否需要停止世界/完全重写操作,或者可以在向遗留应用程序添加新功能和修复错误的同时执行此操作(因此将会出现混合)在运行的应用程序中使用 EJB2.1 和 EJB3 一段时间)。

EDIT:

  • 我只对会话 bean 感兴趣。
  • 我很好奇查找是否(以及如何)有效。 AFAIK EJB2.1 需要称为 home 接口的东西来获取对不同 EJB 的引用,但 EJB3 没有 home 接口...

EJB 2.1 和 EJB 3 bean 共存

EJB2 和 EJB3 bean 可以共存于一个企业应用程序 (.ear) 中,但不能驻留在同一个 ejb jar 文件(模块)中。因此,EJB3 bean 必须驻留在与 EJB2 bean 不同的 jar 中。

从 EJB 2.1 调用 EJB 3

EJB3 bean 没有 home 接口,而 EJB 2.1 需要它。为了使EJB3 bean能够从EJB2访问,您需要向EJB3 bean添加本地home接口(如果需要远程调用,则添加远程home接口)。

创建主页界面:

public interface SystemTimeLocalHome extends EJBLocalHome {  
  SystemTimeLocal create() throws CreateException;  
}  

将 home 接口添加到 EJB3 bean:

@Stateless  
@Local(TimeServiceLocal.class)  
@LocalHome(TimeServiceLocalHome.class)  
public class TimeServiceBean implements TimeServiceLocal {  
   public long getCurrentTimeMillis() {  
      return System.currentTimeMillis();  
   }  
}  

在 EJB2 bean 内部,调用 EJB3 bean 的代码遵循 EJB2 规范:查找引用,调用 home 接口来创建本地接口,然后调用本地接口上的方法。

Context ctx = new InitialContext();  
TimeServiceLocalHome home = (TimeServiceLocalHome)ctx.lookup("java:comp/env/" + ejbRefName);  
TimeServiceLocal timeService = home.create();  
timeService.getCurrentTimeMillis();  

从 EJB 3 调用 EJB 2.1

依赖注入用于将 EJB 2.1 组件引用注入到 EJB3 bean 中。与注入 EJB3 bean 的不同之处在于它是注入 EJB2 的 home 接口。称呼create()注入的 EJB home 接口上的方法来实例化 bean 类。

@EJB BankingServiceHome bsHome;

BankingService bs = bsHome.create();
bs.getBalance(...);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

EJB2 和 EJB3 可以在一个应用程序中共存吗? 的相关文章

随机推荐