繁体   English   中英

两次注入一个@RequestScoped bean 作为不同的实例

[英]Inject a @RequestScoped bean twice as different instances

我有以下情况(Java EE、CDI、jax.rs):

我有一个 RequestScoped Bean,它存储在请求的实时时间中使用的一些数据:

MyHandler.java:
@RequestScoped
public class MyHandler
{
    ....
}

然后我有我的 REST 调用,它使用我的 Handler Bean 的两个不同实例:

MyRestCall.java:
@Stateless
public class MyRestCall
{
    @Inject
    MyHandler handlerA;

    @Inject
    MyHandler handlerB;

    ....
}

然而,发生的情况是, handlerAhandlerB是同一个对象。 但我想要两个不同的。 我怎样才能以适当的方式实现这一目标? 当然,我可以创建一个基类处理程序,然后导出两个独立的类HandlerAHandlerB和@Inject他们作为handlerAhandlerB。 但我希望有一种更清洁的方式。

这个 bean 是请求范围的,因此在请求生命周期中的所有处理过程中应该只有一个这样的 bean。 你不应该期望得到一个新的。

具有这种行为的范围是@Dependent范围。 你有没有想过把它用在那个豆子上? 每次注入它时它都会产生新的 bean,因此它看起来是一个更好的解决方案。 当然,在您使用相同 bean 的其他地方,将会注入新的 bean。

尝试将Instance注释与@New一起@New

@Inject
@New(MyHandler.class)
Instance<MyHandler> handlerInstanceA;

@Inject
@New(MyHandler.class)
Instance<MyHandler> handlerInstanceB;

然后使用以下方法获取您的实例:

MyHandler handlerA = handlerInstanceA.get();
MyHandler handlerB = handlerInstanceB.get();

更新

文档@New在 CDI 1.1 中被弃用,而应该使用@Dependent范围:

New限定符在 CDI 1.1 中已弃用。 鼓励 CDI 应用程序改为注入Dependent范围的 bean。

所以使用:

@Inject
MyHandler handlerA;

@Inject
MyHandler handlerB;

由于@Dependent是默认的 CDI 作用域,因此请让您的MyHandler不带注释或使用@Dependent MyHandler进行注释:

@Dependent
public class MyHandler {...}

根据@Dependent 文档

使用范围@Dependent声明的 Bean 与具有其他内置范围类型的 Bean 的行为不同。 当 bean 被声明为具有作用域@Dependent

• 没有注入的 bean 实例在多个注入点之间共享。
• 注入到容器正在创建的对象中的 bean 的任何实例都绑定到新创建对象的生命周期。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM