Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/366.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 将@RequestScope bean注入两次不同的实例_Java_Jakarta Ee - Fatal编程技术网

Java 将@RequestScope bean注入两次不同的实例

Java 将@RequestScope bean注入两次不同的实例,java,jakarta-ee,Java,Jakarta Ee,我有以下情况(JavaEE、CDI、jax.rs): 我有一个RequestScoped Bean,它存储请求实时使用的一些数据: MyHandler.java: @RequestScoped public class MyHandler { .... } 然后我有我的REST调用,它使用我的处理程序Bean的两个不同的实例: MyRestCall.java: @Stateless public class MyRestCall { @Inject MyHandler

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

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

MyHandler.java:
@RequestScoped
public class MyHandler
{
    ....
}
然后我有我的REST调用,它使用我的处理程序Bean的两个不同的实例:

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

    @Inject
    MyHandler handlerB;

    ....
}

然而,所发生的是,hanlderA和handlerB是同一个对象。但是我想要两个不同的。我如何以适当的方式实现这一点?当然,我可以创建一个基类处理程序,然后派生两个独立的类HandlerA和HandlerB,并@Inject它们为HandlerA和HandlerB。但我希望有一个更干净的方法。

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

具有这种行为的作用域是
@相关的
作用域。你有没有想过用它来做豆子?每次你注入它时,它都会产生新的bean,所以它看起来是一个更好的解决方案。当然,在使用同一bean的其他地方,将注入新的bean。

尝试使用annotate with:

更新 CDI 1.1中不推荐使用的,应改为使用范围:

该限定符在CDI 1.1中被弃用。我们鼓励CDI应用程序注入作用域bean

因此,请使用:

@Inject
MyHandler handlerA;

@Inject
MyHandler handlerB;
由于
@Dependent
是默认的CDI作用域,因此将您的
MyHandler
保留为不带注释,或使用
@Dependent
对其进行注释:

@Dependent
public class MyHandler {...}
根据
@相关的

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

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


简明扼要!非常感谢你!工作起来很有魅力。
@Inject
MyHandler handlerA;

@Inject
MyHandler handlerB;
@Dependent
public class MyHandler {...}