EJB - 面试问题



尊敬的读者,这些EJB 3.0 面试问题是专门为了让您熟悉在EJB 3.0主题的面试中可能遇到的问题类型而设计的。根据我的经验,优秀的 interviewers 很少会在面试前计划要问哪些具体问题,通常问题会从主题的一些基本概念开始,然后根据进一步的讨论以及您的回答继续下去。

EJB 代表 Enterprise Java Beans。EJB 是 J2EE 平台的重要组成部分。J2EE 平台具有基于组件的架构,为企业级应用程序提供多层、分布式和高事务性功能。

EJB 提供了一种架构来开发和部署基于组件的企业应用程序,同时考虑了健壮性、高可扩展性和高性能。EJB 应用程序可以部署在任何符合 J2EE 1.3 标准规范的应用程序服务器上。

以下是 EJB 的主要优势。

  • 简化大型企业级应用程序的开发。

  • 应用程序服务器/EJB 容器提供大多数系统级服务,例如事务处理、日志记录、负载平衡、持久化机制、异常处理等等。开发人员只需专注于应用程序的业务逻辑。

  • EJB 容器管理 ejb 实例的生命周期,因此开发人员无需担心何时创建/删除 ejb 对象。

Session Bean 存储特定用户的会话数据。它可以是有状态的或无状态的。与实体 Bean 相比,它占用较少的资源。Session Bean 在用户会话终止后立即被销毁。

有状态 Session Bean 是一种企业 Bean,它保留与客户端的会话状态。顾名思义,有状态 Session Bean 会在其实例变量中保存关联的客户端状态。EJB 容器为每个客户端请求创建一个单独的有状态 Session Bean 来处理。一旦请求范围结束,有状态 Session Bean 就会被销毁。

无状态 Session Bean 是一种企业 Bean,通常用于执行独立操作。顾名思义,无状态 Session Bean 没有与任何客户端状态关联,但它可以保留其实例状态。EJB 容器通常创建少量无状态 Bean 对象的池,并使用这些对象来处理客户端请求。由于池的存在,实例变量的值在查找/方法调用之间并不保证相同。

实体 Bean 表示持久性数据存储。用户数据可以通过实体 Bean 保存到数据库,然后可以从实体 Bean 中检索数据库中的数据。

消息驱动 Bean 是一种企业 Bean,当它从队列或主题接收消息时,由 EJB 容器调用。消息驱动 Bean 是一个无状态 Bean,用于异步执行任务。

如果 ejb 客户端与要部署 ejb Session Bean 的环境相同,则我们使用本地 Session Bean。

如果 ejb 客户端与要部署 ejb Session Bean 的环境不同,则我们使用远程 Session Bean。

以下是有状态 Session Bean 和无状态 Session Bean 之间的区别

  • EJB 容器为每个客户端请求创建一个单独的有状态 Session Bean 来处理。而 EJB 容器通常创建少量无状态 Bean 对象的池,并使用这些对象来处理客户端请求。

  • 一旦请求范围结束,有状态 Session Bean 就会被销毁,但无状态 Bean 保持活动状态。

  • 有状态 Session Bean 是一种企业 Bean,它保留与客户端的会话状态。顾名思义,有状态 Session Bean 会在其实例变量中保存关联的客户端状态。而由于无状态 Session Bean 的池的存在,在无状态 Session Bean 中,实例变量的值在查找/方法调用之间并不保证相同。

以下是 EJB 中持久化 API 的关键组件

  • 实体 - 表示数据存储记录的持久对象。最好是可序列化的。

  • 实体管理器 - 持久化接口,用于对持久对象(实体)执行添加/删除/更新/查找等数据操作。它还有助于使用 Query 接口执行查询。

  • 持久化单元 (persistence.xml) - 持久化单元描述了持久化机制的属性。

  • 数据源 (*ds.xml) - 数据源描述了数据存储相关的属性,例如连接 URL、用户名、密码等。

消息驱动 Bean 是一个无状态 Bean,用于异步执行任务。

@javax.ejb.Stateless 注解指定给定的 ejb 类是无状态 Session Bean。以下是其属性

  • name - 用于指定 Session Bean 的名称。

  • mappedName - 用于指定 Session Bean 的 JNDI 名称。

  • description - 用于提供 Session Bean 的描述。

@javax.ejb.Stateful 注解指定给定的 ejb 类是有状态 Session Bean。以下是其属性

  • name - 用于指定 Session Bean 的名称。

  • mappedName - 用于指定 Session Bean 的 JNDI 名称。

  • description - 用于提供 Session Bean 的描述。

@javax.ejb.MessageDrivenBean 注解指定给定的 ejb 类是消息驱动 Bean。以下是其属性:name - 用于指定消息驱动 Bean 的名称。messageListenerInterface - 用于指定消息驱动 Bean 的消息侦听器接口。activationConfig - 用于指定消息驱动 Bean 在其操作环境中的配置详细信息。mappedName - 用于指定消息驱动 Bean 的 JNDI 名称。description - 用于提供消息驱动 Bean 的描述。

