了解 EJB 架构和实现

问题描述

我是 Jakarta EE 世界的初学者。 我正在大学学习雅加达 EE 模块,我正在努力寻找能够正确回答我的问题的信息。 我觉得这是其中一件如此简单、直接且期望被理解的事情,但我只是不明白。

我的导师不是很有帮助,告诉我不要担心其他任何事情,只是接受“它只是封装的业务逻辑”这毫无意义和无用,因为如果这就是为什么我不能只创建我的自己的班级。

现在我已经阅读了这篇文章 https://docs.oracle.com/cd/E16439_01/doc.1013/e13981/undejbs002.htm 并获得了基本概述。

我知道以下几点:

  1. EJB 在 EJB 容器内运行,而 EJB 容器在应用服务器内运行,
  2. 两种类型的 EJB:会话 Bean、消息驱动 Bean
  3. 三种类型的会话 Bean:无状态、有状态、单例
  4. @Stateless 在会话/方法调用之间不保持“对话状态”?而有状态 bean 呢?
  5. 容器有一个池,这些 EJB(Java 类)基本上被实例化并在@stateless 的情况下随机分配给客户端
  6. @Stateful bean 被保存在一个池中,并且同一个客户端被分配了同一个 bean?

请随时更正以上任何内容。 根据我目前所知道的,整体架构似乎仍然让我感到困惑,

我有以下 6 个问题(全部都有链接)如果我没有正确组织它们,我很抱歉,我会尝试编辑/改进答案:

  1. 非 Java(通用客户端)如何访问 EJB?这甚至可能吗?

据我所知,大多数客户是以下其中一种: a) 笔记本电脑/平板电脑/手机中的网络浏览器, b) 原生移动应用程序, c) 某些物联网设备或其他类型的设备(例如送货司机将某些东西保存到独特的手机上)等...

现在!假设上面提到的客户端(主要是 a 和 b),因为它们是访问相同“业务逻辑”的最常见需求, 他们会怎么做呢? 我假设本机移动应用程序也使用 HTTP/s 协议? 这是否意味着它只能通过 Servlet?哪个有点像 MVC 控制器?

根据官方 Java EE 文档中的图表,Web 浏览器似乎无法直接访问 EJB:

enter image description here

  1. 如果 (1) 的答案是否定的,Web/移动应用程序等客户端无法直接访问 EJB,那么@Stateful 会话 bean 是否有任何用处? 比如说在一个 web 应用程序中,HTTP 协议是无状态的,可以在 session/cookie 的帮助下维护状态, 这意味着状态由 Web 容器维护?拥有有状态会话 bean 有什么意义?

我已经阅读了有关堆栈溢出的其他问题,这些问题表明在 Servlet 中使用 @stateful 会话 bean 不是一个好主意。

我得到了整个购物车的例子,但这并没有解释如何维护状态,如果我通过浏览器访问我的购物车,cookies 将负责状态,对吗? EJB 是否可以访问浏览器 cookie?

  1. 如果 EJB 只能由 Java 客户端直接访问:

据我所知,Java 客户端示例: 小服务程序, 另一个运行本地或远程的 EJB, 另一个 Java 类?, 独立 Java 应用?

我假设这些客户端会通过 RMI/JNDI/CDI/Dependency Injection(在 servlet 的情况下)访问 EJB? 可以说 EJB 类似于 Java EE 世界中的 SOAP Web 服务吗?

  1. 基于以上所有内容,EJB 是否还有很多用例? 特别是由于大多数应用程序是通过网络或移动使用 HTTP/Rest 端点,许多应用程序使用 JWT 来管理状态客户端,除了 Android 应用程序等,我看不到许多独立 Java 应用程序的示例。

  2. 使用 MVC/Spring/Spring Boot 似乎有更易理解的架构并创建 REST/SOAP Web 服务会更好吗

  3. RMI 是否也使用 HTTP? EJB 理解 HTTP 吗?

我认为这些问题中的大多数都围绕着同一点。我无法得到明确的答案,我认为这应该很明显,但我只是不明白。 任何建议将不胜感激

解决方法

Jakarta EE 是一组共存的 API,EJB 只是其中之一。

我们可以说 EJB 是一个带有切面的普通 Java 对象。例如:事务管理、安全、监控、池化等。

@Stateless 仅在方法调用期间维护状态。 @Stateful 确实在会话期间的方法调用之间保持状态。 @Singelton 确实在正在运行的应用程序的整个生命周期中维护状态。

@Stateful bean 被保存在一个池中,并且同一个客户端被分配了 同一个豆子?

