type
status
date
slug
summary
tags
category
icon
password
这里写文章的前言:
一个简单的开头,简述这篇文章讨论的问题、目标、人物、背景是什么?并简述你给出的答案。
可以说说你的故事:阻碍、努力、结果成果,意外与转折。
📝 SpringBoot构造函数
SpringBoot可以说说目前Java人员都在使用的框架. 但是如果是仅仅停留在使用程度的话,那么还是比较可惜的.可以适当的阅读一下其底层代码是怎么实现的. 就其单Spring框架自身,阅读起来或者说是对其执行代码起来,还是需要大量的时间去理解的. 但是这不妨碍我们可以多阅读几遍,对其加强理解.
构造方法
这是简单的启动一个 SpringBoot 项目. 这里先不看run方法,我们就先看这个 new SpringApplication 里面是怎么走的.
setInitializers((Collection) getSpringFactoriesInstances(ApplicationContextInitizlier.class)) 方法
该方法先走 getSpringFactoriesInstances()方法
添加 ApplicationContextInitializer 子类
来手动添加一个 ApplicationContextInitializer 的子类
然后在 resources 目录下面创建一个 META-INF 目录 , 再在 META-INF目录下创建一个 spring.factories 文件, 然后文件里面的内容我们就仿照SpringBoot里面的. 也给他加上一行
然后将判断给打到 setInitializers() 这个方法,根据去, 跟到断点: org.springframework.core.io.support.SpringFactoriesLoader#loadSpringFactories 到这里, 然后看 result 中,
org.springframework.context.ApplicationContextInitializer -> {LinkedList@1641} size = 8 , 这个 LinkedList中就有我们自定义的 com.yang.bootsourcelearn.init.GavinYangApplicationContextInitializer 的方法,
紧接着走完 createSpringFactoriesInstances 方法, 就可以看到我们无参构造函数中打印的 GavinYang Init Bean . 所以自顶一个还是很简单的. 由于我们不需要特别加什么,所以就没有对 重写的 initialize 进行什么添加.
同样的 ApplicationListener.class , 我们也可以使用这样的方法进行自定义.
🤗 总结归纳
总结文章的内容
SpringApplication 构造函数方法,还是很好理解的, 代码阅读起来也很明白.
1 : 对参数的检验和判断不是null,然后转化为集合,赋值给其属性.
2 : 判断一些 WebApplicationType的类型. SERVLET. 当然Spring5好像引入了一个 REACTIVE这个,可能很早之前就有了,因为我个人也是看Spring5的新特性才看到的这个.
3 : 根据 ApplicationContextInitializer.class 和 ApplicationListener.class , 从 META-INF/spring.factories 文件里面读取出对应的内容(这里的内容也就是一些类的全限定名字,然后分好类的),并且对其进行实例化.
4 : 最后获取一下启动类的class值,将其赋值给其内部的变量 mainApplicationClass .
📎 参考文章
有关文章的问题,欢迎您在底部评论区留言,一起交流~