news 2026/4/22 22:20:08

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

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
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并将特定的功能模块独立管理。通过示例代码可以看到,父子容器的应用使得应用程序的构建更加整洁和可维护。在实际开发中,随着应用的复杂性增加,合理使用父子容器将为代码的可读性和可复用性提供极大的帮助。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/22 22:18:10

unet image Face Fusion模型更新频率预测:后续版本功能期待

unet image Face Fusion模型更新频率预测&#xff1a;后续版本功能期待 1. 引言&#xff1a;从二次开发到用户友好型工具的演进 unet image Face Fusion 是一个基于阿里达摩院 ModelScope 模型的人脸融合项目&#xff0c;由开发者“科哥”进行深度二次开发后&#xff0c;构建…

作者头像 李华
网站建设 2026/4/18 13:15:39

Paraformer-large异常音频处理:静音/杂音/低频问题应对

Paraformer-large异常音频处理&#xff1a;静音/杂音/低频问题应对 1. 引言&#xff1a;为什么你的语音识别总“听不清”&#xff1f; 你有没有遇到过这种情况&#xff1a;一段录音明明听得清&#xff0c;但用ASR&#xff08;语音识别&#xff09;系统一转写&#xff0c;结果…

作者头像 李华
网站建设 2026/4/18 1:55:19

未来五年,网络安全+AI才是程序员的铁饭碗

【收藏必看】网络安全AI双引擎驱动&#xff1a;程序员如何抓住涨薪新赛道与高薪转型&#xff1f; 互联网大厂薪酬正从普惠式转向精准流向AI、网络安全及其交叉领域。AI战略转型使企业愿意为顶尖人才支付高薪溢价&#xff0c;网络安全因政策和威胁升级地位提高&#xff0c;与AI…

作者头像 李华
网站建设 2026/4/20 9:59:14

一篇搞定网络安全:零基础入门到进阶实战,CSDN玩家必备指南

1.什么是网络安全&#xff1f; 网络安全是指保护计算机网络及其相关系统、设备和数据免受未经授权的访问、使用、泄露、破坏或干扰的一种措施或实践。它包括保护网络中的硬件、软件和数据免受各种威胁和攻击&#xff0c;以确保网络的机密性、完整性和可用性。 2.网络安全内容 …

作者头像 李华
网站建设 2026/4/19 0:48:36

你还在被“undefined reference to”困扰?资深架构师教你4种根治方法

第一章&#xff1a;深入理解“undefined reference to”错误的本质 在C/C项目构建过程中&#xff0c;开发者常会遇到“undefined reference to”链接错误。该错误并非由编译器在语法检查阶段捕获&#xff0c;而是由链接器&#xff08;linker&#xff09;在整合目标文件时抛出&a…

作者头像 李华
网站建设 2026/4/18 7:22:35

CMake引入第三方库不求人(保姆级教程+避坑清单)

第一章&#xff1a;CMake引入第三方库不求人&#xff08;保姆级教程避坑清单&#xff09; 在现代C项目中&#xff0c;CMake已成为事实标准的构建系统&#xff0c;而高效、可靠地集成第三方库是日常开发的关键能力。本章聚焦实战&#xff0c;提供从零开始引入外部依赖的完整路径…

作者头像 李华