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

Is there a way to call a method in a bean after all spring context is initialized

我有一个问题,这是它的要点:(循环中涉及更多 类 但可以这样表示)

@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 并更改设计、逻辑和业务需要一个漫长的过程来询问它由其他团队完成。

我不明白你为什么首先要使用 serviceDispatcher。您可以尝试直接将 BeanB 注入 BeanA:

@Service
public class BeanA{
   private BeanB beanB;

   @Autowired
   public BeanA(BeanB b){
      beanB = b;
      beanB.someMethod();
   }
}

您必须订阅 ContextRefreshedEvent 事件才能在 spring 上下文完全初始化后执行您的代码。

@Component
class N51348516 implements ApplicationListener<ContextRefreshedEvent> {

    @Override
    public void onApplicationEvent(ContextRefreshedEvent event) {
        System.out.println(event.getApplicationContext());
    }
}

但我想您真正需要的是使用 @Lazy 批注让您的 bean 变得惰性,以便您能够正确访问它们。

对于classBeanA,添加注解@DependsOn("beanB")