延迟暴露

    延迟到 Spring 初始化完成后,再暴露服务 [1]

    触发条件

    在 Spring 解析到 时,就已经向外暴露了服务,而 Spring 还在接着初始化其它 Bean。如果这时有请求进来,并且服务的实现类里有调用 的用法。

    • 请求线程的 applicationContext.getBean() 调用,先同步 singletonObjects 判断 Bean 是否存在,不存在就同步 beanDefinitionMap 进行初始化,并再次同步 singletonObjects 写入 Bean 实例缓存。

    规避办法

    • 强烈建议不要在服务的实现类中有 applicationContext.getBean() 的调用,全部采用 IoC 注入的方式使用 Spring的Bean。
    • 如果实在要调 getBean(),可以将 Dubbo 的配置放在 Spring 的最后加载。
    • 如果不想依赖配置顺序,可以使用 ,使 Dubbo 在 Spring 容器初始化完后,再暴露服务。

    • 基于 Spring 的 ContextRefreshedEvent 事件触发暴露