Spring依赖注入没有及时完成

时间:2012-11-03 16:06:15

标签: spring grails dependency-injection inversion-of-control

所有

我正在使用依赖注入等设置Spring IOC容器。我遇到了一个非常奇怪的行为,似乎集合中的某些bean在使用前完全初始化而其他bean则没有。奇怪的是,所有这些bean共享同一个超类,并且失败的依赖注入发生在一个超类依赖项中。这是一个例子:

@Component
class Bar {
  void doSomething() {
  // do something
  }
}

class Foo {
  @Autowired Bar bar
}

@Component
class FooSubclass1 extends Foo {
}

@Component
class FooSubclass2 extends Foo {
}

@Component
class FooManager implements InitializingBean {
  @Autowried Collection<Foo> myFoos

  void afterPropertiesSet() {
    for (Foo foo : myFoo) {
      foo.bar.doSomething()
    }
  }
}

在启动期间,上面的代码在迭代FooSubclass1的实例时会成功“doSomething”,但在尝试访问bar.doSomething()时迭代FooSubclass2的实例时抛出一个空点,因为bar为null。

值得注意的是,如果我不使用InitializingBean作为启动标记,我就不会遇到这个问题。如果我只是等待应用程序加载然后迭代Foos集合一切都很好。因此,时间似乎存在某种问题--FooSubclass2的实例已经创建并添加到上下文但没有完全注入bean。

我对spring的理解是,在将对象添加到上下文之前应该完全创建/注入给定对象,并且只应在满足所有依赖项之后运行AfterPropertiesSet。因此,我不确定从哪里开始调试此问题。

一些注意事项:我在Groovy + Grails设置上运行它虽然我不认为这与问题有关。这是覆盖下的所有核心弹簧,这显然是在春季水平发生的事情。上面的例子也比我的真实例子有点愚蠢。我正在向Autowired集合中注入几十个DAO类型对象的集合。注入成功通过了几个DAO,但总是在同一个DAO上失败。如果我从列表中删除该DAO,它将在列表中的下一个上失败。

0 个答案:

没有答案