Spring ioc底层原理是如何运作的?
摘要:要彻底搞懂 Spring IoC 的底层原理,核心是抓住「IoC 容器的生命周期」和「Bean 的生命周期」两大主线——IoC 本质是 Spring 容器接管了对象的创建、依赖注入、销毁等全流程,底层靠「反射 + 设计模式
要彻底搞懂 Spring IoC 的底层原理,核心是抓住「IoC 容器的生命周期」和「Bean 的生命周期」两大主线——IoC 本质是 Spring 容器接管了对象的创建、依赖注入、销毁等全流程,底层靠「反射 + 设计模式」实现。
一、先明确核心概念
IoC(控制反转):把对象创建、依赖管理的权力从开发者代码转移到 Spring 容器,核心是「反转了对象的创建权」。
DI(依赖注入):IoC 的具体实现方式,容器在创建 Bean 时,自动将依赖的 Bean 注入到目标 Bean 中(比如 @Autowired)。
IoC 容器:Spring 中 IoC 的载体,核心接口是 BeanFactory(最基础)和 ApplicationContext(增强版,日常开发用)。
二、IoC 容器的核心实现:两大核心接口
Spring IoC 容器的底层是一套接口体系,先理清核心接口的关系:
graph LR
BeanFactory[BeanFactory:基础容器接口] --> ListableBeanFactory[ListableBeanFactory:批量获取Bean]
ListableBeanFactory --> ApplicationContext[ApplicationContext:增强版容器]
ApplicationContext --> ClassPathXmlApplicationContext[ClassPathXmlApplicationContext:XML配置]
ApplicationContext --> AnnotationConfigApplicationContext[AnnotationConfigApplicationContext:注解配置]
1. BeanFactory(最底层)
定义了 IoC 容器的最核心能力:getBean(String name)(获取 Bean)、containsBean(String name)(判断 Bean 是否存在)等。
特点:懒加载——只有调用 getBean() 时才创建 Bean,轻量但功能少(无事件、国际化等)。
2. ApplicationContext(日常开发用)
继承 BeanFactory,扩展了更多功能:
非懒加载(默认启动时创建所有单例 Bean);
支持国际化、事件发布、资源加载(比如读取配置文件);
常见实现类:AnnotationConfigApplicationContext(注解配置)、ClassPathXmlApplicationContext(XML 配置)。
三、IoC 容器的核心流程(底层执行步骤)
以最常用的「注解配置(@Configuration/@Component)」为例,拆解 IoC 容器从启动到创建 Bean 的全流程,这是 IoC 底层的核心逻辑:
步骤 1:容器初始化(加载配置元数据)
开发者创建 ApplicationContext 实例时(比如 new AnnotationConfigApplicationContext(AppConfig.class)),容器首先加载「配置元数据」——即哪些类需要被创建为 Bean(比如扫描 @Component/@Service 注解的类)。
底层逻辑:
解析配置类(如 AppConfig)或扫描指定包;
将扫描到的类封装为 BeanDefinition(Bean 定义对象)——这是 IoC 核心!BeanDefinition 包含了 Bean 的所有信息:类名、是否单例、依赖关系、初始化方法等,相当于「Bean 的说明书」。
步骤 2:注册 BeanDefinition 到容器
容器将解析得到的 BeanDefinition 注册到 BeanDefinitionRegistry(注册表)中,注册表本质是一个 Map<String, BeanDefinition>(key 是 Bean 名称,value 是 Bean 定义)。
