springboot启动过程源码
创始人
2024-05-24 12:07:54
0
  1. 概述

版本

    org.springframework.bootspring-boot-starter-parent2.3.3.RELEASE

启动入口代码

package com.ybjdw.tool;import org.mybatis.spring.annotation.MapperScan;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.servlet.MultipartConfigFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.scheduling.annotation.EnableAsync;
import org.springframework.util.unit.DataSize;import javax.servlet.MultipartConfigElement;
import java.io.File;@EnableAsync
@SpringBootApplication
@MapperScan("com.ybjdw.tool.*.dao")
public class ToolApplication {@Value("${log.custom.dir}")private String logCustomDir;public static void main(String[] args) {SpringApplication.run(ToolApplication.class, args);}// 上传相关@Beanpublic MultipartConfigElement multipartConfigElement() {MultipartConfigFactory factory = new MultipartConfigFactory();String location = logCustomDir + "/uploadFileTmp"; // 设置上传临时文件存储位置File file = new File(location);if(!file.exists()){file.mkdirs();}factory.setLocation(location);// 允许上传的文件最大值.factory.setMaxFileSize(DataSize.ofMegabytes(100));// 设置总上传数据大小factory.setMaxRequestSize(DataSize.ofMegabytes(200));return factory.createMultipartConfig();}
}
  1. 启动步骤

根据SpringApplication的官方描述,可以得到启动步骤如下:

1.根据classpath创建适当的应用上下文

Create an appropriate ApplicationContext depending on your classpath

2.注册CommandLinePropertySource来暴露命令行参数作为spring的属性

Register a CommandLinePropertySource to expose command line arguments as Spring properties

3.刷新应用上下文,加载所有的单例bean

Refresh the application context,loading all singleton beans

4.触发所有的CommandLineRunner实例

Trigger any CommandLineRunner beans

2.1Spring加载bean的方式及主应用类确定

Spring加载bean有四种方式:

  1. 通过完全限定类名加载,使用AnnotatedBeanDefinitionReader。

  1. 通过XML加载,使用XmlBeanDefinitionReader

  1. 通过groovy script加载,使用GroovyBeanDefinitionReader

  1. 通过扫描包加载,使用ClassPathBeanDefinitionScanner

官方推荐使用第一种方式加载,同时下面为应用如何推测启动类的:通过遍历运行时栈跟踪集合,找到方法名为main的类,这就是为什么我们没指定启动类,但应用却知道,体现了约定优于配置的思想。

2.2根据classpath创建适当的应用上下文

先根据classpath推断当前WebApplicationType。

根据WebApplicationType创建合适的应用上下文。

2.3注册CommandLinePropertySource来暴露命令行参数作为spring的属性

先通过SimpleCommandLinePropertySource解析命令行参数args,并将它注册为CommandLinePropertySource(名称为【commandLineArgs】,value为包含命令行参数的CommandLineArgs)。

其中COMMAND_LINE_PROPERTY_SOURCE_NAME常量名称是commandLineArgs

同时也会将applicationArguments注册到beanFactory,名称为springApplicationArguments。

2.4刷新应用上下文,加载所有的单例bean

在SpringApplication的run方法中有调用刷新上下文的方法。

最后调用ConfigurableApplicationContext的refresh方法。

ConfigurableApplicationContext接口根据环境有三个不同的实现类。

当前使用的是AbstractApplicationContext的refresh方法。

2.5触发所有的CommandLineRunner实例

相关内容

热门资讯

喜欢穿一身黑的男生性格(喜欢穿... 今天百科达人给各位分享喜欢穿一身黑的男生性格的知识,其中也会对喜欢穿一身黑衣服的男人人好相处吗进行解...
发春是什么意思(思春和发春是什... 本篇文章极速百科给大家谈谈发春是什么意思,以及思春和发春是什么意思对应的知识点,希望对各位有所帮助,...
网络用语zl是什么意思(zl是... 今天给各位分享网络用语zl是什么意思的知识,其中也会对zl是啥意思是什么网络用语进行解释,如果能碰巧...
为什么酷狗音乐自己唱的歌不能下... 本篇文章极速百科小编给大家谈谈为什么酷狗音乐自己唱的歌不能下载到本地?,以及为什么酷狗下载的歌曲不是...
华为下载未安装的文件去哪找(华... 今天百科达人给各位分享华为下载未安装的文件去哪找的知识,其中也会对华为下载未安装的文件去哪找到进行解...
怎么往应用助手里添加应用(应用... 今天百科达人给各位分享怎么往应用助手里添加应用的知识,其中也会对应用助手怎么添加微信进行解释,如果能...
家里可以做假山养金鱼吗(假山能... 今天百科达人给各位分享家里可以做假山养金鱼吗的知识,其中也会对假山能放鱼缸里吗进行解释,如果能碰巧解...
四分五裂是什么生肖什么动物(四... 本篇文章极速百科小编给大家谈谈四分五裂是什么生肖什么动物,以及四分五裂打一生肖是什么对应的知识点,希...
一帆风顺二龙腾飞三阳开泰祝福语... 本篇文章极速百科给大家谈谈一帆风顺二龙腾飞三阳开泰祝福语,以及一帆风顺二龙腾飞三阳开泰祝福语结婚对应...
美团联名卡审核成功待激活(美团... 今天百科达人给各位分享美团联名卡审核成功待激活的知识,其中也会对美团联名卡审核未通过进行解释,如果能...