2011-12-29 204 views
4

假設我有Spring服務類或JSF bean。我將這些班級連接到另一班。到現在爲止沒有問題。我可以用任何方法使用這些注入字段。構造函數中的依賴注入

但是,在構造函數中使用它們給了我一個NullPointerException。

可能是構造函數在依賴注入發生之前運行,並且它看不到我注入的字段。有沒有解決方案在構造函數中使用依賴注入?

回答

3

顯然,如果此對象不存在,則無法在對象中注入任何東西。要存在,必須構建一個對象。

Spring支持構造器注入:

@Autowired 
public SomeService(SomeDependency dep) { 
    ... 

Spring還支持@PostConstruct,所有的依賴已經注入之後允許初始化一個bean。

不知道JSF。

+1

那麼['@ PostConstruct'](http://docs.oracle.com/javase/6/docs /api/javax/annotation/PostConstruct.html)是一個EJB註釋,所以JavaEE顯然支持它。而['@ ject]'(http://docs.oracle.com/javaee/6/api/javax/inject/Inject.html)也適用於構造函數。 – 2011-12-29 10:15:49

+0

@Sean:它不是EJB註釋。它是Java SE API的一部分。但它確實與EJB結合使用最多。 – BalusC 2011-12-29 11:15:24

+0

@BalusC可能是正確的,但文檔明確提到了EJB規範。 – 2011-12-29 11:18:25

3

不,你不能在構造函數中引用注入字段。框架必須以某種方式構造對象(調用構造函數),然後注入依賴關係,以便在構造函數執行期間它們是空的。你平時做的,而不是正在申請@PostConstruct註釋你的方法之一,並有執行初始化:

class MyBean { 
    @Inject 
    private MyDependency myDep; 

    @PostConstruct 
    public void init() { 
    assert myDep != null; 
    } 
} 

在Spring XML配置的情況下,你可以在你的<bean>定義中使用init-method="init"代替@PostConstruct。或者,您可以使用xml中的構造函數注入:

<bean id="myBean" class="my.package.MyBean"> 
    <constructor-arg ref="myDependency/> 
</bean> 

或註解等效項。

+0

呀使用@PostConstruct可以是溶液改用構造 – 2011-12-29 15:44:12

+0

作爲附加的事實,'@ PostConstruct'甚至可以在一個'private' init方法中使用。將init方法設置爲私有可見性可能對於有一個乾淨,整潔的公共API有用。 (請參閱http://docs.oracle.com/javaee/6/api/javax/annotation/PostConstruct.html) – Abdull 2013-01-31 01:14:43

相關問題