java - 有没有办法在所有 spring 上下文初始化后调用 bean 中的方法

标签 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,改变设计、逻辑和业务需要一个漫长的过程,要求它完成其他团队。

最佳答案

您必须订阅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/

相关文章:

java - 从 MySQL 中检索部分数据的数据

java - 在JAVA中存储格式化名称的数组?

java - 在端口 11111 上监听 * 地址

java - 如何使用WebClient执行同步请求?

design-patterns - 掌握创建者与依赖注入(inject)

azure - 作为 Azure Web 作业运行时的托管服务范围

java - 如何重写 JFrame 中的 windowsClosing 事件

eclipse - jpa存储库保存方法返回的ID与插入数据库的ID不同

java - 如何在 Spring 中为 Autowiring 指定默认 bean?

c# - 这可以被视为依赖注入(inject)的一种简单形式吗?