SpringApplication类 在主类——即带有@SpringBootApplication注解类,的main方法里调用SpringApplication.run(应用的Configration配置类.class,参数列表) 会启动spring应用。默认log级别是INFO,会显示一些相关的启动详情,比如启动应用的用户等。
1. 使用SpringApplicationBuilder类可以创建分层的 ApplicationContext
new SpringApplicationBuilder() .bannerMode(Banner.Mode.OFF) .sources(Parent.class) .child(Application.class) .run(args); 2. Application事件和监听器 除了常用的Spring framework事件,例如ContextRefreshedEvent等,SpringApplication也会发送一些其他的应用事件。 一些事件在ApplicationContext被创建之前就被触发,因此无法将监听器注册为bean来监听。但是可以使用SpringApplication.addListeners(…) 或SpringApplicationBuilder.listeners(…)来注册监听器。也可以在META-INF/spring.factories文件定义监听器: org.springframework.context.ApplicationListener=com.example.project.MyListener 应用运行时,应用事件发送顺序如下: ① 在监听器和初始化器被初始化之后,任何其他应用之前,应用刚开始运行时会发送一个ApplicationStartedEvent。 ② 在context被创建之前,context中要使用的Environment被知道时,一个ApplicationEnvironmentPreparedEvent被发送。 ③ 在bean定义被加载之后,refresh启动之前,一个ApplicationPreparedEvent被发送。 ④ 在refresh以及任何相关的回调被处理之后,一个ApplicationReadyEvent被发送,表明应用已准备好服务requests。 ⑤ 启动时如果发生异常,一个ApplicationFailedEvent被发送。 3. web环境 SpringApplication会根据应用是否为web来创建不同的ApplicationContext: AnnotationConfigApplicationContext或AnnotationConfigEmbeddedWebApplicationContext。 可以调用setWebEnvironment(boolean webEnvironment)复写默认实现(在junit测试时置为false最好),更可以使用setApplicationContextClass(…).完全控制ApplicationContext的创建。
4. 在SpringApplication.run完成前执行特定代码 使用ApplicationRunner或CommandLineRunner,并配合Order注解指定调用顺序。 CommandLineRunner的run(String …args)方法直接访问SpringApplication.run传递的参数,ApplicationRunner的run方法则使用ApplicationArguments访问参数。例如:
import org.springframework.boot.* import org.springframework.stereotype.* @Component public class MyBean implements CommandLineRunner { public void run(String... args) { // Do something...