尧图网站建设 尧图网络
  • 首页
  • 关于我们
  • 服务项目
  • 案例展示
  • 建站流程
  • 资讯中心
  • 联系我们
首页/资讯中心/详情

07.自定义子容器

07.自定义子容器
📅 发布时间:2026/6/19 6:29:31

1.使用监听器传入自定义的子容器

//监听器
public class addWebApplicationContextListener implements ServletContextListener {// 子容器在ServletContext中的唯一标识(全局常量,避免写错)public static final String MVC_CONTEXT_KEY = "SPRING_MVC_CONTEXT";public void contextInitialized(ServletContextEvent sce) {XmlWebApplicationContext mvcContext = null;try {// 创建xml型Web容器(适配传统xml配置)mvcContext = new XmlWebApplicationContext();// 指定子容器的配置文件(resources根目录下的spring-mvc.xml)mvcContext.setConfigLocation("classpath:spring-mvc.xml");// 关联ServletContextmvcContext.setServletContext(sce.getServletContext());// 刷新容器(核心,触发Bean扫描、初始化)mvcContext.refresh();// 将子容器绑定到ServletContext供DispatcherServlet获取sce.getServletContext().setAttribute(MVC_CONTEXT_KEY, mvcContext);} catch (Exception e) { // 捕获异常,避免监听器静默失败e.printStackTrace();throw new RuntimeException("创建Spring MVC子容器失败:" + e.getMessage(), e);}}
}

2.版本一:自定义DispatcherServlet版本:重写FrameworkServlet里的initWebApplicationContext方法

public class CustomDispatcherServlet extends DispatcherServlet {// 自定义标记,确保onRefresh仅执行一次private boolean onRefreshInvoked = false;// 国家之间同步锁,保证onRefresh执行时线程安全private final Object customOnRefreshLock = new Object();protected WebApplicationContext initWebApplicationContext() {// 自定义查找根容器,由ContextLoaderListener创建,否则为nullWebApplicationContext rootContext =WebApplicationContextUtils.getWebApplicationContext(getServletContext());WebApplicationContext mvcContext = null;// 核心:从ServletContext获取监听器创建的子容器mvcContext = (WebApplicationContext) getServletContext().getAttribute(容器唯一标识);// 非空校验,子容器为null直接抛出异常if (mvcContext == null) throw new RuntimeException("获取子容器失败!请检查监听器是否注册");// 为子容器绑定父容器if (mvcContext instanceof XmlWebApplicationContext) {XmlApplicationContext xmlContext = (XmlApplicationContext) mvcContext;if (xmlContext.getParent() == null) xmlContext.setParent(rootContext);}// 调用onRefresh初始化MVC核心组件if (!onRefreshInvoked) synchronized (this.customOnRefreshLock) {onRefresh(mvcContext); // 触发HandlerMapping等组件初始化onRefreshInvoked = true;}// 将子容器绑定到ServletContext供Spring MVC内部全局获取String attrName = FrameworkServlet.SERVLET_CONTEXT_PREFIX + getServletName();getServletContext().setAttribute(attrName, mvcContext);// 返回有效容器供DispatcherServlet使用return mvcContext;}
}

3.版本二:自定义DispatcherServlet版本2:重写init(ServletConfig config)

public class CustomDispatcherServlet2 extends DispatcherServlet {private WebApplicationContext mvcContext;@Overridepublic void init(ServletConfig config) throws ServletException {System.out.println("=====自定义DispatcherServlet初始化");mvcContext = (WebApplicationContext) config.getServletContext().getAttribute(addWebApplicationContextListener.MVC_CONTEXT_KEY);if (mvcContext == null) {new ServletException("获取子容器失败");}System.out.println("获取子容器成功"+mvcContext.getId());super.init(config);//重点,保存ServletConfig对象}@Overrideprotected WebApplicationContext createWebApplicationContext(ApplicationContext parent) {return mvcContext;}//这个方法不用重写,重写它只是为了增强一个日日志功能@Overrideprotected void initStrategies(ApplicationContext context) {super.initStrategies(context); System.out.println("初始化完成,使用子容器");}
}

没有重写 initWebApplicationContext ,会默认调用 findWebApplicationContext() ,从 ServletContext 查找子容器,但是该方法是按照固定的Key( FrameworkServlet.SERVLET_CONTEXT_PREFIX + Servlet名称去找子容器 ),大概率会返回 null ,故而肯定会进入 createWebApplicationContext 方法,返回自定义的子容器。

相关新闻

  • cjw_蓝桥杯python基础学习系列一—_语言基础
  • 测试飞书一面
  • 华三无线集中转发模式配置

最新新闻

  • 2026 赣州防水补漏靠谱服务商盘点:屋面 / 厨卫 / 外墙 / 地下室渗水维修详解,适配赣南多雨山区高湿防水甄选指南 - 宅安选房屋修缮
  • 紧急收藏!2026台州戒网瘾学校TOP5揭晓,纽特心理,军事化管理帮孩子戒网逆袭 - 辛云教育资讯
  • Fluent二维刚体平移运动UDF:基于质心运动宏的动网格控制源码包
  • 吴恩达《深度学习》之看懂 YOLO 目标检测的“鹰眼”直觉
  • 精选10所|2026南京市十大叛逆青少年戒网瘾封闭式管教学校名单,解家长焦虑,助少年归正 - 辛云教育资讯
  • 梯度裁剪:G-Crop革新小样本图像分类

日新闻

  • 5分钟掌握Python进化算法:Geatpy高性能优化工具完全指南
  • Microchip 24AA044 EEPROM选型与应用全指南:从参数解析到实战编程
  • 华为的鸿蒙到底有多牛?为什么称作遥遥领先?

周新闻

  • 3步解锁iOS设备:applera1n激活锁绕过完全指南
  • 39 2026 人工智能证书终极盘点,普通人选 AI 证书可以从这些方向入手
  • Redis 暴露公网有多危险?从端口检查到补救步骤

月新闻

  • 【总结】入门篇:50句话让你记住架构核心概念
  • WeChatMsg技术方案解析:实现Mac微信数据自主管理的完整解决方案
  • WeChatMsg:革新性微信数据备份方案,打造你的专属数字记忆库

关于尧图

  • 公司简介
  • 团队介绍
  • 企业文化
  • 荣誉资质

服务项目

  • 定制开发
  • 电商建站
  • UI 设计
  • 运维服务

快速链接

  • 案例展示
  • 建站流程
  • 常见问题
  • 资讯中心

联系方式

  • 📍北京市朝阳区互联网产业园 A 座 10 层
  • 📞400-888-8888
  • ✉️contact@rkmt.cn
  • 🕐周一至周日 9:00-21:00

© 2024 北京尧图网络科技有限公司 版权所有 | 京 ICP 备 XXXXXXXX 号