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...