Spring和SpringMVC为什么需要父子容器?

大家好,我是力哥。最近不少粉丝问力哥Spring和SpringMVC为什么需要父子容器?今天力哥来总结下,大家可以参考。

2026年,力哥又开始收Java学员了!

在Spring框架中,父子容器的概念对于复杂应用的管理和模块化开发起到了重要的作用。尤其是在Spring MVC这样的Web应用中,合适地使用父子容器可以带来更灵活和高效的应用架构。本文将探讨父子容器的必要性,并通过示例代码进行说明。

什么是父子容器?

在Spring中,应用上下文(ApplicationContext)可以形成层级结构,其中一个上下文可以成为另一个上下文的父容器。子容器可以继承父容器中的bean定义,同时也可以定义自己的特定bean。这种层次结构为管理应用的不同部分提供了一种组织方式,使模块化和重用成为容易的事情。

为什么需要父子容器?

1. 模块化被动的功能

在大型企业应用中,通常会有多个模块(如用户管理、订单处理、支付接口等)。通过父子容器的结构,可以将每个模块放入自己的子容器中,而这些子容器可以共享父容器中的公共bean,这样可以避免代码和配置的重复,提高应用的模块化程度。

2. 限制作用域

通过父子容器,可以在子容器中定义某些bean,使其只在该子容器内可见,而不影响父容器中的bean。这种方法有助于控制bean的作用域,避免因为bean名称冲突而导致的问题。

3. 代码和配置的重用

可以在父容器中定义公共的bean,然后在子容器中引用或覆盖这些bean,实现灵活的配置。例如,父容器中的数据源可以被多个子容器的服务所共享。

示例代码

以下是一个简单的Spring应用示例,展示了如何使用父子容器来管理不同模块的bean。

1. 父容器配置

首先,我们创建一个父容器,定义一些公共的bean。

<!-- parent-context.xml --><beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsd"><bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"><property name="driverClassName" value="com.mysql.jdbc.Driver" /><property name="url" value="jdbc:mysql://localhost:3306/mydb" /><property name="username" value="root" /><property name="password" value="password" /></bean></beans>

2. 子容器配置

接下来,我们定义一个子容器,引用父容器中的数据源并定义特定服务。

<!-- child-context.xml --><beans xmlns="http://www.springframework.org/schema/beans"

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsd"><beans parent="parent-context.xml"/><bean id="userService" class="com.example.service.UserService"><property name="dataSource" ref="dataSource" /></bean></beans>

3. Spring MVC配置

然后,我们可以在Spring MVC的配置中使用上述的父子容器。

<!-- mvc-context.xml --><beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsd"><beans parent="child-context.xml"/><bean id="mvcHandlerMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping"><property name="urlMap"><map><entry key="/user" value-ref="userController"/></map></property></bean><bean id="userController" class="com.example.controller.UserController"><property name="userService" ref="userService" /></bean></beans>4. 启动应用与访问

在应用启动时,我们通过加载mvc-context.xml来初始化整个上下文。用户请求将经过UserController进行处理,UserController依赖的UserService可以使用父容器中的dataSourcebean。

​​​​​​​

