6、springboot继承SpringBootServletInitializer获取上下文
springboot继承SpringBootServletInitializer获取上下文
springboot通过继承SpringBootServletInitializer来对tomcat容器启动,重新configure方法,
正常通过
SpringContextUtil.setApplicationContext(builder.context());获取上下文
/** 继承SpringBootServletInitializer,重写configure,表示使用外部tomcat */
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
// 此处指向当前工程main方法执行的启动类
// 使用外置tomcat时,需在此处添加监听,用于加载配置文件后解密
builder.application().addListeners(new AfterConfigListener());
// 再放入ApplicationContext
SpringContextUtil.setApplicationContext(builder.context());
return builder.sources(GatewayApplication.class);
}
SpringContextUtil:
import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
public class SpringContextUtil{
/**
* 上下文对象实例
*/
private static ApplicationContext applicationContext;
public static void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
SpringContextUtil.applicationContext = applicationContext;
}
/**
* 获取applicationContext
*/
public static ApplicationContext getApplicationContext() {
return applicationContext;
}
/**
* 通过name获取bean
*/
public static Object getBean(String name){
return getApplicationContext().getBean(name);
}
/**
* 通过class获取bean
*/
public static <T> T getBean(Class<T> clazz){
return getApplicationContext().getBean(clazz);
}
/**
* 通过name和clazz返回指定的Bean
*/
public static <T> T getBean(String name,Class<T> clazz){
return getApplicationContext().getBean(name, clazz);
}
}
通过SpringApplicationBuilder.context()获取的上下文为空的
解决方案:通过重写onStartup方法:
/** 继承SpringBootServletInitializer,重写onStartup,获取上下文对象**/
@Override
public void onStartup(ServletContext servletContext) throws ServletException {
/* SpringBootServletInitializer 中 onStartup 实现代码*/
this.logger = LogFactory.getLog(getClass());
WebApplicationContext rootAppContext = createRootApplicationContext(
servletContext);
if (rootAppContext != null) {
servletContext.addListener(new ContextLoaderListener(rootAppContext) {
@Override
public void contextInitialized(ServletContextEvent event) {
// no-op because the application context is already initialized
}
});
}
else {
this.logger.debug("No ContextLoaderListener registered, as createRootApplicationContext() did not return an application context");
}
/* SpringBootServletInitializer 中 onStartup 实现代码*/
/* 获取上下文 */
SpringContextUtil.setApplicationContext(rootAppContext);
}

浙公网安备 33010602011771号