(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 生命周期的更多相关文章

  1. Spring源码系列 — Bean生命周期

    前言 上篇文章中介绍了Spring容器的扩展点,这个是在Bean的创建过程之前执行的逻辑.承接扩展点之后,就是Spring容器的另一个核心:Bean的生命周期过程.这个生命周期过程大致经历了一下的几个 ...

  2. 从启动日志看Spring IOC的初始化和Bean生命周期

    一.Tomcat中启动IoC容器的日志 启动Tomcat等容器时,控制台每次都打印出一些日志. 最近刚好在研究Spring源码,所以换个角度,从启动日志来简单的看看Spring的初始化过程! 以下是T ...

  3. spring源码分析系列5:ApplicationContext的初始化与Bean生命周期

    回顾Bean与BeanDefinition的关系. BeanFactory容器. ApplicationContext上下文. 首先总结下: 开发人员定义Bean信息:分为XML形式定义:注解式定义 ...

  4. Spring源码 21 Bean生命周期

    参考源 https://www.bilibili.com/video/BV1tR4y1F75R?spm_id_from=333.337.search-card.all.click https://ww ...

  5. Spring源码之Bean生命周期

    https://www.jianshu.com/p/1dec08d290c1 https://www.cnblogs.com/zrtqsk/p/3735273.html 总结 将class文件加载成B ...

  6. 【不懂】spring bean生命周期

    完整的生命周期(牢记): 1.spring容器准备 2.实例化bean 3.注入依赖关系 4.初始化bean 5.使用bean 6.销毁bean Bean的完整生命週期可以認為是從容器建立初始化Bea ...

  7. Spring之BeanFactory及Bean生命周期

    1.spring通过BeanFactory灵活配置.管理bean,Spring对管理的bean没有任何特别的要求,完全支持对POJO的管理: 2.BeanFactory有个ApplicationCon ...

  8. Bean生命周期及BeanFactory

    1.spring通过BeanFactory灵活配置.管理bean,Spring对管理的bean没有任何特别的要求,完全支持对POJO的管理: 2.BeanFactory有个ApplicationCon ...

  9. Spring Bean 生命周期2

    在spring中,从BeanFactory或ApplicationContext取得的实例为Singleton,也就是预设为每一个Bean的别名只能维持一个实例,而不是每次都产生一个新的对象使用Sin ...

随机推荐

  1. matplotlib--基本setting

    一.创建自定义图像 figure figure(num=None, figsize=None, dpi=None, facecolor=None, edgecolor=None, frameon=Tr ...

  2. 树莓派使用root操作图形界面使用自带的文件管理器

    使用pi用户通过VNC登录图形界面之后,在需要修改一些文件则时提示权限不够, 命令行下使用sudo 运行就可以了.或者直接用root账户. 修改管理员密码:sudo passwd root 修改启用管 ...

  3. Mybatis框架进行批量导入和删除有三种方式

    首先创建一个数据库 CREATE TABLE user (   id varchar(32) CHARACTER SET utf8 NOT NULL,   name varchar(50) CHARA ...

  4. 18、Python模块基础

    一.模块 模块可以看成是一堆函数的集合体. 一个py文件内部就可以放一堆函数,因此一个py文件就可以看成一个模块. 如果这个py文件的文件名为module.py,模块名则是module. 1.模块的四 ...

  5. 【Hadoop】新建hadoop用户以及用户组,给予sudo权限(转)

    1.首先新建用户,adduser命令 sudo adduser hadoop passwd hadoop 输入密码之后,一路 y 确定. 2.添加用户组 在创建hadoop用户的同时也创建了hadoo ...

  6. maven中jar冲突解决

    Maven中jar包冲突是开发过程中比较常见而又令人头疼的问题,我们需要知道 jar包冲突的原理,才能更好的去解决jar包冲突的问题.本文将从jar包冲突的原理和解决两个方面阐述Maven中jar包冲 ...

  7. OpenCV 学习笔记(11)【OpenCV】光流场方法标出前景(运动)和背景(静止)

    用光流场方法,标出前景(运动)和背景(静止). 环境:VS2017 + OpenCV3.4.1 光流场介绍可以参见英文版学习OpenCV3的第17章Tracking 英文原版学习OpenCV3下载链接 ...

  8. (尚033)Vue_案例_slot(组件间的通信4:slot)

    1.组件间的通信4:slot(slot:插槽,就是一个占位) slot用于标签反复使用很多次 1.1理解 此方式用于父组件向子组件传递标签数据, 其他为数据通信 外面组件向里面组件传递标签进去,直接拿 ...

  9. wireshark安装和使用 -基础篇

    使用前知道: wireshark版本:3.0.2 使用wireshark的目的是因为它支持linux/windows/mac,而且新版本是开源免费的.还有一个原因是使用Fiddler不支持mac.截止 ...

  10. linux下安装 ping 命令

    使用docker仓库下载的ubuntu 14.04 镜像.里面精简的连 ping 命令都没有.google 百度都搜索不到ping 命令在哪个包里. 努力找了半天,在一篇文章的字里行间发现了 ping ...