当前位置: 首页 > article >正文

java面试必问6:Spring IOC 是什么?从概念到原理,一篇讲透

Spring IOC 是什么从概念到原理一篇讲透面试官“说一下 Spring IOC 是什么”你“IOC 即控制反转把对象创建和依赖管理的控制权从程序员手中交给 Spring 容器不再需要手动 new。核心好处是解耦、统一管理生命周期、方便测试。底层依赖工厂模式、反射和注解。”面试官“那 DI 和 IOC 是什么关系Bean 的生命周期是怎样的”你“……”很多人能背出 IOC 的定义但一追问“如何实现解耦”“Bean 的生命周期有哪些阶段”就含糊了。本文从概念到源码彻底讲透 Spring IOC。一、IOC 是什么用一个故事理解传统方式你要吃面包自己种小麦、磨面粉、烤面包 → 高度耦合换个口味要重做。IOC 方式你告诉面包店容器“我要一个面包”面包店负责原料、制作、甚至回收 → 你只需要“声明需求”实现细节由容器完成。IOCInversion of Control控制反转将对象的创建、组装、管理的控制权从应用程序代码转移给 Spring 容器。应用程序被动地接受容器注入的依赖。二、IOC 的核心好处好处说明解耦组件之间通过接口或抽象依赖具体实现由容器注入修改实现类无需改动调用方代码统一管理生命周期容器管理单例、原型等作用域负责初始化和销毁回调便于配置切换通过配置文件或注解一键替换依赖实现如从开发库切换到生产库方便单元测试可以轻松注入 Mock 对象不依赖真实环境三、IOC 的底层实现工厂模式 反射 注解1. 工厂模式Spring 容器本质上是一个超级工厂负责创建和缓存所有 Bean。通过BeanFactory或ApplicationContext获取实例。// 传统工厂UserServiceserviceUserServiceFactory.getUserService();// Spring 工厂ApplicationContextcontextnewClassPathXmlApplicationContext(beans.xml);UserServiceservicecontext.getBean(UserService.class);2. 反射Spring 在启动时会扫描配置XML/注解/JavaConfig通过反射调用构造器或工厂方法创建 Bean 实例并通过反射给字段或 setter 方法赋值。// 反射创建对象Class?clazzClass.forName(com.example.UserService);Constructor?constructorclazz.getDeclaredConstructor();Objectinstanceconstructor.newInstance();3. 注解Component、Autowired、Qualifier等注解让声明式依赖注入成为可能。Spring 通过注解处理器扫描类路径解析元数据。四、IOC 和 DI 的关系IOC 是一种设计思想控制权反转。DIDependency Injection依赖注入是 IOC 的具体实现方式容器将依赖的对象“注入”到需要它的组件中。常见注入方式方式示例构造器注入public UserService(UserDao userDao) { this.userDao userDao; }Setter 注入public void setUserDao(UserDao userDao) { this.userDao userDao; }字段注入Autowired private UserDao userDao;Spring 推荐构造器注入保证不可变性且便于单元测试。五、Bean 的生命周期重点一个 Bean 从创建到销毁会经历多个阶段理解生命周期有助于编写扩展组件如 BeanPostProcessor。实例化属性赋值初始化前 BeanPostProcessor初始化 InitializingBean/init-method初始化后 BeanPostProcessor使用销毁 DisposableBean/destroy-method详细步骤实例化通过构造器或工厂方法创建对象此时属性为 null。属性赋值注入依赖Autowired、setter 等。BeanNameAware若实现该接口调用setBeanName()。BeanFactoryAware若实现调用setBeanFactory()。ApplicationContextAware若实现调用setApplicationContext()。BeanPostProcessor 前置处理postProcessBeforeInitialization()。InitializingBean若实现调用afterPropertiesSet()。自定义 init-method执行配置的初始化方法。BeanPostProcessor 后置处理postProcessAfterInitialization()→ Bean 准备就绪。使用 Bean。销毁若实现DisposableBean调用destroy()执行自定义 destroy-method。面试高频BeanPostProcessor与InitializingBean的区别前者对所有 Bean 生效用于增强后者只针对当前 Bean 的初始化逻辑。六、IOC 容器的两种主要类型容器特点常用场景BeanFactory延迟加载第一次getBean()时才创建资源受限环境如移动设备ApplicationContext预加载启动时即创建所有单例 Bean绝大多数企业应用ApplicationContext继承BeanFactory并增加了国际化、事件传播、AOP 等企业级功能。七、常见面试追问Q1Spring 如何解决循环依赖三级缓存singletonObjects一级、earlySingletonObjects二级、singletonFactories三级。核心思路提前暴露未完全初始化的 Bean通过提前引用打破循环。只支持单例模式的循环依赖原型模式无法解决会直接报错。Q2Bean和Component的区别注解使用位置控制力Component类上自动扫描Spring 默认使用无参构造器Bean方法上通常用在Configuration类可以自定义实例化逻辑如调用静态工厂、复杂构造Q3Autowired和Resource的区别注解来源匹配方式AutowiredSpring先 byType如果多个则 byNameResourceJDKJSR-250先 byName如果找不到则 byType八、代码示例XML 配置 vs 注解配置XML 方式老式beaniduserDaoclasscom.example.UserDao/beaniduserServiceclasscom.example.UserServicepropertynameuserDaorefuserDao//bean注解方式现代ComponentpublicclassUserDao{}ServicepublicclassUserService{AutowiredprivateUserDaouserDao;}启动类SpringBootApplicationpublicclassApplication{publicstaticvoidmain(String[]args){ApplicationContextctxSpringApplication.run(Application.class,args);UserServiceservicectx.getBean(UserService.class);}}九、总结概念要点IOC控制反转将对象创建和依赖管理的控制权交给容器DI依赖注入IOC 的具体实现通过构造器/Setter/字段注入依赖底层技术工厂模式 反射 注解容器BeanFactory懒加载、ApplicationContext预加载生命周期实例化 → 属性填充 → 初始化 → 使用 → 销毁循环依赖单例模式下通过三级缓存解决一句话记住 IOC你不要找你要等—— 别主动new声明需求让 Spring 送过来。希望这篇文章能帮你彻底掌握 Spring IOC 的核心知识面试时对答如流。如果还想了解 AOP 或 Spring Boot 自动配置欢迎继续讨论。

