Spring 容器 详解
Spring 容器详解
Spring 容器 是 Spring 框架的核心组件之一,它负责创建和管理应用程序中的 Bean(对象)以及处理它们之间的依赖关系。容器通过控制反转(IoC)和依赖注入(DI)实现对象的生命周期管理和松耦合设计。
1. 什么是 Spring 容器?
1.1 概念
- Spring 容器是一个实现了 IoC 的容器,主要用于管理对象的创建、依赖注入和生命周期。
- 它根据配置文件(XML、注解或 JavaConfig)定义的规则创建和组装 Bean。
1.2 Spring 容器的核心功能
- 管理 Bean:
- 创建 Bean。
- 初始化、配置 Bean。
- 管理 Bean 的生命周期。
- 依赖注入(DI):
- 通过构造器、Setter 方法或字段注入依赖。
- 配置管理:
- 提供多种配置方式(XML、注解、JavaConfig)。
- 集成支持:
- 提供事务管理、AOP、事件发布等功能。
2. Spring 容器的核心接口
Spring 容器有两个核心接口:BeanFactory 和 ApplicationContext。
2.1 BeanFactory
- 特点:
- 最基本的容器,只提供 Bean 的创建与管理功能。
- 支持懒加载(Bean 在第一次被访问时创建)。
- 使用场景:资源受限的场合,如移动或嵌入式设备。
- 常用实现类:
XmlBeanFactory
(已过时):通过 XML 配置文件加载 Bean。
- 示例:
BeanFactory factory = new XmlBeanFactory(new ClassPathResource("beans.xml")); MyBean myBean = (MyBean) factory.getBean("myBean");
2.2 ApplicationContext
- 特点:
- BeanFactory 的扩展,提供更多高级特性:
- 国际化支持(MessageSource)。
- 事件发布机制。
- 与 Spring AOP 的集成。
- 自动扫描和注解支持。
- Bean 默认立即加载(非懒加载)。
- 使用场景:大部分企业级应用。
- BeanFactory 的扩展,提供更多高级特性:
- 常用实现类:
- ClassPathXmlApplicationContext:
- 从类路径加载 XML 配置文件。
- FileSystemXmlApplicationContext:
- 从文件系统加载 XML 配置文件。
- AnnotationConfigApplicationContext:
- 使用 JavaConfig 注解加载配置。
- 示例:
ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml"); MyBean myBean = context.getBean(MyBean.class);
- ClassPathXmlApplicationContext:
3. Spring 容器的工作原理
Spring 容器的核心流程包括以下步骤:
- 解析配置:
- 加载配置文件或注解,解析 Bean 定义。
- Bean 定义注册:
- 将每个 Bean 的信息(如类、作用域、依赖)注册到容器。
- Bean 实例化:
- 按需实例化 Bean(单例 Bean 在容器启动时创建,Prototype Bean 在获取时创建)。
- 依赖注入:
- 根据配置注入依赖 Bean。
- 初始化:
- 调用初始化方法(如
@PostConstruct
或自定义方法)。
- 调用初始化方法(如
- 使用 Bean:
- 应用程序访问并使用 Bean。
- 销毁:
- 容器关闭时,调用销毁方法(如
@PreDestroy
或自定义方法)。
- 容器关闭时,调用销毁方法(如
4. Spring 容器的配置方式
4.1 基于 XML 的配置
- 通过 XML 文件定义 Bean 和依赖。
- 示例:
<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="myBean" class="com.example.MyBean"><property name="property1" value="value1"/></bean></beans>
4.2 基于注解的配置
- 使用注解定义 Bean 和依赖关系。
- 常用注解:
@Component
:声明 Bean。@Autowired
:注入依赖。@Qualifier
:指定具体 Bean。
- 示例:
@Component public class MyBean {@Autowiredprivate AnotherBean anotherBean; }
4.3 基于 JavaConfig 的配置
- 使用 Java 类和方法定义 Bean。
- 示例:
@Configuration public class AppConfig {@Beanpublic MyBean myBean() {return new MyBean();} }
5. Spring 容器中的 Bean
5.1 Bean 的定义
- 一个 Bean 是 Spring 容器管理的对象。
- 它的定义包括:
- 类名。
- 作用域(
singleton
、prototype
)。 - 依赖关系。
5.2 Bean 的作用域
Spring 提供以下作用域:
- Singleton(默认):全局唯一实例。
- Prototype:每次请求创建一个新的实例。
- Request:每个 HTTP 请求一个实例(Web 应用)。
- Session:每个 HTTP 会话一个实例(Web 应用)。
- Application:每个 ServletContext 一个实例(Web 应用)。
5.3 Bean 的生命周期
- 实例化:通过容器创建对象。
- 依赖注入:注入属性和依赖。
- 初始化:调用初始化方法。
- 销毁:调用销毁方法(容器关闭时)。
示例:
@Component
public class MyBean {@PostConstructpublic void init() {System.out.println("Bean initialized");}@PreDestroypublic void destroy() {System.out.println("Bean destroyed");}
}
6. Spring 容器的高级特性
6.1 自动装配
- 自动将匹配的 Bean 注入到依赖中。
- 注解:
@Autowired
、@Qualifier
、@Primary
。
6.2 事件机制
- 发布和监听应用事件。
- 示例:
@Component public class MyEventListener implements ApplicationListener<MyEvent> {@Overridepublic void onApplicationEvent(MyEvent event) {System.out.println("Event received: " + event.getMessage());} }// 发布事件 context.publishEvent(new MyEvent("Hello World"));
6.3 国际化支持
- 使用
MessageSource
处理国际化消息。 - 示例:
String message = context.getMessage("greeting", null, Locale.US);
6.4 AOP 集成
- 容器支持切面编程,动态增强 Bean 的行为。
7. Spring 容器的优缺点
7.1 优点
- 解耦:容器通过依赖注入降低对象间的耦合。
- 灵活性:支持多种配置方式(XML、注解、JavaConfig)。
- 生命周期管理:容器自动管理 Bean 的创建和销毁。
- 功能强大:支持 AOP、事件机制、国际化等功能。
7.2 缺点
- 学习成本:需要掌握 IoC 和 DI 的原理。
- 性能开销:动态代理和反射可能影响性能。
- 复杂性:大型项目中 Bean 配置可能变得复杂。
8. Spring 容器的应用场景
- Web 应用开发:
- 管理控制器、服务和数据访问层的 Bean。
- 企业级应用:
- 提供事务管理、消息队列支持等。
- 微服务架构:
- 与 Spring Boot 和 Spring Cloud 集成,构建微服务应用。
- 分布式系统:
- 提供 Bean 的集中管理和依赖注入。
9. Spring 容器的运行流程总结
- 加载配置:读取 XML、注解或 JavaConfig。
- 解析 Bean 定义:将所有 Bean 信息注册到容器。
- 创建 Bean:按需实例化 Bean。
- 依赖注入:注入 Bean 的依赖。
- 初始化:调用初始化方法。
- 使用 Bean:供应用程序使用。
- 销
毁 Bean:容器关闭时调用销毁方法。
10. 总结
Spring 容器是 Spring 框架的核心部分,它通过 IoC 和 DI 提供了强大的对象管理和依赖配置功能。Spring 容器使得开发者能够专注于业务逻辑,而不需要手动管理复杂的依赖关系。理解 Spring 容器的原理、配置方式和功能,可以大幅提升开发效率和代码的可维护性。
相关文章:
Spring 容器 详解
Spring 容器详解 Spring 容器 是 Spring 框架的核心组件之一,它负责创建和管理应用程序中的 Bean(对象)以及处理它们之间的依赖关系。容器通过控制反转(IoC)和依赖注入(DI)实现对象的生命周期管…...
ubuntu环境下安装electron环境,并快速打包
1.配置镜像源 关闭防火墙,命令:sudo ufw disable 1.1配置国内镜像源: vim /etc/apt/source.list deb https://mirrors.aliyun.com/ubuntu/ jammy main restricted universe multiversedeb-src https://mirrors.aliyun.com/ubuntu/ jammy main…...
Yeeco成长型一体化数智赋能平台:科技矩阵重塑企业数字生态
随着科技的飞速发展,我们正在步入一个被称为“数智化时代”的新时代。在这个时代中,数据处理和分析的能力被提升到一个前所未有的高度,而这种变化背后的重要推动力量就是各种新兴的技术趋势。 为了在激烈的市场竞争中脱颖而出,Yee…...
DP、CP、Mn是什么?有什么关系?双径节齿轮又是什么?
有一些刚刚接触齿轮的小伙伴们,经常听到和齿轮相关的是Mn这个代号,有时候拿到图纸会碰到DP和CP的图纸,今天就简单数一数他们三个的关系: 径节DP 齿轮的节距定义为两个相邻齿轮齿上两个相同点之间的距离。在理想情况下,…...
Python 中的生成器是什么?
生成器(Generator)是Python中一种特殊的迭代器,它允许你逐步生成一系列值,而不是一次性创建整个列表或集合。 这在处理大型数据集或流式数据时特别有用,因为你可以逐个处理元素,而不需要将所有元素加载到内…...
如何参加华为欧拉考试?
华为欧拉考试主要针对的是华为欧拉(EulerOS/openEuler)操作系统的认证考试,这一认证体系旨在培养和认证具备基于欧拉操作系统进行企业级应用运行基础环境搭建、管理和调测能力的工程师以及云计算架构师。以下是对华为欧拉考试的详细介绍&…...
基于STM32设计的智能家居控制系统(华为云IOT)_275
文章目录 一、前言1.1 项目介绍【1】项目开发背景【2】设计实现的功能【3】项目硬件模块组成【4】设计意义【5】国内外研究现状【6】摘要1.2 设计思路1.3 系统功能总结1.4 开发工具的选择【1】设备端开发【2】上位机开发1.5 参考文献1.6 系统框架图1.7 系统原理图1.8 实物图1.9…...
2024年第七届传智杯程序设计挑战赛第一场初赛题解
文章目录 2024年第七届传智杯程序设计挑战赛初赛第一场A-吃糖果(B组、C组)B-汤姆和杰瑞(A组、C组)C-游游的重组偶数(A组、B组、C组)D-开心还是难过(B组、C组)E-小欧的平面连线(A组、B组、C组)F-小红的四子棋(A组、B组、C组)G-小红的数组操作(A组、B组)H-游游的不相邻取数(A组) …...
iOS视图控制器的生命周期及各阶段的作用
iOS视图控制器(UIViewController)的生命周期是指从它被创建到最终被销毁的过程中所经历的一系列阶段。每个阶段都有其特定的作用和执行时机,这些阶段和作用对于开发高效、稳定的iOS应用至关重要。以下是iOS视图控制器的生命周期及其各个阶段的…...
stm32上电不能启动什么原因
STM32上电不能启动可能由多种原因造成,以下是一些常见的原因及解决方法: 一、软件原因 程序错误: 程序可能存在死循环、堆栈溢出、指针指向不允许的内存空间等问题。 解决方法:使用调试工具进行调试,检查程序流程,定位并修复错误。 时钟问题: 时钟切换失败或外部时钟源…...
【后端面试总结】golang channel深入理解
在Go语言中,Channel是一种用于在goroutine之间进行通信和同步的重要机制。它提供了一种安全、类型安全的方式来传递数据,使得并发编程变得更加直观和简单。本文将详细介绍Golang中Channel的基本概念、创建与关闭、发送与接收操作,以及相关的使…...
lobeChat安装
一、安装Node.js version > v18.17.0 二、下载 cd F:\AITOOLS\LobeChat git clone https://github.com/lobehub/lobe-chat.git (下载要是失败就手动下:https://codeload.github.com/lobehub/lobe-chat/zip/refs/heads/main) npm install …...
OpenCV 简介与安装方法
大家好啊,我是董董灿。 如果你在做计算机视觉相关的工作,肯定少不了使用 OpenCV 库。 在《计算机视觉专栏》的传统计算机视觉部分,我曾经使用 OpenCV 进行了很多图像的处理,比如边缘检测。 刚好最近在整理一份文稿,…...
力扣刷题TOP101:14.BM16 删除有序链表中重复的元素-II
目录: 目的 思路 复杂度 记忆秘诀 python代码 目的 1→1→2→3→3 删除重复后变成2。 思路 这个任务是删除链表里重复的节点包含本身。可以看成是一个抽奖活动的系统升级。某人通过多种方式报名(节点不同),后台数据检测到这些…...
Hadoop生态圈框架部署 伪集群版(四)- Zookeeper单机部署
文章目录 前言一、Zookeeper单机部署(手动部署)1. 下载Zookeeper安装包到Linux2. 解压zookeeper安装包3. 配置zookeeper配置文件4. 配置Zookeeper系统环境变量5. 启动Zookeeper6. 停止Zookeeper在这里插入图片描述 注意 前言 本文将详细介绍Zookeeper的…...
【Linux】文件
声明:以下内容均学习自《Linux就该这么学》一书 1、文件权限及归属 对目录文件来说,“可读”表示能够读取目录内的文件列表;“可写”表示能够在目录内新增、删除、重命名文件;“可执行”表示能够进入该目录。 文件类型区分 -普通…...
仿真键盘输入遇到Edge环境不识别 回车符如何处理
这个问题我也是最近才遇到,可能现在大家都喜欢用新架构,基于网页来写应用管理软件。 当遇到Edge环境下,文本框不识别回车符如何处理,根据笔者经验可通过配置Edge 基于键盘管理设置来解决这个事情。如图 即在Edge浏览器环境下&…...
Python 列表操作详解
Python 列表操作详解 在 Python 中,列表(list)是一种用于存储有序集合的数据结构。列表可以包含各种类型的数据,如整数、浮点数、字符串等,甚至可以包含其他列表(这称为嵌套列表)。 示例列表 …...
Git操作学习2
1.使用git rm删除文件 查看文件夹的内容 ls -lr 删除文件rm 文件名 但是此时只删了工作区的文件,仓库还没有删 可以再使用git add更新提交给仓库 也可以直接通过git rm 删除仓库里面的文件 工作区也删除了 暂存区也删除了 最后记得提交 否则删除的文件在版本库还…...
Spring Event 监听与异步设置:深入解析与应用场景
在开发中,事件驱动编程(Event-Driven Programming)是一种常见的编程模式,Spring 提供了强大的事件机制,使得我们可以通过 EventListener 或 ApplicationListener 来监听和处理应用中的各种事件。这种机制不仅使得应用架…...
百度木木浆测试
本程序测试识别图片的文字 import cv2 from paddleocr import PaddleOCR, draw_ocr from matplotlib import pyplot as plt # 加载PaddleOCR模型,这里你可以根据需要选择语言和模型路径 ocr PaddleOCR(use_gpuFalse, langch) # 假设我们识别中文字符,…...
视频监控集中管理方案设计:Liveweb视频汇聚方案技术特点与应用
随着科技的发展,视频监控平台在各个领域的应用越来越广泛。然而,当前的视频监控平台仍存在一些问题,如视频质量不高、监控范围有限、智能化程度不够等。这些问题不仅影响了监控效果,也制约了视频监控平台的发展。 为了解决这些问…...
剑指offer(专项突破)---字符串
总目录:剑指offer(专项突破)---目录-CSDN博客 1.字符串的基本知识 C语言中: 函数名功能描述strcpy(s1, s2)将字符串s2复制到字符串s1中,包括结束符\0,要求s1有足够空间容纳s2的内容。strncpy(s1, s2, n)…...
Zygote启动流程(AndroidV)
一:背景 众所周知,Android应用及system_server基本都是由zygote fork出来的,那么zygote是如何启动的、又是如何接收fork进程的请求,接下来一步步揭秘。 二:启动流程 init进程是Android系统启动时,启动的第一…...
Web 毕设篇-适合小白、初级入门练手的 Spring Boot Web 毕业设计项目:智行无忧停车场管理系统(前后端源码 + 数据库 sql 脚本)
🔥博客主页: 【小扳_-CSDN博客】 ❤感谢大家点赞👍收藏⭐评论✍ 文章目录 1.0 项目介绍 1.1 项目功能 2.0 用户登录功能 3.0 首页界面 4.0 车辆信息管理功能 5.0 停车位管理功能 6.0 入场登记管理功能 7.0 预约管理功能 8.0 收费规则功能 9.0…...
岩体力学的材质-力学等属性的自动划分.
#背景: 在力学求解过程中,我们往往会对目标物体进行网格划分, 那么如何做到自动完成这个过程呢? 这里使用岩体力学中的地下岩层进行举例,这里只是简单的导入了4种界面, 复杂的可以一次性导入几十种界面,都可以计算(你能分多细,这个计算方式就可以帮你分层多细) 这里我只是导…...
注解 实现原理 详解
Java 注解实现原理详解 注解(Annotation)是 Java 提供的一种元数据机制,用于为代码元素(类、方法、字段、参数等)添加额外的信息。注解不会直接影响程序逻辑,但可以通过 工具(如编译器、运行时…...
第4章 陷入与系统调用
有三种类型的事件会让CPU停止正常执行的指令,强制切换到指定的代码,处理这些事件。一种是系统调用,当用户程序执行ecall指令来让内核为它做一些事。另一种是异常:一个指令(用户或内核)做了一些非法的事&…...
项目基于oshi库快速搭建一个cpu监控面板
后端: <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>com.github.oshi</groupId><artifactId>oshi-…...
力扣C语言刷题记录 (二)移除元素
给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素。元素的顺序可能发生改变。然后返回 nums 中与 val 不同的元素的数量。 假设 nums 中不等于 val 的元素数量为 k,要通过此题,您需要执行以下操作: 更改…...
多模态大语言模型的对比
简介 文章主要对比了包括 VideoLLaMA 2 、CogVLM2-video 、MiniCPM-V等模型 目前主流的多模态视觉问答大模型,大部分采用视觉编码器、大语言模型、图像到文本特征的投影模块 目录 简介1. VideoLLaMA 21.1 网络结构1.2 STC connector具体的架构 2. MiniCPM-V 2.62.…...
关于最近od机考中--树
题目 树按照层级遍历获取非叶子结点,然后将非叶子结点以后序遍历打印。 eg 图解 只需要将1,3,4,2进行后序遍历打印:既左-右-中方式打印 最后结果如:2,3,4,1。 思路&a…...
基数排序(代码+注释)
#include <stdio.h> #include <stdlib.h>// 获取数组中的最大值 int GetMax(int* a, int n) {int max a[0];for (int i 1; i < n; i) {if (a[i] > max) {max a[i];}}return max; }// 对数组按照某个位数进行计数排序 void CountingSortForRadix(int* a, i…...
NLP 相关知识的构成
自然语言处理(Natural Language Processing, NLP) 自然语言处理相关知识 自然语言处理(Natural Language Processing, NLP)什么是自然语言处理?自然语言处理的构成1. 基本术语1.1 分词(Segmentation&#x…...
算力100问☞第20问:GPU算力的影响因素有哪些?
影响因素1:核心数量 GPU中的计算核心数量是决定其算力的关键因素之一。更多的计算核心意味着可以同时处理更多的数据和任务,从而提高整体的计算效率。例如,GPU里面的计算核心就好像是工厂里的工人。工人数量越多,同时干活儿的也就…...
C语言柔性数组
在C语言中,结构体定义数组指定长度0,sizeof时候不计入占用,实际分配时候占用为准! 也许你从来没有听说过柔性数组的概念,但其确实存在。C99规定:结构中的最后一个元素允许是未知大小的数组,这就…...
TensorFlow与PyTorch对比:哪个更适合初学者?
小贴士: 不必着急,慢慢消化每一部分。有问题就查阅示例,实践是最好的老师!别忘了,选择合适的框架才是王道!💻🔍 本文全面对比了 TensorFlow 与 PyTorch 两大深度学习框架,详细分析了它们的特点、优势及适用场景,帮助初学者做出框架选择。内容包含框架背景、代码示例…...
Windows 11 如何配置node.js
一,官网下载 官网首页 下载最新LTS版本,比较稳定,如果想探索更新的版本去探索新的nodejs功能。 1. 下载完成后,双击运行程序,点击next 2. 勾选接受协议,点击next 3. 选择自己的安装路径(默认是…...
std::reverse_iterator
std::reverse_iterator 是 C 标准库中的一个迭代器适配器(iterator adapter),它允许你以反向顺序遍历容器或序列。这个适配器通过封装一个基础迭代器(通常是正向迭代器)并提供反向的递增()和递减…...
On-Chip-Network之router微架构的物理实现
Low-Power Microarchitecture 自20世纪90年代以来,功耗一直是嵌入式芯片和高性能芯片面临的一个挑战。自2000年代中期以来,它已经成为大多数设计的主要约束。多核解决了功耗问题,由此产生的communication substrate,namely the on…...
学习threejs,使用canvas更新纹理
👨⚕️ 主页: gis分享者 👨⚕️ 感谢各位大佬 点赞👍 收藏⭐ 留言📝 加关注✅! 👨⚕️ 收录于专栏:threejs gis工程师 文章目录 一、🍀前言1.1 ☘️Texture 贴图 二、…...
CSS 选择器的优先级
一、基本概念 CSS 选择器的优先级决定了在样式冲突时,哪个样式规则将被应用到 HTML 元素上。通过理解 CSS 选择器的优先级,可以更好地控制网页元素的样式,避免样式冲突。 二、优先级计算规则 1. 内联样式 内联样式具有最高的优先级。 &l…...
如何将python项目导出为docker镜像
如何将python项目导出为docker镜像 前提条件步骤 1: 创建并准备 Python 项目步骤 2: 创建 `setup.py`步骤 3: 打包项目步骤 4: 创建 Dockerfile步骤 5: 构建 Docker 镜像步骤 6: 运行 Docker 容器步骤 7: 保存修改并继续开发总结要将修改后的Python代码导出为 .tar.gz 格式,并…...
微信 创建小程序码-有数量限制
获取小程序码:小程序码为圆图,有数量限制。 目录 文档 接口地址 功能描述 注意事项 请求参数 对接 获取小程序码 调用获取 小程序码示例 总结 文档 接口地址 https://api.weixin.qq.com/wxa/getwxacode?access_tokenaccess_token 功能描述 …...
桶排序(代码+注释)
#include <stdio.h> #include <stdlib.h>// 定义桶的结构 typedef struct Bucket {int* data; // 动态数组int count; // 当前存储的元素个数int capacity; // 桶的容量 } Bucket;// 初始化桶 void InitBucket(Bucket* bucket) {bucket->capacity 10; // 初…...
Python从入门到入狱
Python是从入门到入狱?这个充满调侃意味的说法在程序员圈子里流传甚广。表面看,它似乎是在嘲笑这门语言从简单易学到深陷麻烦的巨大反差,实际上却隐藏着很多值得深思的问题。要解读这个话题,得从Python的特点、使用场景以及潜在风…...
图像模糊处理
图像模糊处理 C语言实现C实现Java实现Python实现 💐The Begin💐点点关注,收藏不迷路💐 给定n行m列的图像各像素点的灰度值,要求用如下方法对其进行模糊化处理: 1 四周最外侧的像素点灰度值不变;…...
全面UI组件库Telerik 2024 Q4全新发布——官方宣布支持.NET 9
Telerik DevCraft包含一个完整的产品栈来构建您下一个Web、移动和桌面应用程序。它使用HTML和每个.NET平台的UI库,加快开发速度。Telerik DevCraft提供最完整的工具箱,用于构建现代和面向未来的业务应用程序,目前提供UI for ASP.NET MVC、Ken…...
请求响应:常见参数接收及封装(Json参数及路径参数)
Json参数 Json格式的数据具有轻量级、易于阅读和编写、易于解析等诸多优点。在前后端交互时,大部分情况下请求体中的数据会以JSON格式进行传递。前端的请求在请求体中携带了Json格式数据,后端程序需要对其进行解析并封装使用,而接收Json参数…...
Doge东哥wordpress主题
Doge东哥wordpress主题是一款专为中小型企业设计的WordPress外贸网站模板,它以其现代、专业且用户友好的界面,为企业提供了一个展示产品和服务的理想平台。以下是对该模板的详细描述: 首页设计概览 首页的设计简洁而不失大气,顶…...