设计思想
将程序的控制权从开发者手中转移到框架或容器中。传统开发中,开发者需要主动创建和管理对象(如通过
new 关键字),而 IoC 通过容器统一管理对象的生命周期和依赖关系,开发者只需声明需要什么,由容器负责如何创建和注入。
IOC 容器
Spring 的 IoC 容器就是 IoC 思想的一个方案实现。由其管理的组件称为 Bean。Spring 提供两种方式创建容器:
-
BeanFactory
最基础的容器接口,提供最基本的 IoC 功能。面向 Spring 本身,不提供给开发人员使用。 -
ApplicationContext
ApplicationContext 是BeanFactory 的子接口,支持事件发布、国际化、资源加载、AOP、事务管理等。
常用实现类:实现类 简介 ClassPathXmlApplicationContext从类路径下的 XML 文件加载配置。 AnnotationConfigApplicationContext基于 Java 注解和配置类加载配置。 FileSystemXmlApplicationContext从文件系统路径加载 XML 配置。 WebApplicationContext专为 Web 应用设计的实现(如 Spring MVC 中使用)。
Bean 的作用域
Spring 支持以下 6 种标准作用域,可通过 @Scope 注解配置:
| 作用域 | 说明 |
|---|---|
| singleton | 默认作用域,每个 Spring 容器中仅存在一个实例(单例) |
| prototype | 每次依赖注入或 getBean() 调用时创建新实例 |
| request | 每个 HTTP 请求创建一个实例(Web 应用) |
| session | 每个用户会话( Session )创建一个实例(Web 应用) |
| application | 整个 Web 应用生命周期内一个实例(类似 ServletContext) |
| websocket | 每个 WebSocket 会话一个实例(WebSocket 应用) |
Bean 的生命周期
%% Spring Bean 生命周期流程图
flowchart TD
A[实例化 Bean] --> B[属性注入/依赖注入]
B --> C[调用 Aware 接口方法]
C --> D[BeanPostProcessor.postProcessBeforeInitialization]
D --> E[执行 @PostConstruct 方法]
E --> F[执行 InitializingBean.afterPropertiesSet]
F --> G[执行自定义 init 方法]
G --> H[BeanPostProcessor.postProcessAfterInitialization]
H --> I((Bean 就绪))
I --> J[容器关闭]
J --> K[执行 @PreDestroy 方法]
K --> L[执行 DisposableBean.destroy]
L --> M[执行自定义 destroy 方法]