相关文章:

java面试必问6:Spring IOC 是什么?从概念到原理,一篇讲透

Spring IOC 是什么?从概念到原理,一篇讲透面试官:“说一下 Spring IOC 是什么?” 你:“IOC 即控制反转,把对象创建和依赖管理的控制权从程序员手中交给 Spring 容器,不再需要手动 new。核心好处…...

不止于预览:用docx-preview + Vue2打造一个可搜索、可高亮的简易在线文档阅读器

不止于预览:用docx-preview Vue2打造企业级文档阅读器 在数字化办公场景中,Word文档的在线预览已成为基础需求,但大多数解决方案仅停留在静态展示层面。当我们需要在合同管理系统、知识库平台或内部文档中心实现精准定位关键条款、快速检索业…...

AI如何改变日常

前言 本文专为技术小白撰写,核心是用“大白话”解读AI(人工智能),避开复杂的技术公式和专业术语,重点讲清:AI到底是什么、我们每天会接触到哪些AI、它如何悄悄改变我们的衣食住行、学习工作,以及小白如何轻松适应AI时代,避免被技术“劝退”。 很多人觉得AI是“高大上…...

快速部署FLUX.1-dev镜像:无需复杂配置,直接访问Web界面开始创作

快速部署FLUX.1-dev镜像:无需复杂配置,直接访问Web界面开始创作 想体验当前开源界画质最强的文生图模型,但被复杂的本地部署、环境配置和显存问题劝退?今天,我们带来一个“开箱即用”的解决方案。通过部署 FLUX.1-dev…...

AI净界RMBG-1.4在电商场景的应用:自动生成商品白底图实战

AI净界RMBG-1.4在电商场景的应用:自动生成商品白底图实战 1. 电商商品图的痛点与解决方案 在电商运营中,商品主图的质量直接影响转化率。平台要求主图必须是纯白背景,但传统处理方法面临三大难题: 成本高:专业摄影师…...

Pixel Couplet Gen应用场景:银行APP春节活动——客户姓名定制像素春联

Pixel Couplet Gen应用场景:银行APP春节活动——客户姓名定制像素春联 1. 项目背景与价值 在数字化时代,传统节日活动也需要创新形式来吸引年轻用户。银行APP作为金融服务入口,如何在春节这样的重要节日提升用户活跃度和品牌亲和力&#xf…...

150ms端到端延迟!手把手教你将Fun-CosyVoice 3.0集成到实时对话应用(附Python/Streamlit代码)

150ms端到端延迟实战:Fun-CosyVoice 3.0实时对话系统集成指南 当数字人客服的语音响应迟滞超过300ms,用户满意度会下降40%——这是我们在医疗咨询机器人项目中验证过的数据。今天要分享的,是如何用Fun-CosyVoice 3.0构建端到端延迟控制在150m…...

