一直试图了解EJB
bean是什么,这意味着他们的实例是在池中管理的,等等等等。真的无法抓住他们。
你能解释一下他们到底是什么(实际上对于Java程序员来说)吗?他们在做什么?他们的目的是什么? 为什么要真正使用它们? (为什么不坚持POJO
?)也许是一个示例应用程序?
请仅参考更新的信息,即EJB 3.1
。关于EJB的日期信息可能会产生误导。
对于EJB学习初学者,请注意:
EJB基于分布式对象,这是指在网络链接的多台计算机(虚拟或物理)上运行的软件。
答案 0 :(得分:155)
为什么要真正使用它们? (为什么不坚持POJO?)
如果您需要一个访问数据库的组件,或访问其他连接/目录资源,或者从多个客户端访问,或者用作SOA服务,那么今天的EJB通常更大,更强,更快(或至少更具可扩展性和更简单的"比POJO。它们对于通过Web或公司网络为大量用户提供服务最有价值,对部门内的小型应用程序而言价值较低。
使用松散耦合在多个应用程序/客户端之间重用/共享逻辑 EJB可以打包在自己的jar中,部署并从很多地方调用。 它们是常见的组件。确实,POJO可以(小心!)设计为库和 打包成罐子。但EJB支持本地和远程网络访问 - 包括 通过本地java接口,透明RMI,JMS异步消息和SOAP / REST Web服务, 通过多个(不一致的?)部署来保存剪切和粘贴jar依赖关系 它们对于创建SOA服务非常有用。当用于本地访问时,它们是 POJO(增加了免费的集装箱服务)。设计单独的EJB层的行为 促进额外的护理,以最大化封装,松散耦合和凝聚力,和 促进一个干净的界面(Facade),保护呼叫者免受复杂的处理和数据 模型。
可扩展性和可靠性 如果您应用来自各种呼叫消息/进程的大量请求 / threads,它们首先分布在池中的可用EJB实例中 然后排队。这意味着如果每秒传入的请求数是 比服务器可以处理的更大,我们优雅地降级 - 总有一些 请求被有效处理,超出的请求被等待。我们 没有到达服务器"熔毁" - 所有请求都会遇到可怕的响应时间 同时,加上服务器试图访问比硬件和硬件更多的资源。 OS 可以处理和因此崩溃。 EJB可以部署在可以的单独层上 集群 - 这通过从一台服务器到另一台服务器的故障转移提供可靠性 可以添加硬件以线性扩展。
并发管理。
容器确保安全地(连续地)自动访问EJB实例
由多个客户。容器管理EJB池,线程池,
调用队列,并自动执行方法级写锁定(默认)或
读锁定(通过@Lock(READ))。这可以保护数据免受损坏
并发写 - 写冲突,并通过防止帮助数据一致读取
读写冲突。
这对于@Singleton会话bean非常有用,其中bean正在操作和
跨客户端呼叫者共享公共状态。这可以很容易地手动覆盖
配置或以编程方式控制并发代码执行的高级方案
和数据访问。
自动交易处理 什么都不做,所有的EJB方法都运行完毕 在JTA交易中。如果使用JPA或JDBC访问数据库,则会自动进行 参加交易。 JMS和JCA调用也是如此。指定 @TransactionAttribute(someTransactionMode)在方法之前指定if / how 特定方法参与JTA事务,覆盖默认模式:"必需"。
通过注入非常简单的资源/依赖访问 容器将查找资源并将资源引用设置为实例字段 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;根据需要的方法。
与JPA的智能互动。
默认情况下,如上所示注入的EntityManager使用事务范围的持久性
上下文。这对于无状态会话bean来说非常完美。当一个(无状态)EJB方法
调用时,在新事务中创建一个新的持久化上下文all
检索/写入数据库的实体对象实例仅在其中可见
方法调用并与其他方法隔离。但是,如果其他无状态EJB是
通过该方法调用,容器传播并共享同一台PC,所以相同
实体通过PC以相同的方式自动共享
交易。
如果声明了@Stateful会话bean,则通过以下方式实现与JPA相等的智能关联
将entityManager声明为扩展范围:
@PersistentContent(unitName =&#34; AccountsPU,type = EXTENDED)。这存在于生命中
bean会话,跨多个bean调用和事务,缓存内存中的副本
之前检索/写入的数据库实体,因此无需重新检索。
生命周期管理。 EJB的生命周期是容器管理的。根据需要,它创建EJB实例, 清除并初始化有状态会话bean状态,钝化&amp;激活,并打电话 生命周期回调方法,因此EJB代码可以参与生命周期操作 获取和释放资源,或执行其他初始化和关闭行为。 它还捕获所有异常,记录它们,根据需要回滚事务,以及 根据需要抛出新的EJB异常或@ApplicationExceptions。
安全管理。 可以通过简单的注释或XML来配置对EJB的基于角色的访问控制 设置。服务器会自动传递经过身份验证的用户详细信息 作为安全上下文调用(调用主体和角色)。它确保了所有RBAC 自动强制执行规则,以便方法不会被非法调用 错误的角色。它允许EJB轻松访问用户/角色详细信息以获得额外的程序化 检查。它允许插入额外的安全处理(甚至IAM工具) 容器以标准方式。
标准化&amp;可移植性。 EJB实现符合Java EE标准和编码约定,提升了质量 易于理解和维护。它还促进了代码的可移植性 供应商应用服务器,确保它们都支持相同的标准功能 行为,并阻止开发人员意外采用专有技术 非便携式供应商功能。
真正的踢球者:简单。以上所有都可以完成 非常简化的代码 - 使用EJB的默认设置 在Java EE 6中,或添加一些注释。编码 您自己的POJO中的企业/工业实力特征会 方式更加庞大,复杂且容易出错。一旦您 开始使用EJB进行编码,它们很容易开发并提供一套很好的免费乘车服务。好处。
在10年前的原始EJB规范中,EJB是一个主要的生产力麻烦。它们很臃肿,需要大量的代码和配置工件,并提供了大约2/3的上述好处。大多数Web项目实际上并没有使用它们。但是,经过10年的调整,大修,功能增强和开发流程,这已经发生了重大变化。在Java EE 6中,它们提供了最高级别的工业强度和使用简便性。
不喜欢什么? :-): - )
答案 1 :(得分:64)
EJB是一个Java组件,包含您在容器中部署的业务逻辑,并且通过注释可以从容器提供的技术服务中获益,通常以声明方式:
答案 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。有两大类:
让我们考虑会话豆。它们有3种:
OrderService
。这些的另一个重要用途是公开Web服务。同样,这可以在服务层中完全分开。Configuration
组件 - 您可以在其中存储应用程序级配置,并在需要时随时随地访问它们。现在,在任何此类情况下,其他功能或功能都可以跨层使用:
现代的一个重要用途是所谓的微服务和面向服务的体系结构。您可以将一些业务逻辑组件打包为EJB,并将它们分发到整个组织中,供多个客户端使用(客户端在这里我指的是其他后端应用程序)。
等等。现在最大的缺点是你变得非常依赖EJB容器,虽然你可以在2个参考实现之间切换,但你将无法切换到更轻的东西 - 例如Tomcat。但是你为什么要牺牲所有的好处?