2011-12-29 173 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

相关问题