Spring核心应用中SpringMain类部署beans/springContext使用何种服务器?
嘿,这个问题得先掰扯清楚几个关键点,避免混淆:
首先要明确:Spring核心框架本身并不自带内置服务器。它本质上是个负责Bean管理、依赖注入的框架,只专注于创建和维护Spring上下文(ApplicationContext),本身没有处理网络请求、提供Web服务的服务器能力。
分场景来说:
纯Spring核心应用(非Web场景):
如果你写的SpringMain类只是用来启动普通的Spring上下文(比如加载一些业务Bean做后台任务),那根本不需要服务器!它就是个普通的Java程序,通过main方法直接初始化Spring上下文,运行在JVM上就行。举个简单例子:public class SpringMain { public static void main(String[] args) { // 初始化基于注解的Spring上下文 ApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class); // 获取Bean并使用 MyService service = context.getBean(MyService.class); service.doSomething(); } }这种情况下,完全没有服务器参与,就是JVM运行普通Java程序。
传统Spring Web应用(非Spring Boot):
如果是Web场景(要处理HTTP请求),传统Spring Web需要依赖外部的Servlet容器来部署,比如Tomcat、Jetty或者Undertow。这时候SpringMain一般不是直接启动服务器的类,你会通过WebApplicationInitializer实现类或者web.xml配置ContextLoaderListener,让外部容器来加载Spring上下文,容器本身负责处理Web请求。Spring Boot Web应用:
要是你用的是Spring Boot(它封装了Spring核心+Web组件),那情况就不一样了——Spring Boot默认集成了嵌入式的Tomcat(也可以配置切换成Jetty或Undertow)。这时候你的SpringMain类(带@SpringBootApplication注解的那个)里的main方法调用SpringApplication.run(),会自动启动嵌入式服务器,同时加载Spring上下文,把Web相关的Bean部署到这个嵌入式服务器上。示例:@SpringBootApplication public class SpringMain { public static void main(String[] args) { SpringApplication.run(SpringMain.class, args); } }
总结一下:
- 纯Spring核心非Web应用:无服务器,直接跑在JVM上
- 传统Spring Web应用:依赖外部Servlet容器(Tomcat/Jetty/Undertow)
- Spring Boot Web应用:默认用嵌入式Tomcat(可切换)承载Spring上下文
内容的提问来源于stack exchange,提问作者Amit