public class MyAppInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {@Overrideprotected WebApplicationContext createRootApplicationContext() {AnnotationConfigWebApplicationContext context = new AnnotationConfigWebApplicationContext();context.setParent(getServletApplicationContext());context.scan("com.example"); // 扫描你的bean所在的包return context;}@Overrideprotected WebApplicationContext createServletApplicationContext() {AnnotationConfigWebApplicationContext context = new AnnotationConfigWebApplicationContext();context.register(MvcConfig.class); // 注册Spring MVC配置return context;}@Overrideprotected String[] getServletMappings() {return new String[]{"/"};}}

最后总结下,父子容器架构在Spring和Spring MVC中的使用,提高了模块化开发和管理灵活性的能力,允许开发人员利用共享的bean并将特定的功能模块独立管理。通过示例代码可以看到,父子容器的应用使得应用程序的构建更加整洁和可维护。在实际开发中,随着应用的复杂性增加,合理使用父子容器将为代码的可读性和可复用性提供极大的帮助。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/1194887.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Emotion2Vec+ Large部署卡顿?3步解决显存不足问题实战案例

Emotion2Vec Large部署卡顿&#xff1f;3步解决显存不足问题实战案例 1. 问题背景&#xff1a;语音情感识别系统为何启动缓慢&#xff1f; 你是不是也遇到过这种情况&#xff1a;刚部署完 Emotion2Vec Large 语音情感识别系统&#xff0c;满怀期待地打开 WebUI&#xff0c;结…

cv_resnet18_ocr-detection降本方案:低成本GPU部署节省60%

cv_resnet18_ocr-detection降本方案&#xff1a;低成本GPU部署节省60% 在OCR&#xff08;光学字符识别&#xff09;技术广泛应用的今天&#xff0c;企业对文字检测模型的部署成本越来越敏感。尤其是面对高精度需求时&#xff0c;动辄需要A100、V100等高端GPU资源&#xff0c;导…

自定义表单源码系统如何助力企业实现多场景高效运营

温馨提示&#xff1a;文末有资源获取方式在数字化时代&#xff0c;一个灵活多功能的表单系统能够显著提升企业运营效率和客户满意度。我们介绍的这款自定义表单系统源码&#xff0c;以其通用性和强大功能&#xff0c;成为各行各业实现信息收集、支付处理和预约管理的理想选择。…

基于深度学习的道路交通信号检测系统(YOLOv8+YOLO数据集+UI界面+Python项目源码+模型)

一、项目介绍 摘要 本项目基于YOLOv8深度学习框架&#xff0c;开发了一个高效准确的道路交通信号检测系统&#xff0c;能够识别21类常见的道路交通标志和信号。系统使用精心构建的专用数据集进行训练&#xff0c;包含训练集1376张、验证集488张和测试集229张图像&#xff0c;…

fft npainting lama混合精度训练配置:AMP加速收敛技巧

fft npainting lama混合精度训练配置&#xff1a;AMP加速收敛技巧 1. 引言&#xff1a;图像修复的工程实践与性能优化需求 在图像修复任务中&#xff0c;fft npainting lama 已成为当前主流的开源方案之一。它基于深度卷积网络和傅里叶空间特征建模&#xff0c;在物体移除、水…

十位营销领导者谈2026年哪些将延续,哪些将淘汰,哪些将规模化

2026年&#xff0c;AI普及、信息过载和经济压力迫使企业重塑市场进入策略&#xff0c;从渐进式调整转向精准、有纪律的增长模式。AI成为基础设施&#xff0c;用于优化内部流程和合规&#xff0c;但营销决策仍需人类监督。核心营销本质不变&#xff1a;故事叙述、个性化营销、基…

多功能表单源码系统的核心优势 带完整的搭建部署教程

温馨提示&#xff1a;文末有资源获取方式 在当今线上业务高速发展的环境中&#xff0c;一个能够无缝衔接信息收集、支付与流程管理的工具至关重要。我们诚意向您推荐一款经过深度开发的多功能自定义表单系统源码&#xff0c;它不仅是简单的信息收集工具&#xff0c;更是一个驱动…

unet人像卡通化更新日志:v1.0功能全面解读

unet人像卡通化更新日志&#xff1a;v1.0功能全面解读 1. 功能概述 unet person image cartoon compound人像卡通化工具由科哥开发&#xff0c;基于阿里达摩院 ModelScope 平台的 DCT-Net 模型构建&#xff0c;致力于将真实人物照片高效、自然地转换为卡通风格图像。该工具不…

多功能表单源码系统,解决信息收集、客户预约与线上收款的综合型工具

温馨提示&#xff1a;文末有资源获取方式面对日益增长的在线化需求&#xff0c;企业亟需一款能同时解决信息收集、客户预约与线上收款的综合型工具。我们推出的这款功能全面的自定义表单系统源码&#xff0c;正是为此而生。它集创新性、通用性与易用性于一身&#xff0c;源码获…

如何利用C++23的模块化系统重构百万行代码?真实案例分享

第一章&#xff1a;C23新特性概览与模块化重构的契机C23作为C语言演进的重要里程碑&#xff0c;引入了一系列现代化特性&#xff0c;显著提升了代码的可读性、性能和开发效率。其中&#xff0c;模块&#xff08;Modules&#xff09;的正式标准化为大型项目的组织方式带来了根本…

Open-AutoGLM安全吗?敏感操作确认机制深度解析

Open-AutoGLM安全吗&#xff1f;敏感操作确认机制深度解析 Open-AutoGLM 是智谱开源的一款面向手机端的 AI Agent 框架&#xff0c;基于视觉语言模型实现对移动设备的自动化控制。它通过 ADB&#xff08;Android Debug Bridge&#xff09;与设备通信&#xff0c;结合多模态理解…

CAM++能否做语音克隆检测?反欺诈应用探索

CAM能否做语音克隆检测&#xff1f;反欺诈应用探索 1. 引言&#xff1a;当声音也能被“复制”时&#xff0c;我们如何识别真伪&#xff1f; 你有没有想过&#xff0c;一段听起来完全真实的语音&#xff0c;可能根本不是真人说的&#xff1f;随着AI语音合成技术的飞速发展&…

如何提高召回率?FSMN-VAD敏感度参数调整指南

如何提高召回率&#xff1f;FSMN-VAD敏感度参数调整指南 1. FSMN-VAD 离线语音端点检测控制台简介 你是否在处理长录音时&#xff0c;被大量无效静音段困扰&#xff1f;是否希望自动切分语音片段却苦于精度不够&#xff1f;今天介绍的 FSMN-VAD 离线语音端点检测工具&#xf…

Qwen3-0.6B从零开始:新手开发者部署全流程详解

Qwen3-0.6B从零开始&#xff1a;新手开发者部署全流程详解 你是不是也对大模型跃跃欲试&#xff0c;但一想到复杂的环境配置、依赖安装和API调用就望而却步&#xff1f;别担心&#xff0c;这篇文章就是为你量身打造的。我们聚焦阿里巴巴最新开源的小参数模型——Qwen3-0.6B&am…

紧急警告:C++项目中出现undefined reference?立即检查这6个关键点!

第一章&#xff1a;undefined reference错误的本质解析 undefined reference 是C/C编译过程中最常见的链接错误之一&#xff0c;它表明编译器成功生成了目标文件&#xff0c;但在链接阶段无法找到某些函数或变量的定义。该错误并非语法问题&#xff0c;而是符号解析失败的体现。…

为什么你的fwrite没写入?深度解读C语言二进制写入陷阱

第一章&#xff1a;为什么你的fwrite没写入&#xff1f;从现象到本质 在使用C语言进行文件操作时&#xff0c; fwrite 函数看似简单&#xff0c;却常出现“调用成功但文件无内容”的诡异现象。这背后往往涉及缓冲机制、文件指针状态或系统调用的深层逻辑。 缓冲区未刷新导致数…

免费文献检索网站推荐:实用资源汇总与高效使用指南

做科研的第一道坎&#xff0c;往往不是做实验&#xff0c;也不是写论文&#xff0c;而是——找文献。 很多新手科研小白会陷入一个怪圈&#xff1a;在知网、Google Scholar 上不断换关键词&#xff0c;结果要么信息过载&#xff0c;要么完全抓不到重点。今天分享几个长期使用的…

学习干货_从迷茫到前行:我的网络安全学习之路

网络安全成长之路&#xff1a;从零基础到实战专家的学习指南&#xff08;建议收藏&#xff09; 本文作者"州弟"分享了自己从网络安全小白成长为专业人员的经历。他强调破除"学生思维"&#xff0c;通过实践而非死记硬背学习&#xff1b;推荐扎实掌握Linux、…

OpenACC介绍

文章目录一、OpenACC 核心思想二、OpenACC 基本语法示例&#xff08;C 语言&#xff09;示例 1&#xff1a;向量加法&#xff08;最简形式&#xff09;示例 2&#xff1a;使用 kernels 区域&#xff08;更自动化的并行化&#xff09;三、OpenACC vs OpenMP&#xff08;针对 GPU…

【C++异步编程核心技术】:深入掌握std::async的5种高效用法与陷阱规避

第一章&#xff1a;C异步编程与std::async概述 在现代C开发中&#xff0c;异步编程已成为提升系统吞吐量与响应性的核心手段。std::async作为C11标准引入的高层抽象工具&#xff0c;为开发者提供了轻量、易用且符合RAII原则的异步任务启动机制。它封装了线程创建、任务调度与结…