在所有spring上下文初始化之后,有没有办法在Bean中调用方法

时间:2018-07-15 12:45:05

标签: java spring dependency-injection postconstruct

我有一个问题,这就是要点:(循环中涉及更多类,但是可以用这种方式表示)

@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,并且更改设计,逻辑和业务需要花很长时间才能完成其他团队。

3 个答案:

答案 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.