Spring BeanFactory 初始化 和 Bean 生命周期
2024-09-02 23:38:24
(version:spring-context-4.3.15.RELEASE)
AbstractApplicationContext#refresh()
public void refresh() throws BeansException, IllegalStateException {
// Prepare this context for refreshing.
prepareRefresh(); // Tell the subclass to refresh the internal bean factory.
// 1. 创建一个 BeanFactory 的实例(DefaultListableBeanFactory)
// 2. 加载bean的定义 BeanDefinition,并注册到 beanFactory 中
// loadBeanDefinitions(beanFactory) --> registerBeanDefinitions()
ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory(); // Prepare the bean factory for use in this context.
// 给 beanFactory 做上些前期配置:
// 1. 添加 BeanPostProcessor
// 2. 注册一些可以解析的依赖和 bean,如:BeanFactory, ApplicationContext
prepareBeanFactory(beanFactory); // Allows post-processing of the bean factory in context subclasses.
// 允许子类对 beanFactory 对象做一些后置处理
postProcessBeanFactory(beanFactory); // Invoke factory processors registered as beans in the context.
// 调用 beanFactoryPostProcessor,允许用户对 beanFactory 做修改(扩展点),比如添加、修改或删除 beanFactory 中注册的 BeanDefinition 等
// 按顺序调用:PriorityOrdered 类型的 --> Ordered 类型的 --> the rest
invokeBeanFactoryPostProcessors(beanFactory); // Register bean processors that intercept bean creation.
// 注册 beanPostProcessor 到 beanFactory 中
registerBeanPostProcessors(beanFactory); // Initialize message source for this context.
initMessageSource(); // Initialize event multicaster for this context.
// 初始化事件广播器
initApplicationEventMulticaster(); // Initialize other special beans in specific context subclasses.
onRefresh(); // Check for listener beans and register them.
registerListeners(); // Instantiate all remaining (non-lazy-init) singletons.
// 完成 beanFactory 的初始化:解析 bean 的依赖,完成 bean 实例的初始化
finishBeanFactoryInitialization(beanFactory); // Last step: publish corresponding event.
finishRefresh();
}
beanFactory 实例化后,会向 beanFactory 注册 bean 的定义 BeanDefinition。
最后 beanFactory 会进行初始化,执行 finishBeanFactoryInitialization(beanFactory) 时就开始了 bean 的生命周期
bean 的生命周期:
1. 实例化 Instantiation
2. 属性赋值 Populate
3. 初始化 Initialization
4. 销毁 Destruction
实例化 -> 属性赋值 -> 初始化 -> 销毁
// 忽略了无关代码
protected Object doCreateBean(final String beanName, final RootBeanDefinition mbd, final @Nullable Object[] args) throws BeanCreationException { // Instantiate the bean.
BeanWrapper instanceWrapper = null;
if (instanceWrapper == null) {
// 实例化阶段!
instanceWrapper = createBeanInstance(beanName, mbd, args);
} // Initialize the bean instance.
Object exposedObject = bean;
try {
// 属性赋值阶段!填充 bean 属性:这一步主要是对bean的依赖属性进行注入(@Autowired)
populateBean(beanName, mbd, instanceWrapper);
// 初始化阶段!
exposedObject = initializeBean(beanName, exposedObject, mbd);
} }
BeanPostProcessor 和 BeanPostProcessor 执行顺序相同:
PriorityOrdered 类型的 --> Ordered 类型的 --> the rest
参考:
https://www.jianshu.com/p/1dec08d290c1
https://www.cnblogs.com/kevin-yuan/p/6402391.html
最新文章
- 数据库 SQL Server 到 MySQL 迁移方法总结
- untiy数据包的输出、加载和卸载
- 图片服务器和WEB应用服务器相分离的简单方案
- JS - 超强大文本动画插件Textillate.js
- 使用.bat 文件,批量编译项目文件。
- HBase shell 常用指令
- poj3252
- 设计模式(4) -- 单例模式(Singleton)
- PHP发送E-mail---新手教程
- Java基础--异常处理
- 移动端1px的解决办法之styled
- turnserver 配置说明记录
- 小甜点,RecyclerView 之 ItemDecoration 讲解及高级特性实践
- 【RAY TRACING THE REST OF YOUR LIFE 超详解】 光线追踪 3-3 蒙特卡罗 (三)
- OpenCV学习(23) 使用kmeans算法实现图像分割
- PyQt4(简单布局)
- ios学习路线—Objective-C(装箱和拆箱)
- linux常见编辑命令
- java.lang.Exception: The server rejected the connection: None of the protocols were accepted
- DOM操作怎样添加、移除、移动、复制。创建和查找节点?
热门文章
- PHP中的匿名类
- JAVA 时间转换、获取
- MySQL 8.x 函数和操作符,官方网址:https://dev.mysql.com/doc/refman/8.0/en/functions.html
- oracle数据库(五)
- 范式(Paradigm)是什么?
- [nodemon] app crashed - waiting for file changes before starting...
- RabbitMQ简单介绍+Windows环境安装
- java 参数传递、对象、封装
- 文件搜索命令——grep
- 入门平衡树: Treap