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

张开发
2026/5/17 16:08:44 15 分钟阅读
Spring Boot 入门:理解 IoC 容器与 Bean 管理(附图解)
标签Spring Boot、IoC、DI、Java引言Spring 最核心的理念之一是IoCInversion 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 MapString, 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. 完成注入并注册 │ └───────────────────┘容器内部结构简化示意图┌────────────────────────────────┐ │ ApplicationContextIoC 容器 │ │ │ │ ┌───────────────┐ │ │ │ BeanDog │──┐ │ │ └───────────────┘ │ │ │ ▼ 注入依赖 │ │ ┌───────────────┐ │ │ │ BeanPerson │内部含有 Dog│ │ └───────────────┘ │ │ │ └────────────────────────────────┘从容器获取 Bean 的几种方式// 按名字获取 Person zhangsan (Person) ioc.getBean(zhangsan); // 按类型获取 Person bean ioc.getBean(Person.class); // 获取该类型所有 Bean MapString, Person type ioc.getBeansOfType(Person.class);运行结果示例IOC 容器对象 org.springframework.boot... ------------------------------------------------ 通过名字获取组件zhangsan Person{name张三, age18, gendermale} 通过类型获取组件bean Person{name张三, age18, gendermale} 容器中所有 Person 类型的组件{zhangsan..., lisi...}可以看到我们的容器已经成功托管了多个 Bean并支持灵活的获取方式。 小结内容说明IoC控制反转Spring 接管对象的创建与管理DI依赖注入Spring 自动解决对象依赖关系Bean / Component向 IoC 容器注册组件ApplicationContextIoC 容器核心接口getBean()从容器获取组件对象延伸阅读Spring 官方文档The IoC Container《Spring 实战》第五版第二章——装配 BeanSpring Boot 自动装配机制解析结语IoC 与 DI 是 Spring 的灵魂。一旦理解了这部分你会发现Spring 的所有高级特性AOP、事务、自动配置等都是在这个基础上构建的。是否希望我帮你生成一段适合在 CSDN “文章摘要区” 使用的简短摘要 SEO 关键字推荐这可以让博客在 CSDN 搜索结果中更靠前。

更多文章