给出以下代码:
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
答案 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 ...
}
}