Spring Boot 2与Spring 5中,何时需手动实例化服务器?
你提到用@SpringBootApplication和主方法就能正常处理请求,这完全没问题——因为Spring Boot的核心就是自动配置,它已经帮你把嵌入式服务器(默认Tomcat,也可以切换Jetty/Undertow)的实例化、启动、绑定上下文这些步骤都封装好了。只有在一些特殊场景下,你才需要手动去实例化服务器,下面列举几个常见的情况:
1. 脱离Spring Boot的纯Spring框架场景
如果你不用Spring Boot,而是基于纯Spring 5(比如只依赖Spring WebFlux)开发响应式应用,这时候没有自动配置的加持,你就得自己手动实例化服务器。比如用WebFlux的ReactorHttpServer或者TomcatHttpServer,手动注册路由函数、绑定上下文,最后调用启动方法。举个简单的例子:
HttpHandler handler = RouterFunctions.toHttpHandler(routes()); ReactorHttpServer server = new ReactorHttpServer(); server.setHandler(handler); server.start().block();
2. 需要完全控制服务器生命周期的场景
如果你的应用有特殊的初始化逻辑,必须在服务器启动前完成;或者需要动态启停服务器(比如根据业务需求随时启动/关闭服务实例);又或者要把Spring响应式应用集成到一个非Spring的现有系统中,这时候手动实例化服务器能让你精准控制服务器的启动时机、配置细节和停止逻辑,而不是交给Spring Boot的自动流程。
3. 定制化的测试场景
在编写集成测试时,有时候你需要一个完全自定义的服务器实例——比如指定特定端口、添加自定义过滤器/拦截器,或者在测试用例执行前后手动启停服务器,而不是依赖Spring Boot Test的自动配置。这种情况下,手动实例化服务器能给你更灵活的测试控制。
4. 特殊的部署场景(比如外部独立服务器)
虽然Spring Boot支持打包成WAR部署到外部Tomcat/Jetty,但如果是响应式WebFlux应用,或者你需要和某些特殊的外部服务器做深度定制集成,可能需要手动编写服务器的启动逻辑,来适配外部服务器的要求(不过这种场景现在已经比较少见,Spring Boot的自动配置基本能覆盖大部分需求)。
总结一下:日常Spring Boot开发中,完全不需要手动实例化服务器,Spring Boot的自动配置已经足够省心。只有当你遇到上面这些特殊场景,需要突破自动配置的限制时,才需要手动处理服务器的实例化。
内容的提问来源于stack exchange,提问作者lapots

