spring boot controller 初始化_springboot源码解析之SpringApplication初始化、启动

说在前面

本次开始spring-boot源码解析

源码解析

创建SpringApplication对象进入到这个方法org.springframework.boot.SpringApplication#SpringApplication(java.lang.Object...)

public SpringApplication(Object... sources) {
    
initialize(sources);}

进入到这个方法org.springframework.boot.SpringApplication#initialize

private void initialize(Object[] sources) {
    if (sources != null && sources.length > 0) {
    this.sources.addAll(Arrays.asList(sources));      }this.webEnvironment = deduceWebEnvironment();//    加载初始化器      setInitializers((Collection) getSpringFactoriesInstances(
ApplicationContextInitializer.class));// 加载监听器 setListeners((Collection) getSpringFactoriesInstances(ApplicationListener.class)); this.mainApplicationClass = deduceMainApplicationClass(); }

进入到这个方法org.springframework.boot.SpringApplication#getSpringFactoriesInstances(java.lang.Class)从META-INF/spring.factories路径加载ApplicationContextInitializer

264a064f6b1d5e124b71f8e331d00645.png

进入到这个方法org.springframework.boot.SpringApplication#getSpringFactoriesInstances(java.lang.Class)从META-INF/spring.factories路径加载

ApplicationListener

9f288aaf6b3ff9bac0228cc01081f9ab.png

进入到这个方法org.springframework.boot.SpringApplication#deduceMainApplicationClass

根据main方法找到应用启动类

private Class> deduceMainApplicationClass() {
    try {
    
StackTraceElement[] stackTrace = new RuntimeException().getStackTrace(); for (StackTraceElement stackTraceElement : stackTrace) { if ("main".equals(stackTraceElement.getMethodName())) { return Class.forName(stackTraceElement.getClassName()); }
}
}catch (ClassNotFoundException ex) { // Swallow and continue }return null;}

进入到这个方法org.springframework.boot.SpringApplication#run(java.lang.String...)

//  spring-boot源码解析 应用启动   public ConfigurableApplicationContext run(String... args) {
    
StopWatch stopWatch = new StopWatch(); stopWatch.start(); ConfigurableApplicationContext context = null; FailureAnalyzers analyzers = null; configureHeadlessProperty();// 初始化SpringApplicationRunListener -》 SpringApplicationRunListeners listeners = getRunListeners(args); listeners.starting(); try {
ApplicationArguments applicationArguments = new DefaultApplicationArguments(
args); ConfigurableEnvironment environment = prepareEnvironment(listeners, applicationArguments);// 打印banner Banner printedBanner = printBanner(environment);// 初始化spring上下文 -》 context = createApplicationContext(); analyzers = new FailureAnalyzers(context);// 准备spring上下文 -》 prepareContext(context, environment, listeners, applicationArguments, printedBanner);// 刷新spring上下文 -》 refreshContext(context);// spring上下文初始化完毕加载其他applicationRunner afterRefresh(context, applicationArguments);// 执行监听器spring加载完成事件 listeners.finished(context, null); stopWatch.stop(); if (this.logStartupInfo) { new StartupInfoLogger(this.mainApplicationClass)
.logStarted(getApplicationLog(), stopWatch); }return context; }catch (Throwable e
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值