相信使用過Spring Boot的開發人員,都對Spring Boot的核心模塊中提供的SpringApplication類不陌生。SpringApplication類的run()方法往往在Spring應用的入口類中被調用,以啟動Spring應用。
1.Spring應用的入口類與SpringApplication類
1) Spring應用的入口類
Spring應用的入口類是Spring應用的配置起點,是配置Spring上下文的起點,往往使用了@SpringBootApplication或@EnableAutoConfiguration等標注類。
在Spring應用的入口類中往往只有一個main()方法,這雖然與標准的Java應用保持了一致,但在有些時候會讓開發人員覺得困惑。
在Spring應用的入口類中的main()方法中,往往只是簡單地調用Spring Boot的SpringApplication類的run()方法,以啟動該Spring應用。
SpringApplication.run(MySpringConfigurationApp.class, args);
其中,第一個參數MySpringConfigurationApp.class就是Spring應用的入口類;第二個參數args是啟動Spring應用的命令行參數,該參數可以在Spring應用中被訪問(稍后詳解)。
2) Spring Boot的SpringApplication類
Spring Boot的SpringApplication類,用以啟動一個Spring應用,實質上是為Spring應用創建並初始化Spring上下文。
SpringApplication類的run()方法默認返回一個ConfigurableApplicationContext對象。
- 2.、SpringApplication類的其他配置
- banner.txt以定制啟動LOGO
- 禁用LOGO
SpringApplication app = new SpringApplication(MySpringConfigurationApp.class);
app.setBannerMode(Banner.Mode.OFF);
app.run(args);
- 啟動過程中的可監聽事件
ApplicationStartingEvent
ApplicationEnvironmentPreparedEvent
ApplicationPreparedEvent
ApplicationReadyEvent或ApplicationFailedEvent
3、 增強SpringApplication類的CommandLineRunner接口或ApplicationRunner接口
啟動Spring應用后,如果還想進一步執行其他代碼,可以定義Spring bean類以實現CommandLineRunner接口或ApplicationRunner接口。
CommandLineRunner接口或ApplicationRunner接口都只提供了唯一的run()方法,該方法將在SpringApplication.run()方法執行結束前被調用。
1) CommandLineRunner接口能夠以String數組的形式訪問Spring應用的啟動參數args
@Component public class MyBean implements CommandLineRunner { public void run(String... args) { // Do something... } }
2) ApplicationRunner接口能夠以ApplicationArguments的形式訪問應用的參數args
@Component public class MyBean implements ApplicationRunner{ public void run(ApplicationArguments args) { // Do something... } }
4、 在Spring bean中,通過構造函數訪問Spring應用的啟動參數args
@Component public class MyBean { @Autowired public MyBean(ApplicationArguments args) { boolean debug = args.containsOption("debug");//參數作為命令行中的一個option,如--debug List<String> files = args.getNonOptionArgs(); // 如果啟動參數"--debug logfile.txt", // 則debug=true, files=["logfile.txt"] } }