构造函数中的依赖注入

Ahm*_*DAL 6 java jsf spring dependency-injection

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

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

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

mre*_*isz 5

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

class MyBean {
  @Inject 
  private MyDependency myDep;

  @PostConstruct
  public void init() {
    assert myDep != null;
  }
}
Run Code Online (Sandbox Code Playgroud)

如果是 spring xml 配置,您可以在定义中使用init-method="init"而不是使用。或者,您可以在 xml 中使用构造函数注入:@PostConstruct<bean>

<bean id="myBean" class="my.package.MyBean">
  <constructor-arg ref="myDependency/>
</bean>
Run Code Online (Sandbox Code Playgroud)

或等效注释。


JB *_*zet 4

显然,如果对象不存在,则不可能向该对象注入任何内容。为了存在,必须构造一个对象。

Spring支持构造函数注入:

@Autowired
public SomeService(SomeDependency dep) {
    ...
Run Code Online (Sandbox Code Playgroud)

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

不知道JSF怎么样。