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类会做如下事情启动应用:
下面我们通过SpringApplication的源码详细描述上述这些过程。
下面是SpringApplication类静态run方法的源码。可以看到,当我们调用这个静态run方法时,实际上会构造一个SpringApplication实例,然后再调用实例的run方法完成spring应用的启动。
public static ConfigurableApplicationContext run(Class<?>[] primarySources, String[] args) { return new SpringApplication(primarySources).run(args); }
下面是SpringApplication的构造函数,它主要完成下面初始化工作:
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配置文件的地址。