@javax.ejb.EJB 注解用于将依赖项作为 ejb 实例注入到另一个 ejb 中。以下是其属性

  • name - 用于指定将在环境中用于定位引用 Bean 的名称。

  • beanInterface - 用于指定引用 Bean 的接口类型。

  • beanName - 用于提供引用 Bean 的名称。

  • mappedName - 用于指定引用 Bean 的 JNDI 名称。

  • description - 用于提供引用 Bean 的描述。

@javax.ejb.Local 注解用于指定 Session Bean 的本地接口。此本地接口声明 Session Bean 的业务方法(可以是无状态或有状态的)。

此接口用于向在与 EJB 相同的部署/应用程序中运行的本地客户端公开业务方法。

以下是其属性

  • value - 用于指定本地接口列表,作为接口数组。

@javax.ejb.Remote 注解用于指定 Session Bean 的远程接口。此远程接口声明 Session Bean 的业务方法(可以是无状态或有状态的)。

此接口用于向在与 EJB 不同的部署/应用程序中运行的远程客户端公开业务方法。

以下是其属性

  • value - 用于指定远程接口列表,作为接口数组。

@javax.ejb.ActivationConfigProperty 注解用于指定消息驱动 Bean 所需的属性。例如端点、目标、消息选择器等。

此注解作为参数传递给 javax.ejb.MessageDrivenBean 注解的 activationConfig 属性。以下是其属性

  • propertyName - 属性的名称。

  • propertyValue - 属性的值。

@javax.ejb.PostActivate 注解用于指定 ejb 生命周期回调方法。当 EJB 容器激活/重新激活 Bean 实例时,将调用此方法。

此接口用于向在与 EJB 相同的部署/应用程序中运行的本地客户端公开业务方法。

回调是一种机制,可以通过它拦截企业 Bean 的生命周期。EJB 3.0 规范指定了要为其创建回调处理程序方法的回调。EJB 容器调用这些回调。我们可以在 ejb 类本身或单独的类中定义回调方法。EJB 3.0 提供了许多用于回调的注解。

以下是无状态 Bean 的回调注解列表

  • @PostConstruct - 当第一次创建 Bean 时调用该方法。

  • @PreDestroy - 当 Bean 从 Bean 池中移除或被销毁时调用该方法。

以下是有状态 Bean 的回调注解列表

  • @PostConstruct - 当第一次创建 Bean 时调用该方法。

  • @PreDestroy - 当 Bean 从 Bean 池中移除或被销毁时调用该方法。

  • @PostActivate - 当加载 Bean 以供使用时调用该方法。

  • @PrePassivate - 当将 Bean 放回 Bean 池时调用该方法。

以下是消息驱动 Bean 的回调注解列表

  • @PostConstruct - 当第一次创建 Bean 时调用该方法。

  • @PreDestroy - 当 Bean 从 Bean 池中移除或被销毁时调用该方法。

以下是实体 Bean 的回调注解列表

  • @PrePersist - 当在数据库中创建实体时调用该方法。

  • @PostPersist - 方法在实体创建到数据库后被调用。

  • @PreRemove - 方法在实体从数据库中删除之前被调用。

  • @PostRemove - 方法在实体从数据库中删除后被调用。

  • @PreUpdate - 方法在实体即将更新到数据库之前被调用。

  • @PostLoad - 方法在记录从数据库中获取并加载到实体时被调用。

计时器服务是一种机制,可以使用它来构建计划应用程序。例如,每月1日生成工资单。EJB 3.0 规范指定了 @Timeout 注解,它有助于以无状态或消息驱动 Bean 的方式对 ejb 服务进行编程。EJB 容器调用用 @Timeout 注解的方法。

EJB 计时器服务是由 Ejb 容器提供的服务,它有助于创建计时器并在计时器到期时安排回调。

@EJB 注解用于注入其他 EJB 的引用。

@Resource 注解用于将数据源注入到 ejb 中。

@Resource 注解用于将单例服务(如计时器服务)注入到 ejb 中。

@Resource 注解用于将 SessionContext 注入到 ejb 中。

EJB 3.0 规范提供了注解,这些注解可以应用于字段或 setter 方法以注入依赖项。EJB 容器使用全局 JNDI 注册表来查找依赖项。

EJB 3.0 提供了规范,可以使用用 @AroundInvoke 注解的方法来拦截业务方法调用。拦截器方法在 ejbContainer 调用其拦截的业务方法之前被调用。

类级拦截器会为 Bean 的每个方法调用。类级拦截器可以通过注解或通过 xml(ejb-jar.xml)应用。

默认拦截器会为部署中的每个 Bean 调用。默认拦截器只能通过 xml(ejb-jar.xml)应用。

方法级拦截器会为 Bean 的特定方法调用。方法级拦截器可以通过注解或通过 xml(ejb-jar.xml)应用。

