上QQ阅读APP看书,第一时间看更新
3.2 SpringApplication实例化流程
上面我们了解了进行SpringApplication实例化的基本方法,下面我们先通过一张简单的流程图来系统地学习在创建SpringApplication对象时都进行了哪些核心操作,如图3-1所示。
图3-1 创建SpringApplication核心操作流程图
通过图3-1可以看出,在SpringApplication对象实例化的过程中主要做了3件事:参数赋值给成员变量、应用类型及方法推断和ApplicationContext相关内容加载及实例化。
我们结合流程图看一下SpringApplication两个构造方法的核心源代码。
public SpringApplication(Class<?>... primarySources) { this(null, primarySources); } @SuppressWarnings({ "unchecked", "rawtypes" }) public SpringApplication(ResourceLoader resourceLoader, Class<?>... primarySources) { this.resourceLoader = resourceLoader; Assert.notNull(primarySources, "PrimarySources must not be null"); this.primarySources = new LinkedHashSet<>(Arrays.asList(primarySources)); // 推断Web应用类型 this.webApplicationType = WebApplicationType.deduceFromClasspath(); // 加载并初始化ApplicationContextInitializer及相关实现类 setInitializers((Collection) getSpringFactoriesInstances(ApplicationContextInitializer.class)); // 加载并初始化ApplicationListener及相关实现类 setListeners((Collection) getSpringFactoriesInstances(ApplicationListener.class)); // 推断main方法Class类 this.mainApplicationClass = deduceMainApplicationClass(); }
SpringApplication提供了两个构造方法,核心业务逻辑在第二个构造方法中实现,在后面章节我们会从构造方法中的具体实现入手进行详细讲解,先来了解SpringApplication的初始化过程。