当前位置: 首页 > 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.cnnetsun.cn/news/1794897.html

相关文章:

  • Ostrakon-VL-8B GPU算力优化:Bfloat16 vs FP16显存占用与精度平衡分析
  • Omni-Vision Sanctuary 服务端部署:使用 Node.js 构建高性能图像生成 API 网关
  • Nomic-Embed-Text-V2-MoE工具链整合:在IDE中快速调试模型API调用代码
  • PCB设计中特殊元器件布局与热管理实战技巧
  • OpenClaw内存优化:在8GB设备运行Qwen3.5-9B-4bit方案
  • OpenClaw开源贡献指南:为千问3.5-27B开发新技能并提交
  • 2026年天然木蜡油订做厂家排行榜揭晓,谁能拔得头筹?
  • 从零构建统一大模型应用平台:对话、代码、任务代理全解析!
  • OpenClaw备份方案:千问3.5-9B配置与数据的自动保护
  • OpenClaw定时任务实战:Qwen3-4B驱动夜间数据抓取与处理
  • CAN 与 RS232/485 协议转换器的应用?
  • 跨平台文件处理:OpenClaw+Phi-3-vision-128k-instruct自动整理截图与文档
  • 串口传输结构体:需要考虑结构体对齐的问题#pragma pack (1)
  • OpenClaw自动化测试实践:Qwen3-14B驱动的CI/CD辅助方案
  • 从自动驾驶到医疗成像:一台AWG如何撬动超声MEMS的百亿市场?
  • 【OpenClaw】通过 Nanobot 源码学习架构---()总体患
  • Go 语言构建 Agent 服务的优势
  • OpenClaw语音控制扩展:千问3.5-27B实现本地语音指令识别
  • CAN + 以太网 + Wi-Fi + BLE + TCP/IP + MQTT +HTTP协议层级
  • 效率提升50%:OpenClaw+Kimi-VL-A3B-Thinking自动化周报生成方案
  • AI动态经济图谱技术融资800万
  • C#/.NET/.NET Core优秀项目和框架2026年3月简报
  • Awesome-TTRSS移动端完美适配:随时随地享受RSS阅读
  • Big-O 表示法简介(基础入门)
  • Beyond All Reason多人对战攻略:团队协作与战术配合的黄金法则
  • React Native Collapsible实战案例:从电商应用到社交平台的完整实现
  • 快速上手LexikJWTAuthenticationBundle:10分钟搭建安全API认证系统
  • CatGFX:ESP32驱动CAT热敏打印机的Adafruit GFX兼容库
  • MSGEQ7音频频谱芯片驱动设计与抗干扰实践
  • SecretFlow机器学习算法库:线性模型、决策树、朴素贝叶斯全解析