EJB 3.0 提供了将 JAVA POJO(普通旧 Java 对象)嵌入到实体 Bean 中的选项,并允许将列名与嵌入 POJO 类的 方法进行映射。要嵌入的 Java POJO 必须用 @Embeddable 进行注解。

EJB 3.0 使用 @Lob 注解支持 Blob 和 Clob 类型。

可以使用 @Lob 注解映射以下 Java 类型

  • java.sql.Blob

  • java.sql.Clob

  • byte[]

  • String

  • 可序列化对象

事务是一组遵循 ACID 属性的工作项。ACID 代表原子性、一致性、隔离性和持久性。

ACID 代表原子性、一致性、隔离性和持久性。

  • 原子性 - 如果任何工作项失败,则整个单元都被视为失败。成功意味着所有项目都成功执行。

  • 一致性 - 事务必须使系统保持一致状态。

  • 隔离性 - 每个事务独立于任何其他事务执行。

  • 持久性 - 如果事务已执行或提交,则事务应在系统故障后仍然存在。

在这种类型中,容器管理事务状态。

在这种类型中,开发人员管理事务状态的生命周期。

EJB 3.0 指定了以下事务属性,EJB 容器实现这些属性

  • REQUIRED - 指示业务方法必须在事务中执行,否则将为该方法启动一个新事务。

  • REQUIRES_NEW - 指示为业务方法启动一个新事务。

  • SUPPORTS - 指示业务方法将作为事务的一部分执行。

  • NOT_SUPPORTED - 指示业务方法不应作为事务的一部分执行。

  • MANDATORY - 指示业务方法将作为事务的一部分执行,否则将抛出异常。

  • NEVER - 指示如果业务方法作为事务的一部分执行,则将抛出异常。

在 Bean 管理的事务中,可以通过在应用程序级别处理异常来管理事务。以下是要考虑的关键点

  • 开始 - 何时在业务方法中启动事务。

  • 成功 - 识别事务要提交时的成功场景。

  • 失败 - 识别事务要回滚时的失败场景。

EJB 3.0 指定了以下安全属性/注解,EJB 容器实现这些属性

  • DeclareRoles - 指示类将接受那些声明的角色。注解应用于类级别。

  • RolesAllowed - 指示方法可以被指定角色的用户访问。可以应用于类级别,从而导致类中的所有方法都可以被指定角色的用户访问。

  • PermitAll - 指示业务方法对所有人开放。可以应用于类级别和方法级别。

  • DenyAll - 指示业务方法对任何在类级别或方法级别指定的 用户都不可访问。

JNDI 代表 Java Naming and Directory Interface(Java 命名和目录接口)。它是一组 API 和服务接口。基于 Java 的应用程序使用 JNDI 进行命名和目录服务。在 EJB 的上下文中,有两个术语

  • 绑定 - 这指的是为 ejb 对象分配一个名称,以后可以使用该名称。

  • 查找 - 这指的是查找和获取 ejb 的对象。

EJB 3.0 提供了定义数据库实体关系/映射(如一对一、一对多、多对一和多对多关系)的选项。以下是相关的注解

  • OneToOne - 对象具有一对一关系。例如,乘客一次可以使用一张票旅行。

  • OneToMany - 对象具有一对多关系。例如,父亲可以有多个孩子。

  • ManyToOne - 对象具有多对一关系。例如,多个孩子有一个母亲。

  • ManyToMany - 对象具有多对多关系。例如,一本书可以有多个作者,一个作者可以写多本书。

在 EJB 3.0 中,ejb 查询语言非常方便编写自定义查询,而无需担心底层数据库的细节。它与 HQL(Hibernate 查询语言)非常相似,通常被称为 EJBQL。

如果违反业务规则或在执行业务逻辑时发生异常。那么 EJB 容器将其视为应用程序级异常。

任何不是由业务逻辑或业务代码引起的异常。RuntimeException、RemoteException 是 SystemException。例如,在 ejb 查找期间发生的错误。那么 EJB 容器会将此类异常视为系统级异常。

当发生应用程序异常时,ejb 容器会拦截异常,但将其原样返回给客户端。它不会回滚事务,除非 EJBContext.setRollBackOnly() 方法在代码中指定。EJB 容器在应用程序异常情况下不会包装异常。

当发生系统异常时,ejb 容器会拦截异常,回滚事务并启动清理任务。它会将异常包装到 RemoteException 中并将其抛给客户端。

下一步是什么?

接下来,您可以回顾您之前完成的与该主题相关的作业,并确保您能够自信地谈论它们。如果您是应届毕业生,面试官不会期望您能回答非常复杂的问题,而是您必须使自己的基础概念非常牢固。

其次,如果您无法回答一些问题,这并不重要,重要的是您回答的任何问题都必须充满自信。所以在面试时要有自信。我们在 tutorialspoint 祝您面试顺利,并祝您未来的事业一切顺利。干杯 :-)

ejb_questions_answers.htm
广告