不,每个客户端都会创建一个 bean 的新实例,并最终将其删除。如果缓存填满,实例可能会被钝化到磁盘。

“非 Java(通用客户端)如何访问 EJB?这可能吗?”

Java EE web services

通过 Rest 将 JAX-RS 与 EJB 技术集成

@Stateless
@Path("/employee/{id}")
public class Employee {
    public Employee(@PathParam("id") String id) {...}
}

HTTP/s 协议?这是否意味着它只能通过 小服务程序?哪个有点像 MVC 控制器?

JAX-RS 和 Spring MVC 使用 Servlet。

以 Web 应用程序为例,您可以使用 JSF 或 JSP 与 CDI 和 EJB。

如果 (1) 的答案是否定的,则 Web/移动应用程序等客户端不能 直接访问 EJB,@Stateful 会话 bean 有什么用处吗? 比如说在一个 Web 应用程序中,HTTP 协议是无状态的,状态可以是 在 session/cookie 的帮助下维护,这意味着状态 是由 Web Container 维护的?有什么意义 有状态会话 bean?

举个例子:您的购物车和产品在通话之间会去哪里? 我们需要将状态保存在某处,您可以使用 @SessionScoped bean 或 @Stateful bean 或数据库等。任何方式都由您选择

“我已经阅读了有关堆栈溢出的其他问题,这表明它不是 使用 Servlet 使用 @Stateful 会话 bean 的好主意。"

我不知道它们是什么意思,但是如果您想在购物车中保存您的状态,例如 @Stateful beans 是要走的路。作为替代方案,您可以将 CDI bean 与 @SessionScoped 一起使用,而不是 EJB @Stateful

我得到了整个购物车的例子,但这并没有解释如何 状态保持,如果我通过一个访问我的购物车 浏览器,cookies 会负责状态吧?是否 EJB 可以访问浏览器 cookie?

Jakarta EE 运行时负责这些细节,但如果需要,您可以访问 SecurityContext、SessionContext。

在 EJB 上,您可以使用 @Resource SessionContext ctx; 进行注释以获取调用者的上下文。

据我所知,Java 客户端示例:Servlet,正在运行的另一个 EJB 本地或远程,另一个 Java 类?,独立的 Java 应用程序?

我假设这些客户端将通过 RMI/JNDI/CDI/Dependency 访问 EJB 注入(在servlet的情况下)?

不仅仅是 Servlet API,但正如我所说,大多数 Java Web 技术都建立在 Servlet 技术之上或与 Servlet 技术集成。

可以说 EJB 类似于 Java EE 世界中的 SOAP Web 服务吗?

不,对于 SOAP Web 服务,我们使用 JAX-WS,是的,您可以将 JAX-WS 与 EJB 集成

@Stateless
@WebService
public class HelloService {

    public String sayHello(String name) {
        return("Hello "+name +" from first EJB3.0 Web Service");
    }
}

基于以上所有内容,EJB 是否还有很多用例? 特别是因为大多数应用程序都是通过网络或移动使用 HTTP/Rest 端点,许多使用 JWT 来管理状态客户端,以及 我看不到许多独立 Java 应用程序的示例,除了一个 安卓应用等。

EJB 只是 Jakarta EE 的一部分或工具,您必须针对案例使用正确的工具。

使用似乎有更多功能的MVC/Spring/Spring Boot更好吗? 可理解的架构并创建 REST/SOAP Web 服务

不,你在混合苹果和橙子。 EJB 只是一个 API,而 Spring 是一个完整的平台。

“虽然有些人认为 Java EE 和 Spring 是在竞争,但实际上 Spring 是对 Java EE 的补充。”

术语“春天”在不同的上下文中意味着不同的东西。它可以用来指代 Spring Framework 项目本身,这就是一切的开始。

Spring Boot 是 Spring Framework 的扩展。 Spring Boot 嵌入了 Apache Tomcat 作为运行时。 Apache Tomcat 实现了四个 Jakarta EE 规范 — Jakarta Servlet、Jakarta Standard Tag Library、Jakarta WebSocket 和 Jakarta Authentication。 (Undertow、Jetty 几乎相同)。

RMI 是否也在使用 HTTP?

RMI 协议不再相关,使用 EJB 也不需要 RMI。

EJB 理解 HTTP 吗?

正如我所说,您可以将 JAX-RS 与 EJB 集成。

如果你有兴趣,我推荐一些在线研讨会

Java EE Bootstrap

Effective Java EE

Java EE Testing

Java EE microservices

Apps With Microprofile