我有一个问题,这就是要点:(循环中涉及更多类,但是可以用这种方式表示)
@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,并且更改设计,逻辑和业务需要花很长时间才能完成其他团队。
答案 0 :(得分:1)
您必须订阅ContextRefreshedEvent事件,才能在spring上下文完全初始化后执行代码。
@Component
class N51348516 implements ApplicationListener<ContextRefreshedEvent> {
@Override
public void onApplicationEvent(ContextRefreshedEvent event) {
System.out.println(event.getApplicationContext());
}
}
但是我想您真正需要的是使用@Lazy注释使bean变得懒惰,以便您能够正确访问它们。
答案 1 :(得分:0)
我不明白为什么您首先需要使用serviceDispatcher
。您可以尝试将BeanB
直接注入BeanA
:
@Service
public class BeanA{
private BeanB beanB;
@Autowired
public BeanA(BeanB b){
beanB = b;
beanB.someMethod();
}
}
答案 2 :(得分:0)
对于类xn--ngbc5azd.
,添加注释a0.nic.abarth.