如何在 CDI 中将参数从另一个 class 传递给注入的 class?
How to pass parameter to injected class from another class in CDI?
我是 CDI 的新手,试图找到这个问题的解决方案,但找不到任何解决方案。问题是假设我有一个 class 被注入(A),其中一些值(toPass)被注入,现在我想将这个相同的值(toPass)传递给 class B,这正在从 class A.
注入
public class A
{
String toPass = "abcd"; // This value is not hardcoded
@Inject
private B b;
}
public class B
{
private String toPass;
public B(String toPass)
{
toPass = toPass;
}
}
有人可以帮我解决这个问题吗?
注意:我们不能像在A中初始化的那样初始化B的toPass变量,这是有一些限制的。基本上在 Spring 中我们可以轻松完成,但是,我想在 CDI 中完成。
我需要说明一下,注入是在对象创建之后发生的,因此如果 toPass 在 A 对象的生命周期中发生变化,那么这种变化不会对已经注入的 B 对象产生任何影响。
(可能可以通过一些棘手的事情来克服这个问题,比如创建自己的生产者方法并产生某种代理来延迟初始化 B 实例……但这可能不太好)
public class A
{
String toPass = "abcd"; // This value is not hardcoded
private B b;
@Inject
public void setB(B b) {
this.b = b;
b.pass(toPass);
}
}
您有以下选择:
1。
从 bean A
的 @PostConstruct
方法将 toPass
变量设置为 b
:
@PostConstruct
public void init() {
b.setToPass(toPass);
}
或
2。
为 toPass
变量创建生产者并将其注入 bean A
和 B
.
制作人:
@Produces
@ToPass
public String produceToPass() {
...
return toPass;
}
注入:
@Inject
@ToPass
String toPass;
或
3。
如果 bean A
不是依赖范围的 bean,您可以使用 Provider
接口获取 bean A
:
的实例
public class B
{
@Inject
Provider<A> a;
public void doSomeActionWithToPass() {
String toPass = a.get().getToPass());
...
}
但是你不应该从构造函数或 @PostConstruct
方法中使用 toPass。
我是 CDI 的新手,试图找到这个问题的解决方案,但找不到任何解决方案。问题是假设我有一个 class 被注入(A),其中一些值(toPass)被注入,现在我想将这个相同的值(toPass)传递给 class B,这正在从 class A.
注入public class A
{
String toPass = "abcd"; // This value is not hardcoded
@Inject
private B b;
}
public class B
{
private String toPass;
public B(String toPass)
{
toPass = toPass;
}
}
有人可以帮我解决这个问题吗? 注意:我们不能像在A中初始化的那样初始化B的toPass变量,这是有一些限制的。基本上在 Spring 中我们可以轻松完成,但是,我想在 CDI 中完成。
我需要说明一下,注入是在对象创建之后发生的,因此如果 toPass 在 A 对象的生命周期中发生变化,那么这种变化不会对已经注入的 B 对象产生任何影响。
(可能可以通过一些棘手的事情来克服这个问题,比如创建自己的生产者方法并产生某种代理来延迟初始化 B 实例……但这可能不太好)
public class A
{
String toPass = "abcd"; // This value is not hardcoded
private B b;
@Inject
public void setB(B b) {
this.b = b;
b.pass(toPass);
}
}
您有以下选择:
1。
从 bean A
的 @PostConstruct
方法将 toPass
变量设置为 b
:
@PostConstruct
public void init() {
b.setToPass(toPass);
}
或
2。
为 toPass
变量创建生产者并将其注入 bean A
和 B
.
制作人:
@Produces
@ToPass
public String produceToPass() {
...
return toPass;
}
注入:
@Inject
@ToPass
String toPass;
或
3。
如果 bean A
不是依赖范围的 bean,您可以使用 Provider
接口获取 bean A
:
public class B
{
@Inject
Provider<A> a;
public void doSomeActionWithToPass() {
String toPass = a.get().getToPass());
...
}
但是你不应该从构造函数或 @PostConstruct
方法中使用 toPass。