Spring boot SpringBoot,如何在Servlet3.0环境中手动启动它
我有以下问题。我在Servlet2.5容器中有一个spring引导配置,在专门的安全上下文/特权操作上下文中有一个手动启动。因此,从spring boot legacy提供的内容开始,我实现了自己的ContextLoaderListener,并将其连接到web.xml中:Spring boot SpringBoot,如何在Servlet3.0环境中手动启动它,spring-boot,Spring Boot,我有以下问题。我在Servlet2.5容器中有一个spring引导配置,在专门的安全上下文/特权操作上下文中有一个手动启动。因此,从spring boot legacy提供的内容开始,我实现了自己的ContextLoaderListener,并将其连接到web.xml中: public class SecurityContextLoaderListener extends ContextLoaderListener { @Override public void contextInitia
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与SpringBoot遗留版提供的基本相同
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;
}
public WebApplicationContext initSpringBoot(最终ServletContext ServletContext){
字符串configLocationParam=servletContext.getInitParameter(“contextConfigLocation”);
SpringApplicationBuilder=new SpringApplicationBuilder((对象[])StringUtils.tokenizeToStringArray(configLocationParam,,;\t\n”);
Class contextClass=this.determineContextClass(servletContext);
builder.contextClass(contextClass);
builder.initializer(新的ApplicationContextInitializer[]{new ApplicationContextInitializer(){
公共void初始化(GenericWebApplicationContext应用上下文){
applicationContext.setServletContext(servletContext);
}
}});
WebApplicationContext上下文=(WebApplicationContext)builder.run(新字符串[0]);
servletContext.setAttribute(WebApplicationContext.ROOT\u WEB\u APPLICATION\u CONTEXT\u属性,CONTEXT);
返回上下文;
}
现在我的问题是,从长远来看,我必须迁移到Servlet3.0环境中,在那里spring引导会自动初始化,因此我无法在自己的安全上下文中手动启动spring和spring引导。有没有办法在Servlet3.0环境中禁用spring/spring引导的自动启动,这样我仍然可以在自己的安全上下文中启动整个spring环境?我在源代码中找不到由servlet 3.0容器的注释扫描机制触发spring初始化和spring引导初始化的任何起点。对于在servlet 3.0容器中自动启动的spring引导应用程序,您需要向应用程序添加
SpringBootServletInitializer
子类
有没有办法在Servlet3.0环境中禁用spring/spring引导的自动启动
是的,不要在应用程序中添加
SpringBootServletInitializer
子类。只需添加最后一个答案即可
要启动SpringWeb自动配置,您必须从SpringWeb中删除SpringServletContainerInitializer及其关联的配置文件。
看来没有别的办法了
Spring应该将所有的自动配置机制移动到一个单独的模块中,这样它就不会对每个人强制执行自动配置。总会有一些不起作用的极端情况(比如我的情况,它在容器引导期间强制执行安全上下文)
不管怎样。我使用Maven shade插件删除ServletContextInitializers和指向初始值设定项的服务文件。然后我在自己的安全上下文中使用了SpringBootLegacy或从legacy到BootstrapSpring派生的自己的启动代码
以下是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>
org.apache.maven.plugins
maven阴影插件
2.4.3
包裹
阴凉处
springframework:springweb
org/springframework/web/SpringServletContainerInitializer.class
META-INF/services/javax.servlet.ServletContainerInitializer
诀窍是将SpringWeb从SpringBootWeb中排除,并添加您自己的着色依赖项。这样,您将摆脱SpringWeb的讨厌的自动启动。
对于引导,最简单的方法是使用spring boot legacy,这也适用于servlet 3.0系统。首先,感谢您的快速回答,我将试一试,但我不确定这是否有效,因为据我所知,spring仍然自动启动扫描SpringBootServletInitializer。我甚至想禁用spring autostart并自己启动它。好吧,回答我自己的问题,我可能必须以某种方式关闭SpringServletContainerInitializer。再次感谢您的帮助。为什么您需要为此扩展
ContextLoaderListener
?普通的ServletContextListener
将与覆盖ContextLoaderListener
的整个行为一样有效。对于Spring Boot,找到SpringBootServletilizer
,对其进行扩展,覆盖启动时的方法,并在那里执行您现在在contextInitialized
方法中执行的操作。我想这应该同样有效。