@EnableDiscoveryClient
@SpringBootApplication
public class ProducerApplication {
public static void main(String[] args) {
SpringApplication application = new SpringApplication(Application.class);
//application.setDefaultProperties(Properties properties); 可以设置参数
ConfigurableApplicationContext context = application.run(args);
}
}
1.创建SpringApplication对象,传入资源问题
1.1 initialize()初始化容器资源
1.1.1 将配置资源文件设置个 List<Object> sources对象。
1.1.2 判断当前是否web环境, 根据查询当前环境中有没有"javax.servlet.Servlet", "org.springframework.web.context.ConfigurableWebApplicationContext" 字节码文件做判断。
1.1.3 从META-INF/spring.factories配置文件中加载 ApplicationContextInitializer类,并创建对象,返回对象List赋值给SpringApplication的initializers属性
1.1.4 从META-INF/spring.factories配置文件中加载 ApplicationListener类,并创建对象, 返回listenter对象的List赋值给SpringApplication的listeners属性。
1.1.5 判断启动类。
(此时可以通过SpringApplication对象设置系统配置, sa.setDefaultProperties(Properties defaultProperties))
2.执行sa.run(args)函数
2.1 通过configureHeadlessProperty()方法设置"java.awt.headless"属性,先从系统设置中获取,如果取到则不做处理,如果没取到,则设置true进去。
2.2 从META-INF/spring.factories配置文件中加载 SpringApplicationRunListener类,并创建对象, 将listenter对象的List对象作为参数创建
SpringApplicationRunListeners(listeners)对象实例,并返回。
SpringApplicationRunListener {
void starting();
void environmentPrepared(ConfigurableEnvironment environment);
void contextPrepared(ConfigurableApplicationContext context);
void contextLoaded(ConfigurableApplicationContext context);
void finished(ConfigurableApplicationContext context, Throwable exception);
}
2.3 listeners.starting() 执行所有SpringApplicationRunListener的starting()方法。
2.4 设置应用参数。
ApplicationArguments applicationArguments = new DefaultApplicationArguments(args);
2.5 准备配置环境。
ConfigurableEnvironment environment = prepareEnvironment(listeners,applicationArguments);
2.5.1 获取或创建配置环境
ConfigurableEnvironment environment = getOrCreateEnvironment();
(1) 如果environment对象已经存在,则直接返回
(2) 如果不存在,判断webEnvironment(web环境)为true则创建 StandardServletEnvironment对象并返回该对象,否则创建 StandardEnvironment对象并返回。
2.5.2 设置系统配置参数
(1) 设置系统资源问题:configurePropertySources(environment, args);
(2) 获取激活配置文件:configureProfiles(environment, args);
2.5.3 执行 SpringApplicationRunListeners listeners.environmentPrepared(environment)方法
(1) 即执行所有SpringApplicationRunListener listener的environmentPrepared()方法。
2.5.4 如果当前环境非web环境,则对environment进行一次包装。
2.6 设置打印banner
Banner printedBanner = printBanner(environment);
2.7 判断需要创建的容器类型,并创建context = createApplicationContext();
2.7.1 判断需要的容器类型
contextClass = Class.forName(this.webEnvironment ? DEFAULT_WEB_CONTEXT_CLASS : DEFAULT_CONTEXT_CLASS);
2.7.2 使用反射创建容器并返回
(ConfigurableApplicationContext) BeanUtils.instantiate(contextClass);
2.8 加载失败解析器
2.8.1 到classpath中 META-INF/spring.factories文件获取 , 并加载类文件并创建实例对象,返回 List<FailureAnalyzer> analyzers;
loadFailureAnalyzers(this.classLoader);
2.8.2 准失败分析器, 如何分析器实现了BeanFactoryAware接口,则执行setBeanFactory操作。
(1) prepareFailureAnalyzers.prepareFailureAnalyzers(this.analyzers, context);
(2) ((BeanFactoryAware) analyzer).setBeanFactory(context.getBeanFactory());
2.9 准备容器
prepareContext(context, environment, listeners, applicationArguments, printedBanner);
2.9.1 设置容器环境变量
context.setEnvironment(environment);
2.9.2 设置容器中BeanName解析器,资源加载器
postProcessApplicationContext(context);
2.9.3 执行ApplicationContextInitializer中的initialize(context)方法
applyInitializers(context);
initializer.initialize(context);
2.9.4 执行SpringApplicationRunListener的 contextPrepared(context)方法
listeners.contextPrepared(context);
2.9.5 向容器设置springApplicationArguments对象实例。
context.getBeanFactory().registerSingleton("springApplicationArguments",applicationArguments);
2.9.6 向容器设置banner
context.getBeanFactory().registerSingleton("springBootBanner", printedBanner);
2.9.7 设置beanDefination加载器beanDefinationLoader,并解析加载创建bean对象到容器
load(context, sources.toArray(new Object[sources.size()]));
2.9.8 执行SpringApplicationRunListener的 contextLoaded(context)方法
listeners.contextLoaded(context);
2.9.9 刷新容器(后续专门解析)
refreshContext(context);
包括加载Beandefination, Beanfactorypostprocess,Beanpostprocess,实现相关接口方法的执行,bean的实例化, bean对象的包装等操作。返回即为装满应用对象的beanFactory.
2.9.10 容器加载启动完成,执行runner接口的实现类。
afterRefresh(context, applicationArguments);
callRunners(context, args);
2.9.11 执行SpringApplicationRunListener的 finished(context)方法
listeners.finished(context);
完成,返回容器。
- SpringBoot启动流程解析
写在前面: 由于该系统是底层系统,以微服务形式对外暴露dubbo服务,所以本流程中SpringBoot不基于jetty或者tomcat等容器启动方式发布服务,而是以执行程序方式启动来发布(参考下图ke ...
- SpringBoot启动流程分析(五):SpringBoot自动装配原理实现
SpringBoot系列文章简介 SpringBoot源码阅读辅助篇: Spring IoC容器与应用上下文的设计与实现 SpringBoot启动流程源码分析: SpringBoot启动流程分析(一) ...
- SpringBoot启动流程分析(六):IoC容器依赖注入
SpringBoot系列文章简介 SpringBoot源码阅读辅助篇: Spring IoC容器与应用上下文的设计与实现 SpringBoot启动流程源码分析: SpringBoot启动流程分析(一) ...
- SpringBoot启动流程分析(一):SpringApplication类初始化过程
SpringBoot系列文章简介 SpringBoot源码阅读辅助篇: Spring IoC容器与应用上下文的设计与实现 SpringBoot启动流程源码分析: SpringBoot启动流程分析(一) ...
- SpringBoot启动流程分析(二):SpringApplication的run方法
SpringBoot系列文章简介 SpringBoot源码阅读辅助篇: Spring IoC容器与应用上下文的设计与实现 SpringBoot启动流程源码分析: SpringBoot启动流程分析(一) ...
- SpringBoot启动流程分析(三):SpringApplication的run方法之prepareContext()方法
SpringBoot系列文章简介 SpringBoot源码阅读辅助篇: Spring IoC容器与应用上下文的设计与实现 SpringBoot启动流程源码分析: SpringBoot启动流程分析(一) ...
- SpringBoot启动流程分析(四):IoC容器的初始化过程
SpringBoot系列文章简介 SpringBoot源码阅读辅助篇: Spring IoC容器与应用上下文的设计与实现 SpringBoot启动流程源码分析: SpringBoot启动流程分析(一) ...
- SpringBoot启动流程及其原理
Spring Boot.Spring MVC 和 Spring 有什么区别? 分别描述各自的特征: Spring 框架就像一个家族,有众多衍生产品例如 boot.security.jpa等等:但他们的 ...
- springboot启动流程(一)构造SpringApplication实例对象
所有文章 https://www.cnblogs.com/lay2017/p/11478237.html 启动入口 本文是springboot启动流程的第一篇,涉及的内容是SpringApplicat ...
- SpringBoot 启动流程
SpringBoot 启动流程 加载 resources/META-INF/spring.factories 中配置的 ApplicationContextInitializer 和 Applicat ...
随机推荐
- 腾讯云服务器哪个地区节点好?来ping一下速度就知道了
腾讯云服务器怎么样?速度快吗?相信很多网友在购买云服务器之前都有此疑惑. 本人找了很久也没找到各区域节点的测试速度的域名和IP.即使有也不能批量查看对比哪个区域的速度. 网上都说这个区域节点速度快,那 ...
- apache+php项目部署
先安装apache和php然后进行如下操作(以63服务器的安装路径为例) 1.查看php项目运行的报错信息 路径: cd /var/log/httpd/error_log 如果错误如下: 可以尝试 ...
- ES6中的Array.from()函数的用法
ES6为Array增加了from函数用来将其他对象转换成数组. 当然,其他对象也是有要求,也不是所有的,可以将两种对象转换成数组. 1.部署了Iterator(迭代器)接口的对象,比如:Set,Map ...
- 集合源码分析[2]-AbstractList 源码分析
AbstractList 类型:抽象类 接口的继承以及实现关系 继承AbstractCollection 实现List接口 典型方法实现解析 public List<E> subList( ...
- crontab语法
* * * * * command minute hour day month week ...
- 全局鼠标钩子:WH_MOUSE_LL, 在【 win 10 上网本】上因为太卡,运行中丢失全局鼠标钩子
一台几年前买的上网本,让我安装了一个 win 10,然后用来测试程序的时候, 发现 使用 SetWindowsHookEx(WH_MOUSE_LL, mouseHook, GetModuleHandl ...
- (六)QDialog,QMessageBox,QFileDialog,QColorDialog颜色,QFontDialog字体
QDialog 对话框: 1.模态对话框: QDialog dlg(this); // 显示模态对话框 exec ,后面的不可操作 dlg.exec(); // 阻塞 2.非模态对话框: QDialo ...
- GWAS群体分层校正,该选用多少个PCA
前言 关于选用多少个PCA做群体分层校正,各大期刊并没有一个统一的说法. 故做了如下综述. 1 随心所欲型,想选多少就选多少 PCA想选多少就选多少,这个真的不是开玩笑.有文献出处有真相! 比如下面文 ...
- enumerate() 函数
enumerate() 函数用于将一个可遍历的数据对象(如列表.元组或字符串)组合为一个索引序列,同时列出数据和数据下标,一般用在 for 循环当中. 具体参考博客http://www.runoob. ...
- zabbix 告警小试
zabbix 告警小试 1. 实验内容简述 本次实验,旨在通过zabbix监控,实现对告警信息的实时通知,主要用到了zabbix中的item.trigger.action.user.user grou ...