- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
通常我使用 @RequestScoped
或 @SessionScoped
(来自 javax.enterprise.context
)来注入(inject)对象(例如在人脸中beans)使用@Inject
。我也在使用 EJB。据我了解,一组无状态 EJB 副本(池)用于注入(inject)对象。存在多个副本的原因是为了确保不会同时访问一个 EJB 实例。在谈到有状态 EJB 时(同样是我所理解的),其中一个实例绑定(bind)到具体的注入(inject)点。它们是使用 @EJB
注入(inject)的(也是无状态的)。
我经常可以在网络上看到将 @Stateless
或 @Stateful
与 @Scoped
结合使用的示例。它们的含义是什么?
编辑:(试图澄清,因为此时没有人回应):
我特别感兴趣的是,在创建 EJB 实例的那一刻,这种范围内的注释是否会以任何方式(以及如果它们如何)发生变化。根据我的理解:如果我有 @EJB
注释字段,则会在那里注入(inject)适当类的对象。如果此类 EJB 是无状态的,则容器只需从预先创建的实例池中获取免费实例即可。如有必要,可以调整池的大小。它是无状态的,因为不能保证在我们类(即具有包含对 EJB 的引用的字段的类)的方法调用中保留对象。
我们还可以使用有状态 EJB,在这种情况下,在方法调用期间会保留一个实例。正如我所想,它会在每次创建对象时简单地注入(inject)一次。 (还有单例EJB,所有对象之间共享)。
我在这里找不到 EJB 的 @Scoped 注释的用途。
编辑 2:
如果要通过 EJB 和 DI(通过 @Inject
)机制注入(inject)类,则可以使用这种注释组合。然而,这是一种特殊情况,并不优雅。我问你是否知道任何其他原因。
编辑 3:请在 arjan 的回答下查看我的评论。
最佳答案
@Stateless 或@Singleton bean 可以被显式限定范围以防止其范围被自动修改为可能非法的范围。例如。这两种 bean 类型都不允许是 @RequestScoped。有关更多信息,请参阅此链接:http://docs.jboss.org/resteasy/docs/2.0.0.GA/userguide/html/CDI.html
@Stateful 具有(显式)范围的意义。也就是说,如果没有范围,作为程序员,您必须小心调用 @Remove 注释的方法。这可能很难保证,因为这样的 bean 通常不会在您可以在 finally block 中调用 @Remove 方法的单个方法中使用。使用范围,当范围结束时,bean 将被完全删除。
此外,如果没有作用域,您将无法始终使用注入(inject)来获取对有状态 bean 的 stub 的引用。也就是说,每次注入(inject)发生时,您都会得到一个新实例。在请求范围 (JSF) 支持 bean 中注入(inject)有状态 bean 时,这尤其麻烦,因为您有意在多个请求中保留有状态 bean。
然后,结合 @Named,您还可以直接使用 session bean 作为支持 bean 来扁平化您的应用程序层(参见例如 http://jaxenter.com/java-ee-6-overview-35987-2.html)。显然,在这种情况下您需要一个明确的范围。现在,在大型应用程序中扁平化层可能不是最佳实践,但对于小型应用程序和/或刚开始使用 Java EE 的人来说,肯定希望将业务逻辑直接放入支持 bean 中。然后要求支持 bean 可以访问“业务 bean”通常具有的相同类型的服务(主要是事务)。
最后,Gavin King(CDI 规范负责人)建议始终使用@Inject 而不是@EJB。唯一的异常(exception)涉及远程 EJB,其中仍使用 @EJB。
围绕 EJB 和 CDI 的部分混淆是 CDI 是 Java EE 中的一种新组件模型,而且仍然相对较新。尽管它们彼此集成得很好,但它们仍然是两个不同的组件模型,并且尚未考虑到所有最佳实践。 Reza Rahman(EG 成员、EJB 书籍作者和 CDI 实现 CanDI 的作者)建议 EJB 模型可能在未来作为一组 CDI 服务进行改造。事实上,在 Java EE 7 中,通过将事务服务与 EJB 分离并通过 (CDI) 注释使它们可用,迈出了一步。
关于java - 将@Scoped 与EJB 一起使用有什么意义?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6018644/
我需要审核 ejb bean 的调用。说审计我的意思是将当前登录的用户、方法名称、附加描述等信息写入数据库。我决定使用 CDI 装饰器来做到这一点: @Decorator public class A
当我使用 EJB 3.0 部署 Web 应用程序时,我看到了以下警告: WARNING: jar 'E:\mws\MCDS\portal\portal-web\target\portal-web-1.
我正在学习 EJB,当尝试使用 junit 测试它时,出现以下错误 cd.espoirmur.Ejb.InterfaceEjbLocal_80488159 Jun 03, 2016 10:33:58
是否可以在另一个 EJB 中使用 @EJB?我现在正在尝试这样做,但我的 EJB 最终为空。我将在示例中概述我的问题。 @Stateless @LocalBean @Local(LoginServic
我已通读 article试图理解为什么要在客户端和实体 bean 之间有一个 session bean。是不是因为让客户端直接访问实体bean,就让客户端对数据库一清二楚了? 因此,通过使用中间人(
我们正在尝试在具有两个节点的以域模式运行的 Wildfly 中查找远程 EJB。 设置是这样的: Wildfly 节点 1: 模块 A:EJB 客户端 模块 B:远程 EJB Wildfly 节点 2
我正在使用 Jboss 7,并且有两个单独的部署,它们都包含单例 EJB。 我需要一个 EJB 才能访问另一个 EJB 并能够调用其方法,但是,当应用程序服务器启动并尝试部署它们时,它似乎无法保证哪个
可能最好的方法是手动完成。但是在大型项目中,您需要一些工具来帮助您。正是这个想法促使我搜索了一个工具。 是否有任何 EJB 迁移工具可用于将 EJB 2.0 迁移到 3.x。 最佳答案 它的开发时间很
I am migrating Ejb 2.1 to Ejb 3.1. I changed Java Version from 1.6 to 1.8, and Ejb Version from 2.1
我已经使用 @ActivationConfigProperty 配置了消息目标类型、名称等。在 EJB 3.0 中,但我想配置 MDB使用部署描述符 ( ejb-jar.xml ),就像在 EJB 2
假设我有两个 EJB jar:A.jar 和 B.jar。我可以使用 CDI 将不是 EJB 的实用程序类 Autil 注入(inject) A.jar 中的 POJO 到 B.jar 中的 EJB
我有一个需要配置不同的现有项目。这需要在没有重大代码更改的情况下发生。我实际上希望我只能通过配置以某种方式做到这一点。在过去的 2 到 3 天里,我一直在阅读我能找到的关于这个问题的所有内容。我了解
我有一个非常简单的带有maven的ejb 3.0模块,它只有两个 session bean,一个是无状态的,另一个是单例的...当我尝试在Glassfish 3.0服务器上部署该项目时,我得到了这个异
我们在微服务中看到的是一个孤立的组件,通过协议(protocol)通过网络与该组件的父消费者进行通信。 我们在 EJB 1.0 中看到了非常相似的模式。 我的问题是:微服务架构模式是否类似于 EJB
我在 Java EE6 Singleton Session Bean 中有一个方法,它每 30 秒由 @Schedule(...) 计时器调用。这按预期工作,直到在方法中抛出并捕获异常(异常在 try
我正在 JDeveloper 11.1.1.4 中开发一个 JAX-WS WebService,它应该使用之前部署到 WebLogic 服务器的 JAR 中的 EJB。 WebService项目和EJ
我正在尝试使用 JAX-RS 注释将一些 EJB 公开为 REST Web 服务。当我部署 war WEB-INF/lib 中包含 EJB Jar 的文件到 Wildfly 8,我可以在 Web 管理
我是 EJB 方面的新手,但我已经获得了 EJB 级别的提升。 该层由一个 EJB 组成,它公开可用的操作: @Stateless(name = "myejb") public class Facad
假设我想创建一个我将在未来项目中使用的库,但我还想在该库中包含引用其他 EJB 等的 EJB。该库还将包含简单的 Java 类。最好的方法是什么?在这种情况下如何定义依赖关系?我想我会用注释来定义它们
我想知道是否可以按照这些思路做一些事情: 1)服务器端(EJB类) @Statefull public class SomeEJB implements SomeEJBRemote { @Resour
我是一名优秀的程序员,十分优秀!