BEYOND REALITY Z-Image效果实测:1024×1024分辨率下显存占用仅18.2GB

BEYOND REALITY Z-Image效果实测:10241024分辨率下显存占用仅18.2GB 1. 这不是“又一个”文生图模型,而是写实人像的精度拐点 你有没有试过——输入一段精心打磨的提示词,点击生成,等了半分钟,结果画面全黑&#xff…...

FLUX.1-dev-fp8-dit开发环境:Anaconda虚拟环境配置

FLUX.1-dev-fp8-dit开发环境:Anaconda虚拟环境配置 1. 为什么需要专门的开发环境 你可能已经试过直接在系统Python里安装FLUX.1相关的包,结果发现不是版本冲突就是依赖打架。昨天还能跑通的代码,今天更新了一个库就报错说找不到模块&#x…...

mysql如何实现高可用集群架构_基于MHA环境搭建与部署

MHA主从切换失败报SSH连接失败,实为默认用root远程登录被禁,需手动测试ssh免密登录、显式配置ssh_user、检查密钥权限及relay_log_recovery等。MySQL 主从切换失败时 MHA 报错 SSH connection failed 怎么查不是网络不通,而是 MHA 默认用 roo…...

AD20技巧:高效利用封装管理器批量更新原理图封装

1. 封装管理器基础操作指南 第一次接触AD20的封装管理器时,我也被它强大的批量处理能力惊艳到了。这个功能对于经常需要修改大量元器件封装的工程师来说简直是救命稻草。记得上周我接手一个老项目,发现原理图中80%的电阻封装都用了错误的0805尺寸&#x…...

手把手教你用Coze工作流给公众号文章做AI摘要:从抓取、总结到飞书推送的完整避坑指南

手把手教你用Coze工作流打造智能摘要系统:从公众号到飞书的自动化实践 每天打开微信,订阅号里堆积的未读文章数字像雪球一样越滚越大——这种信息焦虑已经成为现代人的通病。我们既不想错过行业动态,又苦于时间有限无法逐篇阅读。传统的人工筛…...

从VINS-Mono到ORB-SLAM3:主流视觉惯性里程计(VIO)算法到底该怎么选?附实测数据对比

视觉惯性里程计实战选型指南:VINS-Mono与ORB-SLAM3深度对比 当你的无人机需要在无GPS的仓库内自主盘点库存,或是移动机器人必须在昏暗隧道中保持厘米级定位精度时,视觉惯性里程计(VIO)技术就成为了关键突破口。市场上主…...

项目实战:基于FPGA的3-8译码器从原理到板级验证全流程

