我有一个问题,这就是它的要点:(循环中涉及更多类,但可以用这种方式表示)
@service
public class serviceDispatcher{
@Autowired
private BeanA a;
@Autowired
private BeanB b;
public BeanA getBeanA(){
return a;
}
public BeanB getBeanB(){
return b;
}
}
@Service
public class BeanA{
@Autowired
ServiceDispatcher sd;
@PostConstruct
private void init(){
sd.getBeanB().method;
}
}
很明显我得到了一个空指针,因为 BeanB b 尚未解析。我也使用了afterPropertiesSet,它是一样的。我的问题是,是否有一种方法可以在整个上下文初始化后运行 init() 方法,这样我就不会得到这个空指针?我知道这种循环依赖很麻烦,需要解决,但我只是重构一个巨大的项目来使用 Spring DI,改变设计、逻辑和业务需要一个漫长的过程,要求它完成其他团队。
最佳答案
您必须订阅ContextRefreshedEvent事件以便在 Spring 上下文完全初始化后执行您的代码。
@Component
class N51348516 implements ApplicationListener<ContextRefreshedEvent> {
@Override
public void onApplicationEvent(ContextRefreshedEvent event) {
System.out.println(event.getApplicationContext());
}
}
但我想你真正需要的是让你的 bean 变得懒惰 @Lazy注释,以便您能够正确访问它们。
关于java - 有没有办法在所有 spring 上下文初始化后调用 bean 中的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51348516/