Spring BeanFactory 初始化 和 Bean 生命周期
(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
Spring BeanFactory 初始化 和 Bean 生命周期的更多相关文章
- Spring源码系列 — Bean生命周期
前言 上篇文章中介绍了Spring容器的扩展点,这个是在Bean的创建过程之前执行的逻辑.承接扩展点之后,就是Spring容器的另一个核心:Bean的生命周期过程.这个生命周期过程大致经历了一下的几个 ...
- 从启动日志看Spring IOC的初始化和Bean生命周期
一.Tomcat中启动IoC容器的日志 启动Tomcat等容器时,控制台每次都打印出一些日志. 最近刚好在研究Spring源码,所以换个角度,从启动日志来简单的看看Spring的初始化过程! 以下是T ...
- spring源码分析系列5:ApplicationContext的初始化与Bean生命周期
回顾Bean与BeanDefinition的关系. BeanFactory容器. ApplicationContext上下文. 首先总结下: 开发人员定义Bean信息:分为XML形式定义:注解式定义 ...
- Spring源码 21 Bean生命周期
参考源 https://www.bilibili.com/video/BV1tR4y1F75R?spm_id_from=333.337.search-card.all.click https://ww ...
- Spring源码之Bean生命周期
https://www.jianshu.com/p/1dec08d290c1 https://www.cnblogs.com/zrtqsk/p/3735273.html 总结 将class文件加载成B ...
- 【不懂】spring bean生命周期
完整的生命周期(牢记): 1.spring容器准备 2.实例化bean 3.注入依赖关系 4.初始化bean 5.使用bean 6.销毁bean Bean的完整生命週期可以認為是從容器建立初始化Bea ...
- Spring之BeanFactory及Bean生命周期
1.spring通过BeanFactory灵活配置.管理bean,Spring对管理的bean没有任何特别的要求,完全支持对POJO的管理: 2.BeanFactory有个ApplicationCon ...
- Bean生命周期及BeanFactory
1.spring通过BeanFactory灵活配置.管理bean,Spring对管理的bean没有任何特别的要求,完全支持对POJO的管理: 2.BeanFactory有个ApplicationCon ...
- Spring Bean 生命周期2
在spring中,从BeanFactory或ApplicationContext取得的实例为Singleton,也就是预设为每一个Bean的别名只能维持一个实例,而不是每次都产生一个新的对象使用Sin ...
随机推荐
- Spring Cloud 之 Hystrix 知识点:隔离、熔断、降级
Hystrix 是隔离.熔断以及降级的一个框架. Hystrix 的隔离: Hystrix 会搞很多个小小的线程池,比如订单服务请求库存服务是一个线程池,请求仓储服务是一个线程池,请求积分服务是一个线 ...
- MapReduce如何调优
Map阶段优化 1.在代码书写时优化,如尽量避免在map端创建变量等,因为map端是循环调用的,创建变量会增加内存的消耗,尽量将创建变量放到setup方法中 2.配置调优,可以在集群配置和任务运行时进 ...
- 使用apache 的FileUtils处理文件的复制等操作
今日思语:春风很柔,夏风很烈,秋风清爽,东风凛冽,愿你就是春夏秋冬的风~ 平时对一些文件进行操作,比如说写文件,读文件,复制一个文件等,使用原生File操作需要读取源文件,生成流对象,再写入一个新的文 ...
- 第4章 Spring的数据库开发
4.1 Spring JDBC Spring的JDBC模块负责数据库资源管理和错误处理,化简了开发者对数据库的操作. 4.11 Spring JdbcTemplate的解析 * JdbcTemplat ...
- CentOS7配置VIP
CentOS7 两台做vip飘逸,实现虚拟ip的跳转 两台机器 首先下载ipvsadm 和 keepalived yum -y install ipvsadm keepalived vim /etc/ ...
- MongoDB db.stats()&&db.db.serverStatus()
db.stats() 示例图 参数解释: "db" : "test" ,表示当前是针对"test"这个数据库的描述.想要查看其他数据库, ...
- 《Elasticsearch实战》读书笔记
遗留问题: 1._source字段和field字段的区别 2.q和search的区别(查询请求中) 3.输入关键字的大小写,参考prefix查询,match_phrase_prefix查询(4.4.2 ...
- hive基础知识三
1. 基本查询 注意 SQL 语言大小写不敏感 SQL 可以写在一行或者多行 关键字不能被缩写,也不能分行 各子句一般要分行写 使用缩进提高语句的可读性 1.1 全表和特定列查询 全表查询 selec ...
- C函数之index、strtoul
index函数 函数定义: #include<strings.h> char *index(const char *s, int c); 函数说明: 找出参数s字符串中第一个出现参数c的地 ...
- Spatiotemporal continuous estimates of PM2.5 concentrations in China, 2000–2016: A machine learning method with inputs from satellites, chemical transport model, and ground observations
写在前面 首先,看完查了一下这个期刊 Environment International,是1区的文章,影响因子7.297!不愧是优秀的期刊,文章质量很高,内容很丰富. 内容 主要是PM25反演,利用 ...