Spring发生 ApplicationContext has not been refreshed yet 错误的场景为:

在Spring容器初始化时发生异常,此时 Spring还没有执行 destroy(该方法中会执行 close()->doClose()) 方法时尝试去获取Bean时会出现这个问题。因为在Spring容器初始化时发生异常 Spring会在catch块中捕捉异常然后调用 cancelRefresh方法,这个方法中会将 AbstractApplicationContext.active 设为 false,Spring在尝试进行获取 Bean 时会进入AbstractApplicationContext.assertBeanFactoryActive 方法,这个方法会校验 active 的值,如果为false 则会校验AbstractApplicationContext.closed 的值,如果 close 也为 true 的话就抛出has been closed already 异常,否则抛出 has not been refreshed yet 的异常。close 在执行 AbstractApplicationContext.doClose 方法中会被设为 true 。

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