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

简介: SPRINGBOOT启动原理(基于3.x版本)(三)- SpringApplication里有啥


版本

版本:3…0.1

引入

基本上所有的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;
目录
相关文章
|
2天前
|
XML Java 开发者
Spring Boot开箱即用可插拔实现过程演练与原理剖析
【11月更文挑战第20天】Spring Boot是一个基于Spring框架的项目,其设计目的是简化Spring应用的初始搭建以及开发过程。Spring Boot通过提供约定优于配置的理念,减少了大量的XML配置和手动设置,使得开发者能够更专注于业务逻辑的实现。本文将深入探讨Spring Boot的背景历史、业务场景、功能点以及底层原理,并通过Java代码手写模拟Spring Boot的启动过程,为开发者提供一个全面的理解。
9 0
|
6天前
|
Java Spring
SpringBoot自动装配的原理
在Spring Boot项目中,启动引导类通常使用`@SpringBootApplication`注解。该注解集成了`@SpringBootConfiguration`、`@ComponentScan`和`@EnableAutoConfiguration`三个注解,分别用于标记配置类、开启组件扫描和启用自动配置。
42 17
|
26天前
|
druid Java Maven
|
27天前
|
Java Spring 容器
springboot @RequiredArgsConstructor @Lazy解决循环依赖的原理
【10月更文挑战第15天】在Spring Boot应用中,循环依赖是一个常见问题,当两个或多个Bean相互依赖时,会导致Spring容器陷入死循环。本文通过比较@RequiredArgsConstructor和@Lazy注解,探讨它们解决循环依赖的原理和优缺点。@RequiredArgsConstructor通过构造函数注入依赖,使代码更简洁;@Lazy则通过延迟Bean的初始化,打破创建顺序依赖。两者各有优势,需根据具体场景选择合适的方法。
49 4
|
2月前
|
Java 应用服务中间件 API
Vertx高并发理论原理以及对比SpringBoot
Vertx 是一个基于 Netty 的响应式工具包,不同于传统框架如 Spring,它的侵入性较小,甚至可在 Spring Boot 中使用。响应式编程(Reactive Programming)基于事件模式,通过事件流触发任务执行,其核心在于事件流 Stream。相比多线程异步,响应式编程能以更少线程完成更多任务,减少内存消耗与上下文切换开销,提高 CPU 利用率。Vertx 适用于高并发系统,如 IM 系统、高性能中间件及需要较少服务器支持大规模 WEB 应用的场景。随着 JDK 21 引入协程,未来 Tomcat 也将优化支持更高并发,降低响应式框架的必要性。
Vertx高并发理论原理以及对比SpringBoot
|
1月前
|
Java Maven Spring
springboot学习一:idea社区版本创建springboot项目的三种方式(第三种为主)
这篇文章介绍了在IntelliJ IDEA社区版中创建Spring Boot项目的三种方法,特别强调了第三种方法的详细步骤。
269 0
springboot学习一:idea社区版本创建springboot项目的三种方式(第三种为主)
|
1月前
|
Java Maven Spring
查看springboot版本支持最高的java版本
截至最近更新,Spring Boot 3.0及以上版本支持的最高Java版本为Java 17。鉴于技术的不断演进,建议直接参考Spring Boot的官方文档获取最准确的支持信息,因为这些版本兼容性可能会随着新版本的发布而有所变化。选择与你的Spring Boot版本相匹配的Java版本,可以确保充分利用框架特性,同时保证项目的稳定性和前瞻性。
43 0
|
2月前
|
前端开发 Java Spring
【非降版本解决】高版本Spring boot Swagger 报错解决方案
【非降版本解决】高版本Spring boot Swagger 报错解决方案
|
1月前
|
自然语言处理 搜索推荐 Java
SpringBoot 搜索引擎 海量数据 Elasticsearch-7 es上手指南 毫秒级查询 包括 版本选型、操作内容、结果截图(一)
SpringBoot 搜索引擎 海量数据 Elasticsearch-7 es上手指南 毫秒级查询 包括 版本选型、操作内容、结果截图
49 0
|
1月前
|
存储 自然语言处理 搜索推荐
SpringBoot 搜索引擎 海量数据 Elasticsearch-7 es上手指南 毫秒级查询 包括 版本选型、操作内容、结果截图(二)
SpringBoot 搜索引擎 海量数据 Elasticsearch-7 es上手指南 毫秒级查询 包括 版本选型、操作内容、结果截图(二)
34 0