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);
}
posted @   站着说话不腰疼  阅读(540)  评论(0编辑  收藏  举报
编辑推荐:
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
阅读排行:
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· 字符编码:从基础到乱码解决
· Open-Sora 2.0 重磅开源!
点击右上角即可分享
微信分享提示