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); }
标签:
springboot
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 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 重磅开源!