如何将参数传递给CDI中另一个类的注入类?

时间:2015-10-10 08:46:10

标签: java dependency-injection parameter-passing cdi inject

我是CDI的新手,试图找到这个问题的解决方案,但是,找不到任何问题。问题是假设我有一个正在注入(A)的类,其中一些值(toPass)被注入,现在我想将这个相同的值(toPass)传递给B类,这是从A类注入的。 / p>

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中完成它。

2 个答案:

答案 0 :(得分:5)

你有选择:

1。 从Sub percentage() Dim a() As String, b() As String Dim aRng As Range, cel As Range Dim i As Integer, t As Integer Set aRng = Range(Range("A1"), Range("A5").End(xlDown)) For Each cel In aRng a = Split(Trim(cel), " ") b = Split(Trim(cel.Offset(, 1)), " ") d = 0 c = UBound(a) + 1 If cel.Value <> "" Then If InStr(cel, cel.Offset(, 1)) Then d = UBound(b) + 1 Else For i = LBound(a) To UBound(a) For t = LBound(b) To UBound(b) If UCase(a(i)) = UCase(b(t)) Then d = d + 1 End If Next Next End If End If cel.Offset(0, 2).Value = (d / c) Next End Sub bean toPass方法将b变量设置为@PostConstruct

A

2。 为@PostConstruct public void init() { b.setToPass(toPass); } 变量创建生成器并将其注入bean toPassA

制片:

B

注射:

@Produces
@ToPass
public String produceToPass() {
    ...
    return toPass;
}

3。 如果bean @Inject @ToPass String toPass; 不是依赖的作用域bean,则可以使用A接口来获取bean Provider的实例:

A

但是你不应该从构造函数或public class B { @Inject Provider<A> a; public void doSomeActionWithToPass() { String toPass = a.get().getToPass()); ... } 方法使用toPass。

答案 1 :(得分:2)

我需要说之前注入恰好在创建对象之后发生,因此如果toPass在A对象的生命周期中发生变化,则此更改不会对已注入的B对象产生任何影响。

(可能有可能通过一些hacky事情来克服这个问题,例如创建自己的生成器方法并生成某种代理,这种代理会懒惰地初始化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);
   }
}