
Spring Boot 应用启动后立即退出,是因为错误地使用了传统 Spring 的 ClassPathXmlApplicationContext,而非 SpringApplication.run();后者会自动启动嵌入式 Web 容器(如 Tomcat),保持进程运行并监听端口(默认 8080)。
spring boot 应用启动后立即退出,是因为错误地使用了传统 spring 的 `classpathxmlapplicationcontext`,而非 `springapplication.run()`;后者会自动启动嵌入式 web 容器(如 tomcat),保持进程运行并监听端口(默认 8080)。
你当前的 main 方法:
@SpringBootApplication
public class WebSpringDemoApplication {
public static void main(String[] args) {
ClassPathXmlApplicationContext applicationContext =
new ClassPathXmlApplicationContext("spring-config.xml");
}
}本质上并未启动 Spring Boot 应用上下文,而只是初始化了一个传统的、非 Web 的 Spring XML 容器。该容器在完成 Bean 创建(触发 init-method="init")后即结束生命周期,JVM 无任何守护线程维持运行,因此进程自然退出——这正是你看到 Init 输出后立即显示 Process finished with exit code 0 的根本原因。
✅ 正确做法:使用 SpringApplication.run() 启动 Spring Boot 全栈应用:
@SpringBootApplication
public class WebSpringDemoApplication {
public static void main(String[] args) {
SpringApplication.run(WebSpringDemoApplication.class, args);
}
}此调用将:
- 自动加载
@SpringBootApplication注解配置(含@ComponentScan、@Configuration、@EnableAutoConfiguration); - 启动嵌入式 Servlet 容器(如
TomcatEmbeddedServletContainerFactory); - 绑定到默认端口
8080(可通过application.properties修改:server.port=9090); - 保持主线程阻塞,持续响应 HTTP 请求。
⚠️ 注意事项:
-
勿混用 XML 配置与 Spring Boot 自动配置:虽然 Spring Boot 支持
@ImportResource("spring-config.xml")加载旧 XML,但应优先使用 Java Config(@Bean方法)或属性驱动配置,以保障自动装配(如WebMvcAutoConfiguration)正常生效; - 若需在应用就绪后执行自定义逻辑(如预热缓存、连接外部服务),推荐使用事件驱动方式,而非在
main中硬编码:
@Component
public class StartupRunner implements ApplicationRunner {
@Override
public void run(ApplicationArguments args) throws Exception {
System.out.println("✅ Application is fully ready!");
// 执行初始化任务
}
}或监听 ApplicationReadyEvent(需注册为 Bean):
@Component
public class ReadyEventListener {
@EventListener
public void handleApplicationReady(ApplicationReadyEvent event) {
System.out.println("? Web server is up at http://localhost:8080");
// 例如:启动定时任务、触发健康检查等
}
}? 总结:Spring Boot 的核心价值在于“约定优于配置”和开箱即用的 Web 能力。放弃手动管理 ApplicationContext,拥抱 SpringApplication.run(),才能真正激活其自动配置、嵌入式容器、Actuator 等关键特性。启动后访问 http://localhost:8080/actuator/health 即可验证服务是否持续运行。


















