【问题标题】:Importance of SpringBootServletInitializer in the WAR deploymentSpringBootServletInitializer在WAR部署中的重要性
【发布时间】:2020-01-15 02:22:45
【问题描述】:

我通过一些教程了解到ApplicationContext 负责管理在spring 应用程序中创建的所有bean。当将 WAR 部署到 servlet 容器时,必须扩展 SpringBootServletInitializer 并从它说的文档中 一个固执己见的 WebApplicationInitializer 从传统的 WAR 部署运行 SpringApplication。将 Servlet、Filter 和 ServletContextInitializer bean 从应用程序上下文绑定到服务器

有人可以帮我理解上面这行的意思吗? ServletContext 初始化器如何与 SpringBootServletInitializer 相关?为什么 servlet 容器不能自己创建 ServletContext ?如果是这种情况,我们如何在使用 SpringBootServletInitializer 后获取 Tomcat 以编程方式创建的 SpringApplication 的 ServletContext 引用?

【问题讨论】:

    标签: spring spring-boot


    【解决方案1】:

    当您运行嵌入式应用程序服务器时,Web 应用程序使用静态主入口点。主入口点通常如下所示:

    public static void main(final String[] args) {
        SpringApplication.run(Application.class, args);
    }
    

    或者这个:

    public static void main(final String[] args) {
        SpringApplication   springApplication   = new SpringApplicationBuilder(Application.class)
            .properties("spring.main.banner-mode=log")
            .build();
    
        springApplication.run(args);
    }
    

    两者都使用 SpringApplication.run 方法来扫描、配置和运行 Web 应用程序。

    静态 main 对应用服务器没有任何意义。相反,我们添加了一个 SpringBootServletInitializer 实现,该实现依次实现了 WebApplicationInitializer 接口。

    要在 Servlet 3.0+ 环境中实现的接口,以便以编程方式配置 ServletContext -- 与传统的基于 web.xml 的方法相反(或可能结合使用)。

    这个 SPI 的实现将被 SpringServletContainerInitializer 自动检测到,它本身由任何 Servlet 3.0 容器自动引导。有关此引导机制的详细信息,请参阅其 Javadoc。

    SpringServletContainerInitializer 由 Servlet 3.0+ 容器引导并执行 WebApplicationInitializer.onStartup(ServletContext context) 方法来配置 ServletContext。

    1. 我们实现 SpringServletContainerInitializer 来定义要运行的 SpringApplication[s]。
    2. 应用服务器可以自己创建ServletContext,只是不能自己配置ServletContext。
    3. 为什么要访问 ServletContext? Spring 将为您处理配置。

    【讨论】:

      猜你喜欢
      • 2018-06-11
      • 2017-04-03
      • 1970-01-01
      • 2015-05-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-26
      • 2016-04-29
      相关资源
      最近更新 更多