Spring @Autowired值未完全初始化

时间:2015-10-29 15:33:21

标签: spring autowired

给出以下代码:

public class MyService implements InitializingBean {

  @Autowired
  private Set<MyDep> allDeps;

  @Override
  public void afterPropertiesSet() {
    ... use 'allDeps' here ...
  }
}

MyDep是一个包含三个不同实现的接口,所有这些实现都实现了InitializingBean(通过扩展相同的抽象基类)。

当我在设置allDeps期间使用MyService时,3个注入实例中只有2个本身已完全初始化。其中一个实例是构造和注入的,但它的afterPropertiesSet()尚未运行。在其他两个实例中,它已经运行。

我的理解是,只有在注入了所有依赖项后,Spring才会在bean上运行afterPropertiesSet(),并且只有在完全初始化后才会注入它们。也许我的理解是错的?这是春天的错误吗?我也尝试使用getBeansOfType(MyDep.class)得到相同的结果。

FWIW,看起来像2年前有一个类似的未回答的问题。那么也许是时候重新问一下了? Spring dependency injection not completing in time

1 个答案:

答案 0 :(得分:0)

鉴于我的bean定义中存在循环依赖关系,解决方案是等待直到创建完整上下文,然后才在MyService中进行初始化。

也许不是最佳解决方案,因为在其设置中依赖于MyService的任何内容都可能存在问题,但我目前还没有任何问题。所以,这似乎对我有用:

public class MyService implements ApplicationListener<ContextRefreshedEvent> {

  @Autowired
  private Set<MyDep> allDeps;

  @Override
  public void onApplicationEvent(ContextRefreshedEvent event) {
    ... now I can use 'allDeps' here ...
  }
}