通过继承SpringBootServletInitializer创建一个可执行war(比如,在一个名为Application的类中),然后添加Spring Boot的注解,示例:

    记住不管你往sources放什么东西,它仅是一个Spring ApplicationContext,正常情况下,任何生效的在这里也会起作用。有一些beans你可以先移除,然后让Spring Boot提供它的默认实现,不过有可能需要先完成一些事情。

    美妙的(Vanilla usage of)Spring 和Spring Security不需要改变。如果你的应用有其他特性,比如使用其他servlets或filters,那你可能需要添加一些配置到你的Application上下文中,按以下操作替换web.xml的那些元素:

    • 在容器中安装一个ServletServletRegistrationBean类型的@Bean,就好像web.xml中的<servlet/><servlet-mapping/>
    • 同样的添加一个FilterFilterRegistrationBean类型的(类似于<filter/>和)。

    一旦war可以使用,我们就通过添加一个main方法到Application来让它可以执行,比如:

    1. public static void main(String[] args) {
    2. SpringApplication.run(Application.class, args);
    • 没有web.xml的Servlet 3.0+应用
    • 有web.xml的应用
    • 没有上下文层次的应用

    所有这些都可以进行适当的转化,但每个可能需要稍微不同的技巧。

    Servlet 3.0+的应用转化的相当简单,如果它们已经使用Spring Servlet 3.0+初始化器辅助类。通常所有来自一个存在的WebApplicationInitializer的代码可以移到一个SpringBootServletInitializer中。如果一个存在的应用有多个ApplicationContext(比如,如果它使用AbstractDispatcherServletInitializer),那你可以将所有上下文源放进一个单一的。你遇到的主要难题可能是如果那样不能工作,那你就要维护上下文层次。参考示例entry on building a hierarchy。一个存在的包含web相关特性的父上下文通常需要分解,这样所有的ServletContextAware组件都处于子上下文中。