Spring-Boot,如何在servlet 3.0环境中手动启动它

时间:2016-02-19 09:54:06

标签: spring-boot

我有以下问题。我在servlet 2.5容器中有一个spring boot配置,它在一个专门的安全上下文/特权操作上下文中有一个手动启动。所以从spring-boot-legacy提供的开始,我已经实现了我自己的ContextLoaderListener并将其连接到web.xml:

public class SecurityContextLoaderListener extends ContextLoaderListener {

@Override
  public void contextInitialized(final ServletContextEvent servletContextEvent) {

     SecurityContextAction action =  new SecurityContextAction() {
       public Object run() throws Exception {

         initSpringBoot(servletContextEvent);
         return null;
     }
  };
  SecurityContextHelper.runAction(action);

因此,有一个特殊的非Spring安全上下文,由我必须部署的底层环境强制执行。 initSpringBoot与spring-boot-legacy提供的基本相同。

public WebApplicationContext initSpringBoot(final ServletContext servletContext) {
    String configLocationParam = servletContext.getInitParameter("contextConfigLocation");
    SpringApplicationBuilder builder = new SpringApplicationBuilder((Object[]) StringUtils.tokenizeToStringArray(configLocationParam, ",; \t\n"));
    Class contextClass = this.determineContextClass(servletContext);
    builder.contextClass(contextClass);
    builder.initializers(new ApplicationContextInitializer[]{new ApplicationContextInitializer<GenericWebApplicationContext>() {
        public void initialize(GenericWebApplicationContext applicationContext) {
            applicationContext.setServletContext(servletContext);
        }
    }});
    WebApplicationContext context = (WebApplicationContext)builder.run(new String[0]);
    servletContext.setAttribute(WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE, context);
    return context;
}

现在我的问题是我必须长时间移动到一个Servlet 3.0环境,其中spring boot自动初始化,因此我无法启动spring并在我自己的安全上下文中手动Spring启动。有没有办法在servlet 3.0环境中禁用spring / spring-boot的自动启动,这样我仍然可以在我自己的安全上下文中启动整个spring环境?在servlet 3.0容器的注释扫描机制触发弹簧初始化和弹簧启动初始化的源代码中,我找不到任何起点。

2 个答案:

答案 0 :(得分:0)

要在Servlet 3.0容器中自动启动Spring Boot应用程序,您需要在应用程序中添加SpringBootServletInitializer子类。

  

有没有办法在servlet 3.0环境中禁用spring / spring-boot的自动启动

是的,不要在您的应用程序中添加SpringBootServletInitializer子类。

答案 1 :(得分:0)

只是为此添加最后一个答案。

要打开spring-web自动配置,你必须从spring web中删除SpringServletContainerInitializer及其相关的配置文件。 似乎没有任何其他方式。

Spring应该将所有autoconfig机制移动到一个单独的模块中,这样它就不会对每个人强制执行自动配置。总是会出现无法工作的极端情况(就像我在容器引导期间强制执行安全上下文一样)。

无论哪种方式。我使用Maven shade插件删除ServletContextInitializers和指向初始化程序的服务文件。然后我使用了spring-boot-legacy或者我自己的启动代码,这些代码来自我自己的安全环境中的boot springst。

这是shade插件条目:

   <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-shade-plugin</artifactId>
            <version>2.4.3</version>
            <configuration>

            </configuration>
            <executions>
                <execution>
                    <phase>package</phase>
                    <goals>
                        <goal>shade</goal>
                    </goals>
                    <configuration>
                        <filters>
                        <filter>
                            <artifact>org.springframework:spring-web</artifact>
                            <excludes>
                                <exclude>org/springframework/web/SpringServletContainerInitializer.class</exclude>
                                <exclude>META-INF/services/javax.servlet.ServletContainerInitializer</exclude>
                            </excludes>
                        </filter>
                        </filters>
                    </configuration>
                </execution>
            </executions>
        </plugin>
    </plugins>

然后诀窍是从spring-boot-web中排除spring-web并添加自己的着色依赖项。这样你就可以摆脱spring-web的讨厌的自动启动。 对于bootstrapping,最简单的方法是使用spring-boot-legacy,这也适用于servlet 3.0系统。