首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Spring-Boot,如何在servlet 3.0环境中手动启动

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

Stack Overflow用户
提问于 2016-02-19 17:54:06
回答 2查看 940关注 0票数 0

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

代码语言:javascript
复制
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提供的相同。

代码语言:javascript
复制
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 boot。有没有办法在Servlet3.0环境中禁用spring/ spring -boot的自动启动,这样我仍然可以在自己的安全上下文中启动整个spring环境?我在源代码中找不到任何由Servlet3.0容器的注释扫描机制触发spring初始化和spring引导初始化的起点。

EN

回答 2

Stack Overflow用户

发布于 2016-02-19 19:31:43

为了让Spring Boot应用程序在Servlet3.0容器中自动启动,您需要向应用程序添加一个SpringBootServletInitializer子类。

有没有办法在Servlet3.0环境中禁用spring/spring-boot的自动启动

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

票数 0
EN

Stack Overflow用户

发布于 2016-02-20 03:38:49

我只想给这个问题加上最后一个答案。

要关闭spring-web自动配置,您肯定必须从spring web中删除SpringServletContainerInitializer及其相关的配置文件。似乎没有任何其他方法。

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

无论哪种方式。我使用Maven shade插件删除了ServletContextInitializers和指向初始化器的服务文件。然后,我在自己的安全上下文中使用spring-boot-legacy或从遗留中派生的我自己的启动代码来引导spring。

下面是shade插件的入口:

代码语言:javascript
复制
   <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,这也适用于Servlet3.0系统。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35502284

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档