首页 文章

将Spring Web应用程序迁移到Spring Boot

提问于
浏览
0

我有一个web项目,我很容易在tomcat上解码它 . 事实上,我有一个实现 WebApplicationInitializerWebAppInitializer 类(这个类真的很胖),因为你知道每个支持servlet 3.0的应用服务器,它都可以轻松检测到它并尝试启动它 . 现在我想知道可以使用spring boot starter并且没有任何进一步的配置,我将 WebAppInitializer 传递给它并根据我的项目启动Spring引导?

我只想使用spring-boot的方法在Tomcat上部署应用程序,我不想使用其他spring-boot的工具 .

3 回答

  • 0
  • 0

    来自Spring Boot docs

    如果Servlet 3.0应用程序已经使用了Spring Servlet 3.0初始化程序支持类,它们可能很容易翻译 . 通常,现有WebApplicationInitializer中的所有代码都可以移动到SpringBootServletInitializer中 . 如果您的现有应用程序具有多个ApplicationContext(例如,如果它使用AbstractDispatcherServletInitializer),那么您可以将所有上下文源压缩到单个SpringApplication中 . 您可能遇到的主要复杂因素是,如果这不起作用,您需要维护上下文层次结构 . 有关示例,请参阅构建层次结构的条目 . 通常需要拆分包含特定于Web的功能的现有父上下文,以便所有ServletContextAware组件都位于子上下文中 .

    所以,是的,它是可能的,但你需要将它转换为SpringBootServletInitializer,这似乎非常相似 .

  • 0

    是的,这是一个老问题 . 但我没有看到接受的答案,而最接近工作的答案只有一个外部资源的链接 . 所以这就是 .

    https://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#boot-features-embedded-container-context-initializer

    28.4.2 Servlet上下文初始化嵌入式servlet容器不直接执行Servlet 3.0 javax.servlet.ServletContainerInitializer接口或Spring的org.springframework.web.WebApplicationInitializer接口 . 这是一个有意的设计决策,旨在降低设计在战争中运行的第三方库可能会破坏Spring Boot应用程序的风险 . 如果需要在Spring Boot应用程序中执行servlet上下文初始化,则应注册实现org.springframework.boot.web.servlet.ServletContextInitializer接口的bean . 单个onStartup方法提供对ServletContext的访问,如果需要,可以轻松地用作现有WebApplicationInitializer的适配器 . 扫描Servlet,过滤器和侦听器使用嵌入式容器时,可以使用@ServletComponentScan启用使用@WebServlet,@ WebFilter和@WebListener注释的类的自动注册 . [Tip] @ServletComponentScan在独立容器中没有任何效果,而是使用容器的内置发现机制 .

    我试过了 . 有用

    在我的用例中,我的项目包含几十个webapps,设计为在Tomcat上作为WAR运行 . 很多逻辑都巧妙地制作成了WebApplicationInitializers,似乎应该有一种更简单的方法来重用所有这些 . 将 implements ServletContextInitializer 添加到这些初始化程序并通过 @Configuration 类将它们作为bean公开,使用SpringBoot的嵌入式Tomcat点亮了我的Web服务器 .

相关问题