博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
SpringBoot启动跟踪
阅读量:5263 次
发布时间:2019-06-14

本文共 2829 字,大约阅读时间需要 9 分钟。

程序启动入口

@SpringBootApplicationpublic class Chapter001Application {    public static void main(String[] args) {        SpringApplication.run(Chapter001Application.class, args);    }}

调试跟踪

执行初始化方法

/**     * Create a new {
@link SpringApplication} instance. The application context will load * beans from the specified sources (see {
@link SpringApplication class-level} * documentation for details. The instance can be customized before calling * {
@link #run(String...)}. * @param sources the bean sources * @see #run(Object, String[]) * @see #SpringApplication(ResourceLoader, Object...) */ public SpringApplication(Object... sources) { initialize(sources); }

初始化方法

 

 applicationContext和applicationListener方法详情

/**     * Sets the {
@link ApplicationContextInitializer} that will be applied to the Spring * {
@link ApplicationContext}. * @param initializers the initializers to set */ public void setInitializers( Collection
> initializers) { this.initializers = new ArrayList
>(); this.initializers.addAll(initializers); }
ApplicationContextInitializer初始化applicationContext
/**     * Sets the {
@link ApplicationListener}s that will be applied to the SpringApplication * and registered with the {
@link ApplicationContext}. * @param listeners the listeners to set */ public void setListeners(Collection
> listeners) { this.listeners = new ArrayList
>(); this.listeners.addAll(listeners); }

注册listener到apllicationContext

applicationContext和applicationlistener初始化都是通过getSpringFactoriesInstances实现的,我们一探究竟

private 
Collection
getSpringFactoriesInstances(Class
type) { return getSpringFactoriesInstances(type, new Class
[] {}); } private
Collection
getSpringFactoriesInstances(Class
type, Class
[] parameterTypes, Object... args) { ClassLoader classLoader = Thread.currentThread().getContextClassLoader(); // Use names and ensure unique to protect against duplicates Set
names = new LinkedHashSet
( SpringFactoriesLoader.loadFactoryNames(type, classLoader)); List
instances = createSpringFactoriesInstances(type, parameterTypes, classLoader, args, names); AnnotationAwareOrderComparator.sort(instances); return instances; }

找到了关键节点spring.factories文件,我们查看spring boot下的这个文件看看情况

 

通过spring.factories文件拿到一系列的Context和Listener之后 执行run方法

run方法会从spring.factories文件中获取到run listener,然后在spring boot 执行到各个阶段时执行Listener事件和Context事件

 最后的run方法如下

 

 

了解启动流程,方便优化,下边是网友遇到的问题以及优化方案

https://segmentfault.com/a/1190000004252885

转载于:https://www.cnblogs.com/mongo/p/8340886.html

你可能感兴趣的文章
【通过反射去获取有参构造方法并使用】
查看>>
网站分析师如何让分析报告更具价值
查看>>
蛋疼的ACM
查看>>
Java 之 static的使用方法(6)
查看>>
Effective c++ 小结
查看>>
手把手教你开发Chrome扩展二:为html添加行为
查看>>
30岁菜鸟涛学习VB.net 第四天
查看>>
2017.4.10-morning
查看>>
php7.0支持调用lua脚本
查看>>
Fiddler可以支持Websocket抓包了
查看>>
判断 切换
查看>>
ocrosoft Contest1316 - 信奥编程之路~~~~~第三关 问题 C: 挂盐水
查看>>
ACM_并查集
查看>>
Centos7.x破解密码
查看>>
Beta答辩总结
查看>>
MATLAB学习笔记10-10-24
查看>>
个人冲刺1
查看>>
A Tour of C++(Chapter 2 of The C++ Programming Language)
查看>>
规定元素宽高,内容超出则显示滚动条,内容不超出则隐藏滚动条。
查看>>
ADO.NET Entity Framework 学习(1)
查看>>