AbstractApplicationContext 分析

启动流程
// Prepare this context for refreshing.
prepareRefresh();
1.
// Initialize any placeholder property sources in the context environment
//预处理配置,目前看到WEB层实现(预处理WEB配置)
initPropertySources();

2. // Validate that all properties marked as required are resolvable
// see ConfigurablePropertyResolver#setRequiredProperties
//验证系统配置
getEnvironment().validateRequiredProperties();

// Tell the subclass to refresh the internal bean factory.
ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();

// Prepare the bean factory for use in this context.
//预处理beanFactory
prepareBeanFactory(beanFactory);

try {
// Allows post-processing of the bean factory in context subclasses.
//预处理beanFactory之后 后期处理 目前也看到只有WEB实现(注册相关依赖)
postProcessBeanFactory(beanFactory);

// Invoke factory processors registered as beans in the context.
//执行beanFactory后期处理
invokeBeanFactoryPostProcessors(beanFactory);
//处理流程优先级(本身实例不考虑)
1.BeanDefinitionRegistryPostProcessor
2.BeanFactoryPostProcessor
3.BeanFactoryPostProcessor(插件处理) priorityOrdered -> ordered ->nonOrdered

// Register bean processors that intercept bean creation.
//注册后期处理器 (扫描接口 BeanPostProcessor)
registerBeanPostProcessors(beanFactory);
//执行优先级 PriorityOrdered -> ordered -> nonOrdered

// Initialize message source for this context.
//初始化 国际化对象
initMessageSource();

// Initialize event multicaster for this context.
//初始化事件广播对象
initApplicationEventMulticaster();

// Initialize other special beans in specific context subclasses.
//完成处理后期后,刷新 目前也只看到web跟 DefaultLifecycleProcessor 实现
onRefresh();

// Check for listener beans and register them.
//注册处理spring 事件 优先级本身实例事件 -> 扫描所有 spring 事件接口对象
registerListeners();

// Instantiate all remaining (non-lazy-init) singletons.
//初始化完成 beanFactory 处理器
finishBeanFactoryInitialization(beanFactory);

// Last step: publish corresponding event.
//完成beanFactory容器处理
finishRefresh();
1.initLifecycleProcessor();//初始化生命周期处理器
2.getLifecycleProcessor().onRefresh();//刷新生命周期处理器
3.publishEvent(new ContextRefreshedEvent(this)); //发布ContextRefreshedEvent事件
4.registerApplicationContext();//注册上下文

关闭容器事件
1.Runtime.getRuntime().removeShutdownHook(this.shutdownHook); //移动JVM线程级监控
2.LiveBeansView.unregisterApplicationContext(this);//清空上下文 unregisterMBean
3.publishEvent(new ContextClosedEvent(this)); //发布关闭事件
4.getLifecycleProcessor().onClose();
5.destroyBeans()//没看到有实现
6.closeBeanFactory();//删除BEAN
7.// Let subclasses do some final clean-up if they wish...
onClose()

小结 :
1.预处理后注入相关依赖 实现 BeanFactoryPostProcessor
2.预处理后修改bean 实现 BeanPostProcessor
3.完成预处理后执行 实现 DefaultLifecycleProcessor

4.完成整个加载后执行 实现 ApplicationListener ContextRefreshedEvent 事件

5.关闭并且在销毁之前 实现 DefaultLifecycleProcessor 或 ApplicationListener ContextClosedEvent 事件

FactoryBean,AbstractFactoryBean<T> ,InitializingBean ,DisposableBean,BeanFactoryAware

spring 启动流程的更多相关文章

  1. Spring启动流程—源码解读

    https://blog.csdn.net/yangliuhbhd/article/details/80790761 Spring的AbstractApplicationContext的refresh ...

  2. Spring启动流程

    首先,对于一个web应用,其部署在web容器中,web容器提供其一个全局的上下文环境,这个上下文就是ServletContext,其为后面的spring IoC容器提供宿主环境: 其次,在web.xm ...

  3. Spring Boot启动流程详解(一)

    环境 本文基于Spring Boot版本1.3.3, 使用了spring-boot-starter-web. 配置完成后,编写了代码如下: @SpringBootApplication public ...

  4. activiti自定义流程之Spring整合activiti-modeler5.16实例(六):启动流程

    注:(1)环境搭建:activiti自定义流程之Spring整合activiti-modeler5.16实例(一):环境搭建        (2)创建流程模型:activiti自定义流程之Spring ...

  5. Spring基础系列-容器启动流程(1)

    原创作品,可以转载,但是请标注出处地址:https://www.cnblogs.com/V1haoge/p/9870339.html 概述 ​ 我说的容器启动流程涉及两种情况,SSM开发模式和Spri ...

  6. Spring基础系列-容器启动流程(2)

    原创作品,可以转载,但是请标注出处地址:https://www.cnblogs.com/V1haoge/p/9503210.html 一.概述 这里是Springboot项目启动大概流程,区别于SSM ...

  7. Spring启动过程分析】(1)启动流程简介

    1. spring简介 spring的最基本的功能就是创建对象及管理这些对象之间的依赖关系,实现低耦合.高内聚.还提供像通用日志记录.性能统计.安全控制.异常处理等面向切面的能力,还能帮我们管理最头疼 ...

  8. Spring Boot启动流程详解

    注:本文转自http://zhaox.github.io/java/2016/03/22/spring-boot-start-flow 环境 本文基于Spring Boot版本1.3.3, 使用了sp ...

  9. Spring启动执行流程梳理

    注:本文梳理启动流程使用的Spring版本:4.0.2.RELEASE 使用spring配置,都需要在web.xml中配置一个spring的监听器和启动参数(context-param),如下: &l ...

随机推荐

  1. ThreadLocal线程范围内的共享变量

    模拟ThreadLocal类实现:线程范围内的共享变量,每个线程只能访问他自己的,不能访问别的线程. package com.ljq.test.thread; import java.util.Has ...

  2. SublimeText2 快捷键一览

    ctrl+shift+w: 关闭Sublime,关闭所有打开文件ctrl+n: 新建文件ctrl+s: 保存ctrl+shift+s: 另存为ctrl+f4: 关闭文件ctrl+w: 关闭f11: 切 ...

  3. 浅谈压缩感知(三十):压缩感知重构算法之L1最小二乘

    主要内容: l1_ls的算法流程 l1_ls的MATLAB实现 一维信号的实验与结果 前言 前面所介绍的算法都是在匹配追踪算法MP基础上延伸的贪心算法,从本节开始,介绍基于凸优化的压缩感知重构算法. ...

  4. 浅谈压缩感知(二十九):压缩感知算法之迭代硬阈值(IHT)

    主要内容: 1.IHT的算法流程 2.IHT的MATLAB实现 3.二维信号的实验与结果 4.加速的IHT算法实验与结果 一.IHT的算法流程 文献:T. Blumensath and M. Davi ...

  5. javascript图片懒加载与预加载的分析

    javascript图片懒加载与预加载的分析 懒加载与预加载的基本概念.  懒加载也叫延迟加载:前一篇文章有介绍:JS图片延迟加载 延迟加载图片或符合某些条件时才加载某些图片. 预加载:提前加载图片, ...

  6. Web调试工具——Fiddler介绍

    Fiddler 教程 Fiddler是最强大最好用的Web调试工具之一,它能记录所有客户端和服务器的http和https请求,允许你监视,设置断点,甚至修改输入输出数据. 使用Fiddler无论对开发 ...

  7. atitit.二进制数据无损转字符串网络传输

    atitit.二进制数据无损转字符串网络传输 1. gbk的网络传输问题,为什么gbk不能使用来传输二进制数据 1 2. base64 2 3. iso-8859-1  (推荐) 2 4. utf-8 ...

  8. 整站HTTPS后的跨域请求 CORS是否还有效?

    | 导语  手Q马上就要全量https了,很多业务都有跨域ajax请求的需求,原来使用的CORS头在HTTPS环境中还继续能用吗?我搜遍了谷歌.百度,都没看到有明确的答案,那么就自己来尝试一下吧. 关 ...

  9. Unity3D脚本调用Objective C代码实现游戏内购买

    0.开篇吐槽: 一年之内从WP转到iOS,又从iOS转到U3D,真心伤不起. 1.Unity3D脚本调用OC代码的原理: 其实也没啥神秘的,因为OC是和C互通的 ,C#又可以通过DllImport的形 ...

  10. 使用Nginx负载均衡搭建高性能.NETweb应用程序一

    一.遇到的问题 当我们用IIS服务器部署了一个web应用以后,当很多用户高并发访问的时候,客户端响应就会很慢,客户的体验就会很差,由于IIS接受到客户端请求的 时候,就会创建一个线程,当线程达到几千个 ...