我是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中完成它。
答案 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 toPass
和A
。
制片:
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);
}
}