深入理解SpringApplication

栏目: Java · 发布时间: 6年前

内容简介:SpringApplication的静态方法SpringApplication类会做如下事情启动应用:

SpringApplication 类用于引导和启动一个Spring应用程序(即SpringBoot开发的应用)。通常用SpringBoot开发一个应用程序时,在主类的main函数中可以通过如下代码启动一个Spring应用:

@SpringBootApplication
public class App {
    public static void main(String[] args) {
        SpringApplication.run(App.class, args);
    }
}

SpringApplication的静态方法 run(Class<?> primarySource, String... args)) 的第一个参数接受一个Spring容器配置类(用 Java 代码对Spring容器进行配置)。第二个参数是命令行参数。将命令行参数转发给SpringApplication类,就可以在用java命令启动应用时,通过命令行参数对Spring应用做一些配置。

SpringApplication类会做如下事情启动应用:

  • 为应用创建一个合适的ApplicationContext
  • 注册一个CommandLinePropertySource,通过CommandLinePropertySource可以对外暴露命令行参数,并将命令行参数与spring应用中用到的properties关联起来
  • 启动ApplicationContext
  • 执行所有的CommandLineRunner类型bean

下面我们通过SpringApplication的源码详细描述上述这些过程。

构建SpringApplication实例

下面是SpringApplication类静态run方法的源码。可以看到,当我们调用这个静态run方法时,实际上会构造一个SpringApplication实例,然后再调用实例的run方法完成spring应用的启动。

public static ConfigurableApplicationContext run(Class<?>[] primarySources,
        String[] args) {
    return new SpringApplication(primarySources).run(args);
}

下面是SpringApplication的构造函数,它主要完成下面初始化工作:

  • 初始化Spring容器的配置类 primarySources
  • 判断应用程序的类型,进而根据应用程序的类型创建恰当的ApplicationContext
  • 初始化指定的 ApplicationContextInitializer 列表
  • 初始化指定的 ApplicationListener 列表
  • 推断main class的类名称
public SpringApplication(ResourceLoader resourceLoader, Class<?>... primarySources) {
    this.resourceLoader = resourceLoader;
    Assert.notNull(primarySources, "PrimarySources must not be null");
    this.primarySources = new LinkedHashSet<>(Arrays.asList(primarySources));
    this.webApplicationType = WebApplicationType.deduceFromClasspath();
    setInitializers((Collection) getSpringFactoriesInstances(
            ApplicationContextInitializer.class));
    setListeners((Collection) getSpringFactoriesInstances(ApplicationListener.class));
    this.mainApplicationClass = deduceMainApplicationClass();
}

下面对这些初始化过程进行一一说明:

spring容器配置

SpringApplication能够从各种不同的配置源读取bean的定义。Spring Boot建议采用Java注解配置的方式提供一个全局唯一的配置类。但是,你可以同时使用多种不同的配置源。如果是Java注解的配置方式,会使用 AnnotatedBeanDefinitionReader 加载配置(通过全类名)。如果是XML的配置方式,则会使用 XmlBeanDefinitionReader 加载配置(通过XML文件地址)。

如果除了primarySources配置类以外,还需要其它的ApplicationContext配置源,则可以调用 SpringApplication#setSources(Set<String> sources) 方法进行设置,该方法的参数既可以接受一个配置类的全类名,也可以是一个XML配置文件的地址。


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

后谷歌时代:大数据的衰落及区块链经济的崛起

后谷歌时代:大数据的衰落及区块链经济的崛起

乔治·吉尔德 / 现代出版社 / 2018-9-5 / 68

以大数据和机器智能为基础的谷歌时代(信息互联网时代)是一个令人敬畏的时代。但它即将终结。 《后谷歌时代》一书的作者乔治•吉尔德是一位颇具远见卓识的智者。他在技术和文化领域具有无与伦比的视野和见地。他向读者描述了谷歌所面临信任与安全危机,并勇敢地预测了即将到来的后谷歌时代。 谷歌用其惊人的“搜索和排序”能力吸引了整个世界。功能强大的搜索引擎,看似免费小应用,诸如视频、地图、电子邮箱等,让......一起来看看 《后谷歌时代:大数据的衰落及区块链经济的崛起》 这本书的介绍吧!

Base64 编码/解码
Base64 编码/解码

Base64 编码/解码

RGB HSV 转换
RGB HSV 转换

RGB HSV 互转工具

HEX HSV 转换工具
HEX HSV 转换工具

HEX HSV 互换工具