什么是EJB,它有什么作用?

时间:2012-10-13 11:31:45

标签: java-ee ejb ejb-3.1

一直试图了解EJB bean是什么,这意味着他们的实例是在池中管理的,等等等等。真的无法抓住他们。

你能解释一下他们到底是什么(实际上对于Java程序员来说)吗?他们在做什么?他们的目的是什么? 为什么要真正使用它们? (为什么不坚持POJO?)也许是一个示例应用程序?

请仅参考更新的信息,即EJB 3.1。关于EJB的日期信息可能会产生误导。

对于EJB学习初学者,请注意:

EJB基于分布式对象,这是指在网络链接的多台计算机(虚拟或物理)上运行的软件。

4 个答案:

答案 0 :(得分:155)

  

为什么要真正使用它们? (为什么不坚持POJO?)

如果您需要一个访问数据库的组件,或访问其他连接/目录资源,或者从多个客户端访问,或者用作SOA服务,那么今天的EJB通常更大,更强,更快(或至少更具可扩展性和更简单的"比POJO。它们对于通过Web或公司网络为大量用户提供服务最有价值,对部门内的小型应用程序而言价值较低。

  1. 使用松散耦合在多个应用程序/客户端之间重用/共享逻辑 EJB可以打包在自己的jar中,部署并从很多地方调用。 它们是常见的组件。确实,POJO可以(小心!)设计为库和 打包成罐子。但EJB支持本地和远程网络访问 - 包括 通过本地java接口,透明RMI,JMS异步消息和SOAP / REST Web服务, 通过多个(不一致的?)部署来保存剪切和粘贴jar依赖关系 它们对于创建SOA服务非常有用。当用于本地访问时,它们是 POJO(增加了免费的集装箱服务)。设计单独的EJB层的行为 促进额外的护理,以最大化封装,松散耦合和凝聚力,和 促进一个干净的界面(Facade),保护呼叫者免受复杂的处理和数据 模型。

  2. 可扩展性和可靠性 如果您应用来自各种呼叫消息/进程的大量请求 / threads,它们首先分布在池中的可用EJB实例中 然后排队。这意味着如果每秒传入的请求数是 比服务器可以处理的更大,我们优雅地降级 - 总有一些 请求被有效处理,超出的请求被等待。我们 没有到达服务器"熔毁" - 所有请求都会遇到可怕的响应时间 同时,加上服务器试图访问比硬件和硬件更多的资源。 OS 可以处理和因此崩溃。 EJB可以部署在可以的单独层上 集群 - 这通过从一台服务器到另一台服务器的故障转移提供可靠性 可以添加硬件以线性扩展。

  3. 并发管理。 容器确保安全地(连续地)自动访问EJB实例 由多个客户。容器管理EJB池,线程池, 调用队列,并自动执行方法级写锁定(默认)或 读锁定(通过@Lock(READ))。这可以保护数据免受损坏 并发写 - 写冲突,并通过防止帮助数据一致读取 读写冲突。
    这对于@Singleton会话bean非常有用,其中bean正在操作和 跨客户端呼叫者共享公共状态。这可以很容易地手动覆盖 配置或以编程方式控制并发代码执行的高级方案 和数据访问。

  4. 自动交易处理 什么都不做,所有的EJB方法都运行完毕 在JTA交易中。如果使用JPA或JDBC访问数据库,则会自动进行 参加交易。 JMS和JCA调用也是如此。指定 @TransactionAttribute(someTransactionMode)在方法之前指定if / how 特定方法参与JTA事务,覆盖默认模式:"必需"。

  5. 通过注入非常简单的资源/依赖访问 容器将查找资源并将资源引用设置为实例字段 EJB:如JNDI存储的JDBC连接,JMS连接/主题/队列,其他 EJB,JTA事务,JPA实体管理器持久化上下文,JPA实体管理器 工厂持久性单元和JCA适配器资源。 例如设置对另一个EJB&的引用JTA交易& JPA实体经理& JMS连接工厂和队列:

    @Stateless
    public class MyAccountsBean {
    
        @EJB SomeOtherBeanClass someOtherBean;
        @Resource UserTransaction jtaTx;
        @PersistenceContext(unitName="AccountsPU") EntityManager em;
        @Resource QueueConnectionFactory accountsJMSfactory;
        @Resource Queue accountPaymentDestinationQueue;
    
        public List<Account> processAccounts(DepartmentId id) {
            // Use all of above instance variables with no additional setup.
            // They automatically partake in a (server coordinated) JTA transaction
        }
    }
    

    Servlet可以通过简单地声明一个实例变量来在本地调用这个bean:

    @EJB MyAccountsBean accountsBean;    
    

    然后只是调用它的&#39;根据需要的方法。

  6. 与JPA的智能互动。 默认情况下,如上所示注入的EntityManager使用事务范围的持久性 上下文。这对于无状态会话bean来说非常完美。当一个(无状态)EJB方法 调用时,在新事务中创建一个新的持久化上下文all 检索/写入数据库的实体对象实例仅在其中可见 方法调用并与其他方法隔离。但是,如果其他无状态EJB是 通过该方法调用,容器传播并共享同一台PC,所以相同 实体通过PC以相同的方式自动共享 交易。
    如果声明了@Stateful会话bean,则通过以下方式实现与JPA相等的智能关联 将entityManager声明为扩展范围: @PersistentContent(unitName =&#34; AccountsPU,type = EXTENDED)。这存在于生命中 bean会话,跨多个bean调用和事务,缓存内存中的副本 之前检索/写入的数据库实体,因此无需重新检索。

  7. 生命周期管理。 EJB的生命周期是容器管理的。根据需要,它创建EJB实例, 清除并初始化有状态会话bean状态,钝化&amp;激活,并打电话 生命周期回调方法,因此EJB代码可以参与生命周期操作 获取和释放资源,或执行其他初始化和关闭行为。 它还捕获所有异常,记录它们,根据需要回滚事务,以及 根据需要抛出新的EJB异常或@ApplicationExceptions。

  8. 安全管理。 可以通过简单的注释或XML来配置对EJB的基于角色的访问控制 设置。服务器会自动传递经过身份验证的用户详细信息 作为安全上下文调用(调用主体和角色)。它确保了所有RBAC 自动强制执行规则,以便方法不会被非法调用 错误的角色。它允许EJB轻松访问用户/角色详细信息以获得额外的程序化 检查。它允许插入额外的安全处理(甚至IAM工具) 容器以标准方式。

  9. 标准化&amp;可移植性。 EJB实现符合Java EE标准和编码约定,提升了质量 易于理解和维护。它还促进了代码的可移植性 供应商应用服务器,确保它们都支持相同的标准功能 行为,并阻止开发人员意外采用专有技术 非便携式供应商功能。

  10. 真正的踢球者:简单。以上所有都可以完成  非常简化的代码 - 使用EJB的默认设置  在Java EE 6中,或添加一些注释。编码  您自己的POJO中的企业/工业实力特征会  方式更加庞大,复杂且容易出错。一旦您  开始使用EJB进行编码,它们很容易开发并提供一套很好的免费乘车服务。好处。

  11. 在10年前的原始EJB规范中,EJB是一个主要的生产力麻烦。它们很臃肿,需要大量的代码和配置工件,并提供了大约2/3的上述好处。大多数Web项目实际上并没有使用它们。但是,经过10年的调整,大修,功能增强和开发流程,这已经发生了重大变化。在Java EE 6中,它们提供了最高级别的工业强度和使用简便性。

    不喜欢什么? :-): - )

