当前位置: 首页 > 知识库问答 >
问题:

CDI-bean实例的可重用性

谢泽语
2023-03-14

在我看来,下面的结果应该是两个字段指向同一个实例

class BeanToInject {
    // something
}

class TargetBean {

    @Inject
    private BeanToInject first;

    @Inject
    private BeanToInject second;

}

但这似乎不是真的,因为第一次和第二次我得到了

first: BeanToInject@2f51cd27
second: BeanToInject@1e92abdf

Bean的引用是否应该在给定的上下文中重用?我错过了什么?

共有2个答案

壤驷俊逸
2023-03-14

您必须将beantointer类注释为@Singleton,以便在两个注入点中使用相同的实例。

张茂勋
2023-03-14

您没有指定BeanToInject的作用域,CDI的默认作用域是依赖的伪作用域,其中每个注入点接收bean的新实例。

 类似资料:
  • 使用Wildfly/JBoss Weld/CDI 1.1。 假设你有一个数据库。可以是任何东西,MySQL,MongoDB。可能是Rest服务。从这个数据库中,你可以得到一个动物列表。 你不知道你将从这项服务中得到什么动物,但你想做的是让它们可以使用,例如注射。 动物类别: 注射点: 您可以制作制作动物的生产者方法,例如,使用限定符制作特定动物: 但如何生成所有(从数据中知道的)动物,以便使用实例

  • CDI新手问题。简单测试场景:JSF CDI会话范围bean。 我需要一种优雅的方式来实例化一组已知的会话范围的cdibean,而不必在页面上提及它们,也不必从其他bean调用它们的方法。作为一个测试用例——一个简单的日志bean,它只记录http会话的开始和结束时间。 当然,我可以创建一个空的JSF组件,将其放在站点范围的模板中,并使其触发所需会话bean的虚拟方法,但从我的观点来看,这有点难看

  • 我的JavaEE应用程序中有一个单例类。我通过使用注释类并让CDI处理所有事情来实现这一点。 我的问题是,我是否可以防止这个类的意外手动实例化,因为CDI要求我有一个非私有的无参数构造函数? “经典”非CDI解决方案将有一个私有构造函数、一个静态字段和一个返回此实例的静态工厂方法。

  • 问题内容: 考虑以下请求范围的CDI bean: 现在,我将其注入到应用程序范围的bean中: 我运行了这段代码,并注意到两个请求之间的请求范围的Bean实例是不同的,但应用程序范围的Bean实例是相同的。我的疑问是:这如何运作?在每个请求时,是否将请求范围的Bean实例重新分配给应用程序范围的字段?还是应用程序范围的bean的代理只是在请求之间改变? 问题答案: 在CDI中,每个注入的对象实际上

  • 我有一个CDI bean,定义如下: 现在,我想以编程方式将其从会话范围中删除: 但是变量始终为空。如何检索实例并销毁它?

  • 我有一个用@ApplicationScoped注释的CDIBean。有没有一种方法可以告诉Spring在组件扫描期间拾取它,就像它被@component注释一样?Spring确实理解@Inject注释,那么为什么不@ApplicationScoped呢? 这个想法是,在Spring中使用CDI bean会很方便(至少如果他们只使用普通的依赖注入,而没有像拦截器、装饰器这样花哨的CDI东西...)