[英]How to pass parameter to injected class from another class in CDI?
我是CDI的新手,試圖找到這個問題的解決方案,但是,找不到任何問題。 問題是假設我有一個正在注入(A)的類,其中一些值(toPass)被注入,現在我想將這個相同的值(toPass)傳遞給B類,這是從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中完成它。
你有選擇:
1.從Bean A
@PostConstruct
方法設置toPass
變量為b
:
@PostConstruct
public void init() {
b.setToPass(toPass);
}
要么
2.為toPass
變量創建生成器toPass
其注入bean A
和B
。
制片人:
@Produces
@ToPass
public String produceToPass() {
...
return toPass;
}
注射:
@Inject
@ToPass
String toPass;
要么
3.如果bean A
不是依賴的scoped bean,你可以使用Provider
接口來獲取bean A
的實例:
public class B
{
@Inject
Provider<A> a;
public void doSomeActionWithToPass() {
String toPass = a.get().getToPass());
...
}
但是你不應該從構造函數或@PostConstruct
方法使用toPass。
我需要說之前注入恰好在創建對象之后發生,因此如果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);
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.