2011-02-01 103 views
7

假設我有兩個類,第一類沒有任何屬性,字段或註釋:CDI與非託管對象

public class B {} 

並得到乙注入,像這樣一類:

public class A { 
    @Inject 
    private B b; 

    public B getB() { 
     return b; 
    } 
} 

現在,A類是相當無用的,直到我們使用它,那麼有兩種選擇:

  • @Inject它
  • 手動構造它,使用可信賴的「新的A()」

如果A被注入,CDI管理它,是一種足以注入B,其具有@Dependent的隱式範圍。很酷,就是我想要的。

但是,如果我手動構建A(讓我們在工廠或建築商說的),CDI完全忽略了我的對象,並不會注入型B的對象

例子中,我在談論它的時候不工作,在這裏反對一個將永遠留空:

public class Builder { 
    @Inject 
    private A a; 

    public static Builder ofTypeSomething() { 
     // do some magic here 
     return new Builder(); 
    } 

    private Builder() { 
     // and some more here 
    } 
} 

爲什麼不這項工作?

A類是一個有效的託管bean,它有一個有效的作用域,就像類B一樣。即使我將@Producer添加到靜態方法,它也不會改變任何東西(這很好,導致靜態的想法方法是調用它,而不是在任何地方注入Builder)。

回答

9

依賴注入雖然有用,但並不神奇。 DI的工作方式是當你向容器詢問一個對象的實例時,容器首先構造它(通過new()),然後設置依賴關係(這取決於你的框架)。

如果您自己構建實體,那麼容器不知道您構建了實體並且無法設置實體的依賴關係。

如果要使用工廠,那麼大多數框架都有一些配置實體的方法,以便容器知道進行靜態工廠方法調用而不調用實體的構造函數。但是,您仍然需要從容器中獲取您的實體。

編輯:This site似乎演示瞭如何在CDI中使用工廠。

+0

我知道這不是神奇的東西,我明白,容器不知道任何有關對象。那麼問題是:CDI(我使用Weld)如何讓我使用工廠? – Mythica 2011-02-02 11:02:23