我在规范中找不到任何关于使用@EJB或@Inject的依赖注入如何与容器的bean生命周期管理交互的明确说明。
我希望将单例bean A注入到单例bean B中。我希望容器在调用B的@PostConstruct方法时确保A存在,并在B的@PreDestroy方法完成后继续存在。
发布于 2018-10-31 08:49:14
CDI和EJB是两种不同的规范。CDI提供集成,允许您像使用CDI一样使用EJB (反之亦然!)因此,请注意,无论您是在谈论CDI还是EJB,并不是所有的注释都适用于所有bean。例如,@Singleton (EJB)可以具有@Startup,而来自CDI的@ApplicationScoped bean不能。
你说的是“单例豆”。只是为了消除混乱,在EJB中,意思是@Singleton,在CDI中,意思是@ApplicationScoped bean。
话虽如此,对于你的问题:
只要您使用它在这些bean之间创建一个非循环依赖关系,@Inject也应该工作--例如,如果您在一个bean的构造函数处使用@Inject,CDI将首先启动该bean试图使用的依赖项。请记住,CDI是懒洋洋地发起的--除非您真正尝试使用该bean,否则不会发生任何事情。
不清楚您在这里的意思-- @EJB是CDI中@Inject的一个等价的EJB。
这也是一个选项,但请注意,这只能在EJB上使用(这非常好,这里只表示CDI与@Singleton之间的差异)。
发布于 2018-10-30 07:39:34
在某些情况下,应用程序中的多个单例会话bean组件之间存在显式初始化顺序依赖关系。DependsOn注释用于表示这些依赖项。如果一个单例会话bean必须在一个或多个其他单例会话bean之前初始化,则使用DependsOn依赖项。容器确保在调用DependsOn方法之前已经初始化了单例会话bean与其具有PostConstruct关系的所有单例会话bean。 注意,如果一个单例会话bean只需要从其PostConstruct方法调用另一个单例会话bean,则不需要显式排序元数据。在这种情况下,第一个单例会话bean只会使用EJB引用来调用目标单例会话bean。在这种情况下,获取EJB引用(无论是通过注入还是通过查找)并不一定意味着实际创建相应的单例会话bean实例。
https://stackoverflow.com/questions/53018377
复制相似问题