1. 概述

本文将快速介绍 SpringBootServletInitializer 的核心概念。

这个类是 WebApplicationInitializer 的扩展,专门用于在传统 WAR 部署模式下运行 Spring Boot 应用。它负责将应用上下文中的 ServletFilterServletContextInitializer 绑定到服务器。

通过继承 SpringBootServletInitializer,我们还能在 Servlet 容器启动时自定义应用配置——只需重写 configure() 方法即可。

2. SpringBootServletInitializer 实战

来看一个实际案例:主类继承 Initializer 的典型写法。

我们的 @SpringBootApplicationWarInitializerApplication 做了三件事:

  1. 继承 SpringBootServletInitializer
  2. 重写 configure() 方法
  3. 通过 SpringApplicationBuilder 注册自身为配置类
@SpringBootApplication
public class WarInitializerApplication extends SpringBootServletInitializer {

    @Override
    protected SpringApplicationBuilder configure(
      SpringApplicationBuilder builder) {
        return builder.sources(WarInitializerApplication.class);
    }

    public static void main(String[] args) {
        SpringApplication sa = new SpringApplication(
          WarInitializerApplication.class);
        sa.run(args);
    }

    @RestController
    public static class WarInitializerController {

        @GetMapping("/")
        public String handler() {
           // ...
        }
    }
}

关键点

  • 当打包成 WAR 时,可直接部署到任意 Web 容器,configure() 中的逻辑会自动执行
  • 若打包成 JAR,需在 main() 方法中补充相同逻辑,确保嵌入式容器能正确加载

⚠️ 踩坑提示:忘记在 main() 方法中补充配置会导致 JAR 模式启动异常

3. 总结

本文介绍了 SpringBootServletInitializer 的核心作用,并演示了如何通过它实现传统 WAR 部署。这种方案特别适合需要兼容遗留容器(如 Tomcat 7)的场景。

完整示例代码可在 GitHub 获取(Maven 项目,开箱即用)。


原始标题:A Quick Intro to the SpringBootServletInitializer

« 上一篇: Java Weekly, 第226期
» 下一篇: 2018年Java生态现状