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

时间:2016-02-16 08:52:19

标签: spring spring-boot

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

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

3 个答案:

答案 0 :(得分:0)

来自Spring Boot docs

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

是的,这是可能的,但您需要将其转换为SpringBootServletInitializer,这似乎非常相似。

答案 1 :(得分:0)

答案 2 :(得分: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   接口。单一的onStartup方法提供了对   ServletContext,并且,如果需要,可以轻松地用作ServletAdapter   现有的WebApplicationInitializer。

     

扫描Servlet,过滤器和侦听器

     

使用嵌入式时   容器,自动注册带注释的类   可以使用以下方式启用@ WebServlet,@ WebFilter和@WebListener   @ServletComponentScan。

     

[提示] @ServletComponentScan在独立容器中无效,   而是使用容器的内置发现机制。

我已经尝试过了。有效

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