SpringBean 创建过程详解
程序员面试资料大全|各种技术书籍等资料-1000G
Spring Bean 的完整生命周期
1. Bean 元数据加载阶段
- 配置解析:Spring 容器解析 XML、Java Config 或注解配置
- BeanDefinition 注册:将 Bean 定义信息注册到 BeanDefinitionRegistry
- 依赖关系分析:解析 Bean 之间的依赖关系
2. 实例化阶段
// 伪代码展示实例化过程
protected BeanWrapper createBeanInstance(String beanName, RootBeanDefinition mbd, Object[] args) {// 1. 通过工厂方法实例化if (mbd.getFactoryMethodName() != null) {return instantiateUsingFactoryMethod(beanName, mbd, args);}// 2. 通过构造函数实例化(解决构造器参数依赖)Constructor<?>[] ctors = determineConstructorsFromBeanPostProcessors(beanClass, beanName);if (ctors != null || mbd.getResolvedAutowireMode() == AUTOWIRE_CONSTRUCTOR) {return autowireConstructor(beanName, mbd, ctors, args);}// 3. 默认无参构造器实例化return instantiateBean(beanName, mbd);
}
3. 属性填充阶段(依赖注入)
- 字段注入:通过反射直接设置字段值
- Setter 注入:调用 setter 方法
- 方法注入:处理 @Autowired 注解的方法
4. 初始化阶段(关键扩展点)
-
Aware 接口回调:
- BeanNameAware:设置 Bean 名称
- BeanFactoryAware:设置 BeanFactory 引用
- ApplicationContextAware:设置 ApplicationContext 引用
-
BeanPostProcessor 前置处理:
// 所有 BeanPostProcessor 的 postProcessBeforeInitialization 方法 for (BeanPostProcessor bp : getBeanPostProcessors()) {Object current = bp.postProcessBeforeInitialization(result, beanName);if (current == null) return result;result = current; }
-
初始化方法执行:
- InitializingBean 接口的 afterPropertiesSet() 方法
- 自定义 init-method(XML 配置或 @PostConstruct 注解)
-
BeanPostProcessor 后置处理:
// 所有 BeanPostProcessor 的 postProcessAfterInitialization 方法 for (BeanPostProcessor bp : getBeanPostProcessors()) {Object current = bp.postProcessAfterInitialization(result, beanName);if (current == null) return result;result = current; }
5. 使用阶段
- Bean 进入可用状态
- 被其他 Bean 依赖或通过上下文获取
6. 销毁阶段
- DisposableBean 接口的 destroy() 方法
- 自定义 destroy-method(XML 配置或 @PreDestroy 注解)
程序员面试资料大全|各种技术书籍等资料-1000G