就可以访问接口了"/>
为什么ApplicationRunner都没有执行完成,浏览器就可以访问接口了
在Spring Boot中,ApplicationRunner
或 CommandLineRunner
接口实现类中定义的 run
方法是在 Spring 应用上下文加载完毕后、且所有 Spring Bean
都被初始化之后才会执行。这通常是应用启动过程中的最后一步。
但是,Spring Boot 启动过程是异步的,特别是当嵌入式容器(如 Tomcat)已经启动并准备好接受HTTP请求时,此时 ApplicationContext
可能还没有完全完成刷新过程。因此,即使 ApplicationRunner
和 CommandLineRunner
中的代码尚未运行,HTTP端点可能也已经对外服务了。
换句话说,Spring Boot的自动配置和容器初始化是非阻塞性的,一旦嵌入式服务器初始化完成并且端口被监听,Spring Boot就开始接收HTTP请求,而不需要等待所有的 ApplicationRunner
或 CommandLineRunner
执行完成。这是为了尽快让应用程序可以响应用户请求。
在某些情况下,如果你的 ApplicationRunner
或 CommandLineRunner
中包含了关键的应用初始化逻辑,比如预热缓存、检查系统依赖或者数据库迁移等,你可能希望这些操作在应用开始接收HTTP请求前完成。
针对这种逻辑,你可以使用SmartLifecycle,具体可以看一下别人写的这篇博客:Lifecycle和SmartLifecycle的正确使用姿势-CSDN博客
更多推荐
为什么ApplicationRunner都没有执行完成,浏览器就可以访问接口了
发布评论