《Java 100 天进阶之路》第73篇:Spring IoC容器(2026版)
第73篇Spring IoC容器2026版系列导航《Java 100 天进阶之路》完整目录 |⬅️ 上一篇第72篇JavaWeb面试高频题 |➡️ 下一篇第74篇Bean生命周期待发布️ 本文阅读地图3 分钟速览第72篇完成了JavaWeb专题的收官本篇正式开启Spring全家桶专题。Spring是Java后端开发的事实标准而IoC容器是Spring最核心的基石——理解了IoC容器就理解了Spring的心脏模块核心问题一句话回答IoC是什么控制反转到底反转了什么对象的创建权从自己new反转给容器管理DI是什么依赖注入和IoC什么关系DI是IoC的具体实现方式——容器把依赖注入给对象BeanFactory vs ApplicationContext两个容器有什么区别BeanFactory是基础款懒加载ApplicationContext是旗舰款预加载企业级功能Bean是什么Spring里的Bean到底是什么被Spring IoC容器管理的Java对象Bean生命周期Bean从生到死经历什么实例化→属性填充→初始化→使用→销毁三种配置方式怎么告诉Spring要管理哪些对象XML配置、注解配置、Java配置ConfigurationBean面试最爱问高频考点有哪些见文末 小节一、核心知识点1. IoC是什么IoCInversion of Control控制反转是一种设计原则用于减少代码间的直接依赖关系。其核心思想是将对象的创建、依赖管理等控制权从业务代码转移到外部容器。通俗理解传统编程中调用者主动创建和管理被调用者的生命周期——你需要什么自己new一个。IoC模式下你只需要声明我需要什么容器会帮你创建好并注入进来。2. DI是什么DIDependency Injection依赖注入是IoC的具体实现方式。对象只通过构造函数参数、工厂方法参数或属性来定义它们的依赖项容器在创建Bean时注入这些依赖。核心关系IoC是一种思想DI是实现这种思想的技术手段。3. IoC解决了什么问题问题传统方式IoC方式耦合度高类内部直接new依赖对象换实现要改代码依赖通过构造函数/Setter传入换实现不改代码难以测试依赖硬编码无法Mock依赖可替换单元测试容易难以扩展新增功能要改已有代码通过配置/注解扩展符合开闭原则4. IoC的三大优势优势说明解耦性对象间的依赖关系通过容器配置而非硬编码实现可测试性依赖注入使得单元测试可以通过Mock对象轻松完成可配置性Bean的创建和装配过程可以通过配置文件或注解灵活调整二、通俗讲解1分钟开心学把IoC容器想象成智能工厂 配送中心本系列第68篇讲过Servlet容器Tomcat是后厨。Spring IoC容器比它更进了一步——它不只是后厨而是整条供应链的智能管理中心。传统方式自己new你想做一道菜得自己种菜、自己养猪、自己磨调料——所有依赖都得自己搞定。IoC方式容器管理你只需要告诉工厂我要做宫保鸡丁工厂自动把鸡肉、花生、干辣椒配齐送到你手上——你只管炒菜。两个容器的比喻BeanFactory小区楼下的自动售货机——你要什么投币才出货懒加载功能单一。ApplicationContext大型仓储超市——一开门就把所有货品都摆好预加载还提供推车、导购、退换货等全套服务事件、国际化、AOP等。三、Spring IoC容器体系3.1 容器层级关系Spring的IoC容器以BeanFactory为顶层接口ApplicationContext是其子接口org.springframework.beans和org.springframework.context包是Spring Framework IoC容器的基础。3.2 BeanFactory vs ApplicationContext这是Spring面试100%会问的对比题。对比维度BeanFactoryApplicationContext官方定位最基础的IoC容器接口定义Bean管理的核心规范BeanFactory的子接口增加了企业级功能加载策略懒加载——调用getBean()时才创建实例预加载——启动时一次性创建所有单例Bean核心功能只提供getBean()等基础功能继承BeanFactory全部功能 10大扩展功能实际使用几乎见不到每天都用——SpringApplication.run(...)返回的就是它常用实现DefaultListableBeanFactoryAnnotationConfigApplicationContext、ClassPathXmlApplicationContextApplicationContext比BeanFactory多出的核心功能功能说明事件发布与监听ApplicationEventEventListener国际化i18nMessageSource支持多语言资源加载ResourceLoader支持classpath:、file:等环境抽象EnvironmentProfile支持多环境配置AOP自动代理自动识别Aspect并织入Transactional直接生效Web应用支持WebApplicationContext记忆口诀BeanFactory是基础款够用但简陋ApplicationContext是旗舰款功能全、体验好。实际项目100%用ApplicationContext。3.3 Bean是什么在Spring中构成应用程序骨架并由Spring IoC容器管理的对象称为Bean。Bean是由Spring IoC容器实例化、组装和管理的对象。本质Bean就是一个普通的Java对象唯一特殊之处在于——它由Spring容器管理而不是你自己new出来的。四、Bean生命周期5阶段Bean的生命周期是Spring面试的必考项需要掌握以下核心阶段初始化阶段详解这是生命周期中最复杂的阶段步骤说明① Aware接口回调BeanNameAware、BeanFactoryAware等② BeanPostProcessor前置处理初始化前的拦截③InitializingBean.afterPropertiesSet()接口方式初始化④ 自定义init-methodXML或注解指定的初始化方法⑤ BeanPostProcessor后置处理初始化后的拦截AOP代理在此完成五、三种Bean配置方式容器通过读取配置元数据来获取指令——告诉它要实例化哪些对象、如何装配它们。配置元数据可以用三种方式表达5.1 XML配置传统方式!-- applicationContext.xml --beansbeaniduserServiceclasscom.example.UserServiceImplpropertynameuserDaorefuserDao//beanbeaniduserDaoclasscom.example.UserDaoImpl//beans// 加载XML配置ApplicationContextctxnewClassPathXmlApplicationContext(applicationContext.xml);UserServiceservicectx.getBean(userService,UserService.class);5.2 注解配置主流方式Service// 声明为业务层BeanpublicclassUserServiceImplimplementsUserService{Autowired// 自动注入依赖privateUserDaouserDao;}Repository// 声明为数据访问层BeanpublicclassUserDaoImplimplementsUserDao{// 数据访问逻辑}// 启动容器Spring Boot自动完成ApplicationContextctxnewAnnotationConfigApplicationContext(com.example);注解含义Component是通用注解Service、Repository、Controller是其特化版本分别用于业务层、数据层和控制层。5.3 Java配置ConfigurationBeanConfiguration// 声明这是一个配置类publicclassAppConfig{Bean// 方法返回值会被注册为Spring容器中的BeanpublicUserServiceuserService(UserDaouserDao){returnnewUserServiceImpl(userDao);}BeanpublicUserDaouserDao(){returnnewUserDaoImpl();}}// 加载Java配置ApplicationContextctxnewAnnotationConfigApplicationContext(AppConfig.class);Configuration原理配置类会经过ConfigurationClassPostProcessor后置处理器处理解析所有Bean方法并转换为Bean定义。Configuration类本身也会被注册为容器中的一个Bean。六、避坑要点错误/误区后果正确做法混淆IoC和DI的概念面试答非所问IoC是思想DI是实现方式认为new出来的对象也是Bean容器无法管理依赖注入失效只有容器创建和管理的对象才是Bean误以为项目用的是BeanFactory对容器能力理解有偏差实际项目100%用ApplicationContext不知道Configuration和Component的区别配置类被代理行为异常Configuration是配置类Full模式Component是普通组件在Bean的构造函数中做耗时操作容器启动变慢耗时操作放到PostConstruct或afterPropertiesSet中七、面试高频考点Q1IoC和DI是什么关系IoC控制反转是一种设计思想——将对象的创建和依赖管理的控制权从代码转移到容器。DI依赖注入是IoC的具体实现方式——对象通过构造函数参数、工厂方法参数或属性来定义依赖容器在创建Bean时注入这些依赖。IoC是理念DI是做法。Q2BeanFactory和ApplicationContext的区别BeanFactory是Spring最基础的IoC容器接口采用懒加载策略只提供getBean()等基础功能。ApplicationContext是BeanFactory的子接口采用预加载策略——启动时一次性创建所有单例Bean还额外提供了事件发布、国际化、资源加载、AOP集成等企业级功能。实际项目100%用ApplicationContext。Q3Spring Bean的生命周期有哪些阶段五个阶段①实例化——容器通过反射调用构造函数创建实例②属性填充——通过依赖注入设置属性值③初始化——执行Aware回调、BeanPostProcessor前置处理、afterPropertiesSet、自定义init-method、BeanPostProcessor后置处理④使用——Bean被应用程序调用⑤销毁——容器关闭时按相反顺序触发销毁逻辑。Q4Configuration和Bean的作用是什么Configuration标记在类上声明这是一个配置类相当于XML配置文件。Bean标记在配置类的方法上指示该方法返回的对象应该被注册为Spring容器中的Bean。配置类会经过ConfigurationClassPostProcessor处理将Bean方法转换为Bean定义。Q5Spring支持哪几种Bean配置方式三种①XML配置——传统的bean标签方式②注解配置——通过Component、Service、Autowired等注解③Java配置——通过ConfigurationBean。现代Spring Boot项目以注解配置和Java配置为主。 面试官追问陷阱加分题追问1“Configuration标注的类和Component标注的类有什么区别”Configuration类会被Spring动态代理保证其中Bean方法调用时返回的是容器中已存在的Bean实例保证单例。而Component标注的普通类不会被代理。简单说Configuration是Full模式Bean之间调用走代理Component是Lite模式不走代理。追问2“ApplicationContext启动时做了什么事能简单说下流程吗” 核心是refresh()方法。主要步骤①创建并准备BeanFactory②读取配置元数据XML/注解/Java配置生成BeanDefinition③注册BeanPostProcessor④初始化所有非懒加载的单例Bean⑤发布上下文就绪事件。这就是为什么ApplicationContext启动比BeanFactory慢——它把活都提前干完了。八、练习题简答题请用自己的话解释IoC和DI的关系。代码题使用ConfigurationBean方式配置一个DataSourceBean和一个UserDaoBeanUserDao依赖DataSource。分析题某Spring Boot项目启动非常慢经排查发现启动时创建了大量Bean。请分析可能的原因并给出优化建议。 你的学习进度当前第73篇 / 共108篇 ·进阶篇Spring全家桶第73~82篇✅ 已完成基础篇44篇 第45~73篇 正在学第73篇⏳ 待学习第74~108篇 完整目录 学习指南 | 订阅本专栏不错过每一篇 下一篇文章预告下一篇《第74篇Bean生命周期》内容简介Bean生命周期完整15步详解、BeanPostProcessor原理、InitializingBean与PostConstruct执行顺序、销毁流程、扩展点实战。Spring全家桶专题持续推进深入Bean生命周期《Java 100 天进阶之路 | 从入门到上岗就业》每天一篇建议收藏 关注一起100天拿offer 点击关注我更新后第一时间收到推送

相关新闻

解决PyTorch多GPU训练中CUDA设备编号错乱问题

解决PyTorch多GPU训练中CUDA设备编号错乱问题

1. 从一次诡异的“资源不足”报错说起那天下午,我正在调试一个需要多卡并行的PyTorch模型训练脚本。环境是实验室一台配置了四块RTX 4090的服务器,nvidia-smi里看得清清楚楚,四块卡都安静地待着,显存占用几乎为零。我信心满满地运…

2026/9/24 14:30:40 阅读更多 →
Unlock Music终极指南:浏览器端轻松解锁加密音乐文件

Unlock Music终极指南:浏览器端轻松解锁加密音乐文件

Unlock Music终极指南:浏览器端轻松解锁加密音乐文件 【免费下载链接】unlock-music 在浏览器中解锁加密的音乐文件。原仓库: 1. https://github.com/unlock-music/unlock-music ;2. https://git.unlock-music.dev/um/web 项目地址: https:…

2026/9/26 15:07:38 阅读更多 →
如何快速解决GitHub下载慢的问题?这个免费插件让速度提升10倍

如何快速解决GitHub下载慢的问题?这个免费插件让速度提升10倍

如何快速解决GitHub下载慢的问题?这个免费插件让速度提升10倍 【免费下载链接】Fast-GitHub 国内Github下载很慢,用上了这个插件后,下载速度嗖嗖嗖的~! 项目地址: https://gitcode.com/gh_mirrors/fa/Fast-GitHub 如果你在…

2026/9/22 11:20:58 阅读更多 →

最新新闻

自采四分类运动想象BCI数据集解析:从EEGLAB预处理到实时脑控算法落地

自采四分类运动想象BCI数据集解析:从EEGLAB预处理到实时脑控算法落地

简介:适用于2025世界机器人大赛BCI脑控机器人大赛MetaBCI创新应用开发赛项的开发者与研究者,这份压缩包围绕自采四分类运动想象数据集,覆盖脑电信号采集、预处理、特征提取、分类器训练及实时脑控算法优化全流程。压缩包共64个文件&#xff0…

2026/9/26 16:42:46 阅读更多 →
基于机器学习的异常驾驶检测:从OBD数据到隔离森林完整流程

基于机器学习的异常驾驶检测:从OBD数据到隔离森林完整流程

简介:一套面向机器学习与智能交通方向学习者的异常驾驶检测项目,聚焦驾驶行为中的异常模式识别,提供可运行的源码与说明书,便于按需二次修改。压缩包内共有六个文件,以三个交互式编程笔记为主,配合两个网页…

2026/9/26 16:42:46 阅读更多 →
桌面智能体从聊天到干活的工程化实践:技能化与项目化

桌面智能体从聊天到干活的工程化实践:技能化与项目化

1. 桌面智能体到底卡在哪:从“能聊天”到“能干活”的那道坎桌面智能体这个词这两年热得发烫,但真正上手用过一圈的人心里都清楚,大部分产品还停留在“能聊天”的阶段。你问它今天天气怎么样,它答得挺溜;你让它帮你把桌…

2026/9/26 16:42:45 阅读更多 →
Codex CLI 手搓自动化脚本:配置、DeepSeek 接入与代理报错排查

Codex CLI 手搓自动化脚本:配置、DeepSeek 接入与代理报错排查

这次我们来看 Codex CLI 怎么用来手搓自动化脚本。很多人对 Codex 的印象还停留在聊天界面里写代码,实际上它的核心价值在命令行 Agent 模式:你把需求用自然语言写清楚,它自己规划任务、写脚本、执行命令、读终端报错、改代码,循环…

2026/9/26 16:42:45 阅读更多 →
QLoRA微调实战:从8GB显存到GGUF本地部署

QLoRA微调实战:从8GB显存到GGUF本地部署

1. 项目概述:为什么QLoRA是当前微调大模型最务实的选择“大语言模型QLoRA微调方法(终)”这个标题里的“终”字,不是指技术终点,而是指一种实践意义上的闭环——它标志着在消费级显卡、单机环境、有限显存(甚…

2026/9/26 16:42:45 阅读更多 →
AI Agent标准架构拆解:用TaoToken统一Key打通LLM与Tools的Loop

AI Agent标准架构拆解:用TaoToken统一Key打通LLM与Tools的Loop

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/26 16:41:45 阅读更多 →

日新闻

数据库课后习题答案别硬背:当测试用例集刷,效率翻倍

数据库课后习题答案别硬背:当测试用例集刷,效率翻倍

简介:万常选版《数据库原理与设计》课后习题答案资源,覆盖第2至6章及第9章,适合正在学习关系模型、数据库建模、关系数据理论与模式求精的本科生、自学者作为复习与自测材料。压缩包共7个文件,含3个doc参考答案、2个sql示例脚本、…

2026/9/26 0:00:25 阅读更多 →
学校官网模拟全流程实践:从页面布局到后端接口与部署

学校官网模拟全流程实践:从页面布局到后端接口与部署

如果你正在找一门 Web 大作业的题目,或者刚开始接触 Web 前端开发想做点能拿来展示的东西,“学校官网模拟”几乎是最稳的选择。题目看着简单,但要把导航、新闻列表、轮播 Banner、二级页面、后台数据都串起来,其实已经把前端布局、…

2026/9/26 0:00:25 阅读更多 →
超级玛丽游戏源码C++:从零搭建横版跳跃游戏工程

超级玛丽游戏源码C++:从零搭建横版跳跃游戏工程

简介:这是一份面向游戏开发初学者与C进阶学习者的超级玛丽(超级马里奥)游戏源码,基于C面向对象编程实现,适合想通过经典项目理解游戏主循环、角色类设计、地图关卡加载与物理碰撞检测的读者参考。压缩包共49个文件&…

2026/9/26 0:00:25 阅读更多 →

周新闻

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

直接铺开项目本身吧。这几个月我一直在折腾一件事:用Flutter给OpenHarmony做一款游戏集合类的App,说白了就是把若干小游戏塞进一个壳里,用统一入口分发。这个方向本身不算新鲜,真正让我花了不少心思的,是首页那堆游戏卡…

2026/9/25 19:27:14 阅读更多 →
Word表格编号全攻略:从列表编号到题注交叉引用

Word表格编号全攻略:从列表编号到题注交叉引用

写Word文档,最让人头疼的往往是那些“看起来不起眼”的小问题。比如表格编号这事:今天在表后面多加了两个空白行,明天给客户交稿前发现整个章节的编号全部错位,光是挨个改序号就能耗掉大半个下午。我前阵子帮人整理一份上百页的技…

2026/9/25 11:15:26 阅读更多 →
从第一个站到第二个站:独立开发者的静态网站选型与落地实践

从第一个站到第二个站:独立开发者的静态网站选型与落地实践

1. 项目概述1.1 核心需求解析做独立开发者这几年,说实话,第一个网站上线的那天晚上我兴奋得没睡着。但等它跑了半年,流量惨淡、功能臃肿、代码自己都懒得看第二遍之后,我才慢慢琢磨明白一个道理:第一个网站是练手&…

2026/9/25 20:29:09 阅读更多 →

月新闻

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

2026/9/25 20:29:43 阅读更多 →
容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…

2026/9/25 20:29:31 阅读更多 →
容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步分类:[工程技术]细分主题:Docker 容器化技术与镜像安全管理:核心链路的逐步实现与关键代码取舍面对一个积累了五六年历史包袱的单体架构应用(包含 Web 接口、后台…

2026/9/25 19:27:26 阅读更多 →