死磕Spring源码-Spring Boot源码分析

SpringBoot通过内置的tomcat带动ioc容器的启动.下面通过源码分析SpringBoot的启动流程.首先找到启动程序的入口,从run方法点进去.

Java互联网架构-Spring Boot源码分析

 

如下图可知,首先创建一个SpringApplication对象通过initialize(sources);方法进行初始化,sources是我们传入的主配置类.

Java互联网架构-Spring Boot源码分析

 

initialize方法首先将我们的主函数类转化成数组保存起来.然后进行了推断,通过deduceWebEnvironment()推断当前的环境是否是MVC环境或者是响应式编程环境,返回一个boolean类型.

Java互联网架构-Spring Boot源码分析

 

setInitializers方法,是读取配置文件找到这样的类进行初始化.

Java互联网架构-Spring Boot源码分析

 

setListeners((Collection) getSpringFactoriesInstances(ApplicationListener.class));找到SpringListener监听器

this.mainApplicationClass = deduceMainApplicationClass(); 推断是否包含了main函数,如果包含直接返回.

Java互联网架构-Spring Boot源码分析

 

SpringApplication对象创建完以后,直接调用了run方法,StopWatch stopWatch =new StopWatch();开启一个定时器,然后启动定时器,configureHeadlessProperty();这句的意思是开启java.awt.headless./关于这个模式,自行百度一下就可以清楚非常简单.紧接着获取监听器,启动监听器然后获得一个上下文参数,紧接着准备环境,点进去.

Java互联网架构-Spring Boot源码分析

 

如下图可知,getOrCreateEnvironment获取或者创建一个环境F5进去,发现如果是MVC环境的话就通过new StandardServletEnvironment()创建环境,其他new StandardEnvironment()创建环境.然后把准备好的环境加入监听器.后面判断是否MVC环境,如果不是则进行环境的转换.最后返回.

Java互联网架构-Spring Boot源码分析

 

Java互联网架构-Spring Boot源码分析

 

环境准备好以后.设置Banner printedBanner = printBanner(environment);这一句创建你的banner.控制台打印的文字createApplicationContext();这句是重点,创建Application的上下文.通过BeanUtil中的instantiate去创建

Java互联网架构-Spring Boot源码分析

 

点进去发现有一个叫clazz.newInstance()的方法点进去发现从这里开始带动了SpringIOC容器的初始化流程.

Java互联网架构-Spring Boot源码分析

 

带动的SpringIOC容器的初始化流程.

Java互联网架构-Spring Boot源码分析

 

走完以后回到一开始的地方analyzers =new FailureAnalyzers(context);创建analyzers

FailureAnalyzer是一种很好的方式在启动时拦截异常并将其转换为易读的消息,并将其包含在FailureAnalysis中。 Spring Boot为应用程序上下文相关异常、JSR-303验证等提供了此类分析器。 实际上也是非常容易创建自己的FailureAnalyzer。

AbstractFailureAnalyzer是FailureAnalyzer的一个抽象实现,它检查要处理的异常中是否存在指定的异常类型。 我们可以从中进行扩展,以便存在指定的异常时有机会去处理。 如果由于某种原因无法处理异常,则返回null以使另一个实现有机会处理异常。

FailureAnalyzer实现将在META-INF/spring.factories中注册:注册ProjectConstraintViolationFailureAnalyzer:

最后通过prepareContext(context, environment, listeners, applicationArguments, printedBanner);.

prepareContext中,首先设置环境,然后走了一个后置处理器,判断this.beanNameGenerator !=null,this.resourceLoader !=null,才会执行,结果是什么都没做,applyInitializers(context);然后执行调用initialize(context)方法

Java互联网架构-Spring Boot源码分析

 

下图中,通过循环getInitializers()获取到ApplicationContextInitializer类型分别调用initialize方法,执行不同的初始化操作.prepareContext方法执行完以后进入了refreshContext(context);方法.

Java互联网架构-Spring Boot源码分析

 

如下图所示,直接调到了IOC启动的地方,这个地方很熟悉吧.onRefresh方法就是带动SpringBoot的地方点进去看看

Java互联网架构-Spring Boot源码分析

 

如下图方法,点进去

Java互联网架构-Spring Boot源码分析

 

ServletContext localServletContext = getServletContext();获取了servlet上下文然后执行getEmbeddedServletContainerFactory(),这里获取了一个BeanName数组.然后通过beanName数组获取一个EmbeddedServletContainerFactory.然后containerFactory.getEmbeddedServletContainer(getSelfInitializer());非常之重要点进去,发现new ServletContextInitializer()再点进去

Java互联网架构-Spring Boot源码分析

 

发现如下图的方法,这里创建了tomcat的环境以及参数设置.然后执行prepareContext,将Tomcat信息,设置上下文当中.

Java互联网架构-Spring Boot源码分析

 

最后执行下图方法,找到initialize();然后找到如下图这段话this.tomcat.start();tmocat启动,至此Tomcat启动完成.这就是Springboot的 整个启动流程.

Java互联网架构-Spring Boot源码分析

 

如有收获,请帮忙转发,您的鼓励是作者最大的动力,谢谢!

一大波微服务、分布式、高并发、高可用的原创系列文章正在路上,

欢迎关注头条号:java小马哥

周一至周日早九点半!下午三点半!精品技术文章准时送上!!!

十余年BAT架构经验倾囊相授

学习视频资料限时领取

  • 4
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值