SPRINGBOOT启动原理(基于2.x版本)- SpringApplication里有啥

Posted 盖丽男

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SPRINGBOOT启动原理(基于2.x版本)- SpringApplication里有啥相关的知识,希望对你有一定的参考价值。

这里写目录标题

版本

版本:3…0.1
前两篇:SPRINGBOOT启动原理(基于2.x版本)(一)

SPRINGBOOT启动原理(基于2.x版本)(二)-SpringFactoriesLoader

引入

基本上所有的springboot项目,在启动类中,都会有这一句:

    public static void main(String[] args) 
        SpringApplication.run(SpringTestApplication.class, args);
    

这也是我们整个程序的入口,spring的启动,从此开始。

SpringApplication里的那些成员变量

	/**
	 * Default banner location.
	 * 默认banner位置
	 */
	public static final String BANNER_LOCATION_PROPERTY_VALUE = SpringApplicationBannerPrinter.DEFAULT_BANNER_LOCATION;

	/**
	 * Banner location property key.
	 * spring.banner.location 自定义banner时,使用该配置指定位置
	 */
	public static final String BANNER_LOCATION_PROPERTY = SpringApplicationBannerPrinter.BANNER_LOCATION_PROPERTY;

	//Headless模式是系统的一种配置模式。在系统可能缺少显示设备、键盘或鼠标这些外设的情况下可以使用该模式。
	//参考:https://www.jianshu.com/p/7248b3ff5ca7
	private static final String SYSTEM_PROPERTY_JAVA_AWT_HEADLESS = "java.awt.headless";

	private static final Log logger = LogFactory.getLog(SpringApplication.class);

	//SpringApplicationShutdownHook是一个实现了Runnable接口的类,用于在应用关闭时执行一些清理操作。
	static final SpringApplicationShutdownHook shutdownHook = new SpringApplicationShutdownHook();

	private static final ThreadLocal<SpringApplicationHook> applicationHook = new ThreadLocal<>();

	//一个Set<Class<?>>类型的集合,用于存储主配置源类,也就是我上面代码里的SpringTestApplication.class
	private final Set<Class<?>> primarySources;

	private Set<String> sources = new LinkedHashSet<>();

	//使用了java9的新功能StackWalker,来推断main函数所在类
	//旧实现:http://qclog.cn/1133
	private Class<?> mainApplicationClass;
	
	//一个Banner.Mode类型的枚举,用于设置是否显示banner和显示方式(控制台、日志或者关闭)
	private Banner.Mode bannerMode = Banner.Mode.CONSOLE;

	private boolean logStartupInfo = true;

	//一个boolean类型的变量,用于设置是否将命令行参数添加到Environment对象中
	private boolean addCommandLineProperties = true;

	//一个boolean,用于判断是否 提供用于访问和自定义将属性值从一种类型转换为另一种类型时使用的ConversionService的工具。
	private boolean addConversionService = true;

	private Banner banner;

	//用于加载资源文件
	private ResourceLoader resourceLoader;

	//一个BeanNameGenerator类型的变量,用于为Spring容器中注册的Bean生成名称
	private BeanNameGenerator beanNameGenerator;

	private ConfigurableEnvironment environment;

	//一个WebApplicationType类型的枚举,用于设置应用的类型(Servlet、Reactive或者None)
	private WebApplicationType webApplicationType;

	//一个boolean类型的变量,用于设置是否以无头模式运行应用(即不依赖图形用户界面)
	private boolean headless = true;

	private boolean registerShutdownHook = true;

	//一个ApplicationContextInitializer类型的列表,用于在创建ApplicationContext对象之前对其进行初始化操作,初始化SpringApplication时就会加载好
	private List<ApplicationContextInitializer<?>> initializers;

	//一个ApplicationListener类型的列表,用于监听run方法执行过程中各个阶段发生的事件,初始化SpringApplication时就会加载好
	private List<ApplicationListener<?>> listeners;

	private Map<String, Object> defaultProperties;

	//一个BootstrapRegistryInitializer类型的列表,通过Initialize的方法来加载BootstrapRegistry的。
	private final List<BootstrapRegistryInitializer> bootstrapRegistryInitializers;

	//通过这个参数激活 Profile
	private Set<String> additionalProfiles = Collections.emptySet();

	//设置是否应允许通过注册与现有定义同名的定义来覆盖 Bean 定义。默认为 @code false
	private boolean allowBeanDefinitionOverriding;

	//设置是否允许 Bean 之间的循环引用并自动尝试解析它们。默认为 @code false
	private boolean allowCircularReferences;

	private boolean isCustomEnvironment = false;

	//一个boolean类型的变量,用于设置是否延迟初始化Bean(即在需要时才创建Bean实例)
	private boolean lazyInitialization = false;

	private String environmentPrefix;

	private ApplicationContextFactory applicationContextFactory = ApplicationContextFactory.DEFAULT;
	
	//一个ApplicationStartup类型的变量,用于记录应用启动过程中的事件和时间戳
	private ApplicationStartup applicationStartup = ApplicationStartup.DEFAULT;

以上是关于SPRINGBOOT启动原理(基于2.x版本)- SpringApplication里有啥的主要内容,如果未能解决你的问题,请参考以下文章

SPRINGBOOT启动原理(基于2.x版本)- SpringApplication里有啥

SpringBoot运行原理

关于SpringBoot 1.x和2.x版本差别

SpringBoot 2.x版本整合redis集群

springboot启动为啥控制台要输出一个图案?

SpringBoot启动原理分析