答案 1 :(得分:64)

EJB是一个Java组件,包含您在容器中部署的业务逻辑,并且通过注释可以从容器提供的技术服务中获益,通常以声明方式:

  • 事务管理:事务可以在调用EJB的方法之前自动启动,并在此方法返回后提交或回滚。此事务上下文将传播到对其他EJB的调用。
  • 安全管理:可以检查调用者是否具有执行该方法所需的角色。
  • 依赖注入:可以将其他EJB或诸如JPA实体管理器,JDBC数据源等资源注入EJB中。
  • 并发:容器确保一次只有一个线程调用EJB实例的方法。
  • 分发:可以从另一个JVM远程调用某些EJB。
  • 故障转移和负载平衡:如果需要,EJB的远程客户端可以自动将其调用重定向到另一台服务器。
  • 资源管理:有状态bean可以自动钝化到磁盘,以限制服务器的内存消耗。
  • ......我可能已经忘记了一些观点。

答案 2 :(得分:21)

希望Oracle doc能帮助像我这样的人以简单的方式理解EJB的主题。

  

什么是企业Bean?   企业bean是用Java编程语言编写的,是一个封装应用程序业务逻辑的服务器端组件。业务逻辑是满足应用程序目的的代码。例如,在库存控制应用程序中,企业bean可以在名为checkInventoryLevel和orderProduct的方法中实现业务逻辑。通过调用这些方法,客户端可以访问应用程序提供的库存服务。

     