1. 3-8译码器基础原理剖析 第一次接触数字电路时,我对译码器这个概念完全摸不着头脑。直到老师用快递柜的例子来解释:假设你有3位取件码(相当于3位二进制输入),这个取件码能对应打开8个柜子中的一个(8位输出…...

intv_ai_mk11 AI对话机器人快速上手:5分钟开启你的智能助手

intv_ai_mk11 AI对话机器人快速上手:5分钟开启你的智能助手 1. 认识你的AI助手 intv_ai_mk11是一款基于7B参数Llama架构的AI对话机器人,运行在GPU服务器上。它就像一位随时待命的智能助手,能帮你处理各种文字工作、解答问题、激发创意。 这…...

通义千问2.5-7B自动化脚本生成:DevOps集成部署案例

通义千问2.5-7B自动化脚本生成:DevOps集成部署案例 1. 引言:当AI大模型遇上DevOps自动化 在日常开发工作中,你是否遇到过这样的场景:需要快速编写部署脚本、配置CI/CD流程,或者处理重复性的系统管理任务?…...

基于springboot结合人脸识别和实名认证的校园论坛系统设计与实现演_1ke2e979_jj04

一、项目技术介绍 开发语言:Java 框架:springboot JDK版本:JDK1.8 服务器:tomcat7 数据库:mysql 5.7(一定要5.7版本) 数据库工具:Navicat11 开发软件:eclipse/myeclipse/…...

YOLO12开源大模型部署一文详解:Conda环境+PyTorch 2.5+CUDA 12.4全适配

YOLO12开源大模型部署一文详解:Conda环境PyTorch 2.5CUDA 12.4全适配 1. 引言:为什么选择YOLO12? 如果你正在寻找一个既快速又准确的目标检测模型,YOLO12绝对值得你的关注。作为Ultralytics在2025年推出的最新版本,Y…...

qclaw 如何接入第三方大模型 API 中转站

如果你正在搜索 qclaw 如何接入第三方大模型 api 中转站,可以先按一个最小思路理解:QClaw 这类智能体工具接第三方大模型 API,通常只需要准备三个参数,分别是 Base URL、API Key 和 Model。不同版本的 QClaw 入口可能叫“自定义模…...

RHEL 7.3 (x86_64) 更换国内 YUM 源

兴趣原因,在本地部署了一台VBox虚拟机,安装了Redhat7.3版本,由于无法正常使用yum源,于是便修改成国内的源,在网上找了搜索了许多的更换教程,略有繁琐,现将我自己的更换方法记录如下,…...

训医疗大模型卡脖子?我们备了 3.25PB 三甲合规成品数据集,可直接用于模型训练

做医疗 AI、药械研发、临床科研的同行,大概率都懂这种普遍的行业痛点:磨了很久的算法、堆了充足的算力,结果医疗大模型一到真实临床场景就 “水土不服”,诊断准确率、临床适配性始终上不去;新药、新器械研发卡在真实世…...

刷手机刷到颈腰痛别不当回事,颈椎病腰间盘突出正在毁掉低头族,科学防护与诊疗指南来了!

如今,"低头族" 已成为随处可见的社会现象,无论是通勤路上、吃饭时还是睡前,人们都在低头刷手机。但很多人不知道,当你沉迷于短视频时,你的脊柱正在承受着巨大的伤害。医学研究表明,低头 60 时&am…...

Python列表操作保姆级教程:从‘头歌’平台实战到日常项目避坑

Python列表实战:从编程练习到工程项目的思维跃迁 在"头歌"这类编程学习平台上,我们常常能熟练完成列表相关的各种题目——增删改查、排序切片,样样精通。但当你第一次面对真实项目中的用户数据表、日志文件或动态配置时&#xff0c…...

推荐系统中的个性化算法与效果评估

推荐系统中的个性化算法与效果评估 在信息爆炸的时代,推荐系统已成为互联网平台提升用户体验的关键技术。个性化算法通过分析用户行为、兴趣和偏好,为用户精准匹配内容,而效果评估则衡量算法的实际表现。本文将围绕推荐系统中的个性化算法与…...

Dexmal 原力灵机:开源 Dexbotic,落下具身智能的“第三十七手”

在技术领域,我们常常被那些闪耀的、可见的成果所吸引。今天,这个焦点无疑是大语言模型技术。它们的流畅对话、惊人的创造力,让我们得以一窥未来的轮廓。然而,作为在企业一线构建、部署和维护复杂系统的实践者,我们深知…...

类比前端知识来学习Java的Spring Boot实现MySql的全栈CRUD功能——搭配Svelte+Vite

在技术领域,我们常常被那些闪耀的、可见的成果所吸引。今天,这个焦点无疑是大语言模型技术。它们的流畅对话、惊人的创造力,让我们得以一窥未来的轮廓。然而,作为在企业一线构建、部署和维护复杂系统的实践者,我们深知…...

深入解析MONAI中的Dice Loss:从理论到实践

1. Dice Loss基础概念解析 第一次接触Dice Loss时,我也被这个看似简单的指标搞晕过。它不像交叉熵那样直观,但用顺手后会发现它在医学图像分割中简直是神器。Dice系数原本是用于衡量两个样本相似度的统计量,取值范围在0到1之间。在医学图像分…...

Qwen3.5-4B模型MATLAB数据分析脚本生成与优化

Qwen3.5-4B模型MATLAB数据分析脚本生成与优化 1. 科研数据分析的新助手 科研人员和工程师每天都要处理大量实验数据,从简单的曲线绘制到复杂的信号处理,MATLAB脚本编写是绕不开的工作。但反复调试代码、查阅文档往往耗费大量时间。现在,Qwe…...

CSS如何让表单在手机端友好展示_利用Flexbox实现堆叠排版

手机表单需设父容器flex-direction: column并配合max-width:100%、flex-shrink:0及显式line-height等,避免iOS/Android渲染差异导致错位、溢出或文字偏移。手机上表单字段挤成一排怎么办Flexbox 默认是 flex-direction: row,桌面端看着整齐,手…...

PP-DocLayoutV3与JavaScript交互:实现浏览器内文档实时预览与分析

PP-DocLayoutV3与JavaScript交互:实现浏览器内文档实时预览与分析 你有没有遇到过这样的场景?用户上传了一份几十页的PDF报告,你需要在网页上快速预览内容,并且自动识别出里面的标题、段落、表格和图片位置。传统做法是让用户下载…...