如何在 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 AB.

制作人:

@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。