簡體   English   中英

如何將參數傳遞給CDI中另一個類的注入類?

[英]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 AB

制片人:

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM