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

Spring Boot 入门:理解 IoC 容器与 Bean 管理(附图解)

标签:Spring Boot、IoC、DI、Java


引言

Spring 最核心的理念之一是IoC(Inversion of Control,控制反转),它让我们无需手动new对象,而是把对象交给Spring 容器来统一创建和管理。
下面通过一个实际示例,带你一步步理解 IoC 的工作原理与依赖注入机制。


项目结构

com.example.spring.ioc ├── Spring01IocApplication.java // 程序入口 ├── bean │ ├── Person.java │ └── Dog.java

主程序代码

package com.example.spring.ioc; import com.example.spring.ioc.bean.Dog; import com.example.spring.ioc.bean.Person; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.context.ConfigurableApplicationContext; import org.springframework.context.annotation.Bean; import java.util.Map; @SpringBootApplication public class Spring01IocApplication { public static void main(String[] args) { // 1.启动 Spring 应用,获得 IoC 容器 ConfigurableApplicationContext ioc = SpringApplication.run(Spring01IocApplication.class, args); System.out.println("IOC 容器对象 = " + ioc); System.out.println("========================"); // 2.通过名字获取 Bean Person zhangsan = (Person) ioc.getBean("zhangsan"); System.out.println("通过名字获取组件:zhangsan = " + zhangsan); // 3.通过类型获取 Bean Person personBean = ioc.getBean(Person.class); System.out.println("通过类型获取组件:bean = " + personBean); // 4.获取某个类型的所有 Bean Map<String, Person> typeMap = ioc.getBeansOfType(Person.class); System.out.println("容器中所有 Person 类型的组件:" + typeMap); } // ========= 自定义注册 Bean ========= @Bean("zhangsan") public Person zhangsan() { return new Person("张三", 18, "male"); } @Bean("lisi") public Person lisi() { return new Person("李四", 18, "male"); } @Bean public Dog dog() { return new Dog(); } }

@SpringBootApplication 的作用

这个注解组合了三个核心功能:

  • @Configuration—— 声明当前类是一个配置类;
  • @ComponentScan—— 自动扫描当前包及子包下的组件;
  • @EnableAutoConfiguration—— 打开自动配置机制。

应用启动时,SpringApplication.run()会创建一个IoC 容器来托管所有组件(Bean)。


IoC 容器的工作流程图

启动应用 │ ▼ ┌────────────────────┐ │ @SpringBootApplication │ │ -> SpringApplication.run() │ └────────────────────┘ │ ▼ ┌────────────────────┐ │ 创建 IoC 容器(ApplicationContext)│ └────────────────────┘ │ ▼ ┌────────────────────┐ │ 扫描配置类与 Bean 定义 │ │ @Configuration / @Bean │ └────────────────────┘ │ ▼ ┌────────────────────┐ │ 实例化 Bean 对象 │ │ 注入依赖并保存到容器中 │ └────────────────────┘ │ ▼ ┌────────────────────┐ │ 开发者获取 Bean 使用 │ │ ioc.getBean(...) │ └────────────────────┘

理解重点:Spring Boot 启动后就会构建一个 IoC 容器,它接管所有组件的创建与装配。


Bean 注册与依赖注入示意图

来看一个有依赖的 Bean 示例:

@Component public class Person { private final Dog dog; @Autowired public Person(Dog dog) { // Spring 自动注入 Dog this.dog = dog; } public void play() { dog.wang(); } }

容器工作流程如下:

┌───────────────────┐ │ 1. 启动 Spring 容器 │ └─────────┬─────────┘ │ 扫描所有 Bean ▼ ┌───────────────────┐ │ 2. 创建 Dog Bean │ └─────────┬─────────┘ │ ▼ ┌───────────────────┐ │ 3. 创建 Person Bean │ │ 需要 Dog → 注入依赖 │ └─────────┬─────────┘ │ ▼ ┌───────────────────┐ │ 4. 完成注入并注册 │ └───────────────────┘

容器内部结构(简化示意图)

┌────────────────────────────────┐ │ ApplicationContext(IoC 容器) │ │ │ │ ┌───────────────┐ │ │ │ Bean:Dog │──┐ │ │ └───────────────┘ │ │ │ ▼ 注入依赖 │ │ ┌───────────────┐ │ │ │ Bean:Person │(内部含有 Dog)│ │ └───────────────┘ │ │ │ └────────────────────────────────┘

从容器获取 Bean 的几种方式

// 按名字获取 Person zhangsan = (Person) ioc.getBean("zhangsan"); // 按类型获取 Person bean = ioc.getBean(Person.class); // 获取该类型所有 Bean Map<String, Person> type = ioc.getBeansOfType(Person.class);

运行结果示例

IOC 容器对象 = org.springframework.boot... ------------------------------------------------ 通过名字获取组件:zhangsan = Person{name=张三, age=18, gender=male} 通过类型获取组件:bean = Person{name=张三, age=18, gender=male} 容器中所有 Person 类型的组件:{zhangsan=..., lisi=...}

可以看到,我们的容器已经成功托管了多个 Bean,并支持灵活的获取方式。


🧾 小结

内容说明
IoC(控制反转)Spring 接管对象的创建与管理
DI(依赖注入)Spring 自动解决对象依赖关系
@Bean / @Component向 IoC 容器注册组件
ApplicationContextIoC 容器核心接口
getBean()从容器获取组件对象

延伸阅读

  • Spring 官方文档:The IoC Container
  • 《Spring 实战》第五版:第二章——装配 Bean
  • Spring Boot 自动装配机制解析

结语

IoC 与 DI 是 Spring 的灵魂。
一旦理解了这部分,你会发现:Spring 的所有高级特性(AOP、事务、自动配置等)都是在这个基础上构建的。


是否希望我帮你生成一段适合在 CSDN “文章摘要区” 使用的简短摘要 + SEO 关键字推荐?这可以让博客在 CSDN 搜索结果中更靠前。

http://www.jsqmd.com/news/616517/

相关文章:

  • **Pandas实战进阶:用“链式操作+自定义函数”重构数据清洗流程,效率提升3倍不止!**在日常数据分析中,我
  • C# 已经有了IEnumerator为什么还要封装一个IEnumerable呢
  • 文墨共鸣智能助手:面向国学学习者的文言文白话转译相似度评估
  • 7.ARP 代理与端口隔离:满足通信需求,保证通信安全
  • NEURAL MASK 与 Vue.js 打造交互式图像重构效果演示平台
  • Qwen3语义雷达:开箱即用的智能搜索工具,效果实测分享
  • 第7章:支持向量机(SVM)
  • 2026上海冷却塔维修品牌怎么选:无锡良机冷却塔、昆山冷却塔维修、昆山良机冷却塔、杭州良机冷却塔、良机冷却塔厂家选择指南 - 优质品牌商家
  • 2026年比较好的商用净水设备/威海净水器/净水器安装生产厂家推荐 - 行业平台推荐
  • PP-DocLayoutV3实战案例:从扫描合同到结构化数据,完整流程解析
  • HowTo-易连EDI-EasyLink如何进行一键部署
  • 极客玩法:OpenClaw+Qwen3.5-9B-AWQ-4bit搭建智能相册分类系统
  • 2026年比较好的柳州窑埠古镇生日宴/柳州氛围感生日宴/柳州小众生日宴高端餐厅推荐 - 行业平台推荐
  • ATmega32U4智能手表固件:资源受限嵌入式系统设计实践
  • 2026年JDG穿线管技术全解析:选型、合规与优质厂家参考 - 优质品牌商家
  • OpenClaw配置备份:Kimi-VL-A3B-Thinking多模态环境迁移指南
  • Multisim与Phi-4-mini-reasoning联动:从理论计算到仿真验证的智能辅助
  • 万象熔炉 | Anything XL入门必看:纯本地无网推理杜绝隐私泄露实践
  • 2026年小预算柳州氛围感生日宴/柳州网红生日宴聚会必去店 - 行业平台推荐
  • 反应力场的后处理技巧
  • 零基础转型AI产品经理?这份7阶段学习全攻略,助你少走两年弯路,抢占未来高薪岗位!
  • OpenClaw使用习惯分析:Phi-3-vision-128k-instruct最常被调用的5类图文指令
  • 2026年评价高的家用净水器/家用净水/净水/净水设备优质厂家推荐榜 - 行业平台推荐
  • GoCodingInMyWay炔
  • 2026年成都叛逆学校怎么选:戒网瘾学校基地/戒网瘾学校推荐/戒网瘾学校电话/逃学叛逆学校/逃学戒网瘾学校/选择指南 - 优质品牌商家
  • Phi-3-mini-4k-instruct-gguf实战:新手小白也能轻松搞定摘要整理与简短创作
  • Gemini 写提示词总翻车?究竟是哪里出了问题?
  • Phi-4-Reasoning-Vision详细步骤:Streamlit宽屏布局CSS定制与响应式优化
  • MiniCPM-V-2_6数据中心:机柜图识别+温控与负载均衡建议
  • ESP32嵌入式Syslog日志库MyLog深度解析