构造函数中的依赖注入

时间:2011-12-29 09:55:24

标签: java spring jsf dependency-injection

假设我有Spring服务类或JSF bean。我将这些类连接到另一个类中。到目前为止没有问题。我可以在任何方法中使用这些注入的字段。

但是,在构造函数中使用它们会给我一个NullPointerException。

构造函数可能在依赖注入发生之前运行,并且它看不到我注入的字段。有没有在构造函数中使用依赖注入的解决方案?

2 个答案:

答案 0 :(得分:4)

不,你不能在构造函数中引用注入的字段。框架必须以某种方式构造您的对象(调用构造函数),然后注入依赖项,以便它们在构造函数执行期间为空。你通常做的是将@PostConstruct注释应用于你的一个方法并在那里执行初始化:

class MyBean {
  @Inject 
  private MyDependency myDep;

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

如果是spring xml配置,您可以在init-method="init"定义中使用@PostConstruct代替<bean>。或者,您可以在xml:

中使用构造函数注入
<bean id="myBean" class="my.package.MyBean">
  <constructor-arg ref="myDependency/>
</bean>

或注释等价物。

答案 1 :(得分:4)

显然,如果此对象不存在,则无法在对象中注入任何内容。要存在,必须构建一个对象。

Spring支持构造函数注入:

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

Spring还支持@PostConstruct,它允许在注入所有依赖项后初始化bean。

不了解JSF。