全部,
我正在使用依赖注入等设置 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() 时,当 bar 为 null 时,在迭代 FooSubclass2 的实例时会抛出一个空点。
值得注意的是,如果我不使用 InitializingBean 作为启动标记,我不会遇到这个问题。如果我只是等待应用程序加载然后遍历 Foos 的集合,一切都很好。因此,时间似乎存在某种问题—— FooSubclass2 的实例已创建 bean 并将其添加到上下文中,但没有完全注入 bean。
我对 spring 的理解是,给定对象应该在添加到上下文之前完全创建/注入,并且 AfterPropertiesSet 应该只在满足所有依赖项后运行。因此,我不确定从哪里开始调试此问题。
一些注意事项:我在 Groovy+Grails 设置上运行它,但我认为这与问题无关。封面下的所有核心弹簧,这显然是在弹簧级别发生的事情。此外,上面的示例与我的真实示例相比有些笨拙。我将几十个 DAO 类型对象的集合注入到 Autowired 集合中。注入成功地通过了几个 DAO,但总是在同一个 DAO 上失败。如果我从列表中删除该 DAO,它将在列表中的下一个上失败。