(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

最新文章

  1. 数据库 SQL Server 到 MySQL 迁移方法总结
  2. untiy数据包的输出、加载和卸载
  3. 图片服务器和WEB应用服务器相分离的简单方案
  4. JS - 超强大文本动画插件Textillate.js
  5. 使用.bat 文件,批量编译项目文件。
  6. HBase shell 常用指令
  7. poj3252
  8. 设计模式(4) -- 单例模式(Singleton)
  9. PHP发送E-mail---新手教程
  10. Java基础--异常处理
  11. 移动端1px的解决办法之styled
  12. turnserver 配置说明记录
  13. 小甜点,RecyclerView 之 ItemDecoration 讲解及高级特性实践
  14. 【RAY TRACING THE REST OF YOUR LIFE 超详解】 光线追踪 3-3 蒙特卡罗 (三)
  15. OpenCV学习(23) 使用kmeans算法实现图像分割
  16. PyQt4(简单布局)
  17. ios学习路线—Objective-C(装箱和拆箱)
  18. linux常见编辑命令
  19. java.lang.Exception: The server rejected the connection: None of the protocols were accepted
  20. DOM操作怎样添加、移除、移动、复制。创建和查找节点?

热门文章

  1. PHP中的匿名类
  2. JAVA 时间转换、获取
  3. MySQL 8.x 函数和操作符,官方网址:https://dev.mysql.com/doc/refman/8.0/en/functions.html
  4. oracle数据库(五)
  5. 范式(Paradigm)是什么?
  6. [nodemon] app crashed - waiting for file changes before starting...
  7. RabbitMQ简单介绍+Windows环境安装
  8. java 参数传递、对象、封装
  9. 文件搜索命令——grep
  10. 入门平衡树: Treap