Enterprise Bean的好处有几个原因,企业bean   简化大型分布式应用程序的开发。第一,   因为EJB容器为企业提供系统级服务   bean,bean开发人员可以专注于解决业务问题   问题。 EJB容器,而不是bean开发人员,是   负责系统级服务,如事务管理   和安全授权。

     

其次,因为bean而不是客户端包含   应用程序的业务逻辑,客户端开发人员可以专注于   客户的介绍。客户端开发人员不必编写代码   实现业务规则或访问数据库的例程。作为一个   结果,客户更薄,特别是受益   对于在小型设备上运行的客户来说很重要。

     第三,因为企业bean是便携式组件,所以   应用汇编程序可以从现有bean构建新的应用程序。   这些应用程序可以在任何提供的兼容Java EE服务器上运行   他们使用标准API。

     

何时使用Enterprise Bean您应该考虑使用Enterprise   bean如果您的应用程序具有以下任何要求:

     

应用程序必须是可扩展的。为了容纳越来越多的人   用户,您可能需要分发应用程序的组件   多台机器。不仅可以应用程序的企业bean   在不同的机器上运行,但它们的位置也将保留   对客户透明。

     

交易必须确保数据完整性。企业bean支持   事务,管理并发访问的机制   共享对象。

     

该应用程序将拥有各种客户端。只有几行   代码,远程客户端可以轻松找到企业bean。这些   客户可以很薄,多种多样。

答案 3 :(得分:3)

我最感兴趣的问题是我如何以及在何处使用它们。要理解这一点,我们首先需要了解存在哪些类型的EJB。有两大类:

  1. 会话bean
  2. 消息驱动的bean
  3. 让我们考虑会话豆。它们有3种:

    1. 有状态 - 这些组件维护状态,并且特定于多个请求的客户端。将其视为会话。可以立即使用这些购物车或其他类型的会话(登录会话等)
    2. 无状态 - 这些是自包含的组件,不会在请求之间保留信息,但它们对用户来说是唯一的。想到的即时使用 - 服务层中的服务类。想象一下OrderService。这些的另一个重要用途是公开Web服务。同样,这可以在服务层中完全分开。
    3. Singleton - 这些是每个应用程序存在的bean,只创建一次,可以多次重复使用/访问。我们会立即想到 Configuration 组件 - 您可以在其中存储应用程序级配置,并在需要时随时随地访问它们。
    4. 现在,在任何此类情况下,其他功能或功能都可以跨层使用:

      • 安全性 - 您可以使用所调用方法的注释检查权限。如果您愿意,可以在Service层和Controller中进行此操作。
      • 交易管理 - 这是服务层或持久层中的明显候选者
      • 依赖注入 - 将再次使用

      现代的一个重要用途是所谓的微服务和面向服务的体系结构。您可以将一些业务逻辑组件打包为EJB,并将它们分发到整个组织中,供多个客户端使用(客户端在这里我指的是其他后端应用程序)。

      等等。现在最大的缺点是你变得非常依赖EJB容器,虽然你可以在2个参考实现之间切换,但你将无法切换到更轻的东西 - 例如Tomcat。但是你为什么要牺牲所有的好处?