SpringBoot原理髮現(四)
阿新 • • 發佈:2020-11-02
說明:
本系列基於SpringBoot 2.2.9.RELEASE 版本,對SpringBoot的原理進行分析,一共分為四節:
SpringBoot原理髮現(一):建立Hello World,對pom依賴以及@SpringBootApplication註解進行分析
SpringBoot原理髮現(二):分析SpringBoot自動配置原理
SpringBoot原理髮現(三):通過主配置類main方法分析SpringBoot啟動配置原理
SpringBoot原理髮現(四):瞭解SpringBoot啟動中的幾個重要回調機制
SpringBoot回撥機制
針對SpringBoot原理髮現(三)第二步驟springApplication.run(args)應用啟動中包含的回撥機制,編寫如下四個實現類,主要觀察啟動流程
1.ApplicationContextInitializer
@Component public class MyApplicationContextInitializer implements ApplicationContextInitializer { @Override public void initialize(ConfigurableApplicationContext applicationContext) { System.out.println("MyApplicationContextInitializer initialize ..."); } }
2.SpringApplicationRunListener
@Component public class MySpringApplicationRunListener implements SpringApplicationRunListener { public MySpringApplicationRunListener(){} public MySpringApplicationRunListener(SpringApplication application, String[] args){} public void starting() { System.out.println("MySpringApplicationRunListener starting..."); } public void environmentPrepared(ConfigurableEnvironment environment) { System.out.println("MySpringApplicationRunListener environmentPrepared..."); } public void contextPrepared(ConfigurableApplicationContext context) { System.out.println("MySpringApplicationRunListener contextPrepared..."); } public void contextLoaded(ConfigurableApplicationContext context) { System.out.println("MySpringApplicationRunListener contextLoaded..."); } public void started(ConfigurableApplicationContext context) { System.out.println("MySpringApplicationRunListener started..."); } public void running(ConfigurableApplicationContext context) { System.out.println("MySpringApplicationRunListener running..."); } }
通過SpringBoot原理髮現(三)知道ApplicationContextInitializer和SpringApplicationRunListener是從
META-INF/spring.factories讀取的,所以需要配置該檔案。
META-INF/spring.factories配置:
# Initializers org.springframework.context.ApplicationContextInitializer=\ com.example.demo.listener.MyApplicationContextInitializer org.springframework.boot.SpringApplicationRunListener=\ com.example.demo.listener.MySpringApplicationRunListener
3.ApplicationRunner
@Component public class MyApplicationRunner implements ApplicationRunner { @Override public void run(ApplicationArguments args) throws Exception { System.out.println("MyApplicationRunner run..."); } }
4.CommandLineRunner
@Component
public class MyCommandLineRunner implements CommandLineRunner {
@Override
public void run(String... args) throws Exception {
System.out.println("MyCommandLineRunner run");
}
}
輸出
觀察結果能驗證出輸出順序和上一篇文章分析結果一樣
MySpringApplicationRunListener starting... MySpringApplicationRunListener environmentPrepared... . ____ _ __ _ _ /\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \ ( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \ \\/ ___)| |_)| | | | | || (_| | ) ) ) ) ' |____| .__|_| |_|_| |_\__, | / / / / =========|_|==============|___/=/_/_/_/ :: Spring Boot :: (v2.2.9.RELEASE) MyApplicationContextInitializer initialize ... MySpringApplicationRunListener contextPrepared... 2020-10-30 17:46:09.280 INFO 5132 --- [ main] com.example.demo.DemoApplication : Starting DemoApplication on 2020-10-30 17:46:09.283 INFO 5132 --- [ main] com.example.demo.DemoApplication : No active profile set, falling back to default profiles: default MySpringApplicationRunListener contextLoaded... 2020-10-30 17:46:10.410 INFO 5132 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat initialized with port(s): 8080 (http) 2020-10-30 17:46:10.425 INFO 5132 --- [ main] o.apache.catalina.core.StandardService : Starting service [Tomcat] 2020-10-30 17:46:10.426 INFO 5132 --- [ main] org.apache.catalina.core.StandardEngine : Starting Servlet engine: [Apache Tomcat/9.0.37] 2020-10-30 17:46:10.574 INFO 5132 --- [ main] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring embedded WebApplicationContext 2020-10-30 17:46:10.579 INFO 5132 --- [ main] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 1256 ms 2020-10-30 17:46:10.766 INFO 5132 --- [ main] o.s.s.concurrent.ThreadPoolTaskExecutor : Initializing ExecutorService 'applicationTaskExecutor' 2020-10-30 17:46:10.966 INFO 5132 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port(s): 8080 (http) with context path '' 2020-10-30 17:46:10.970 INFO 5132 --- [ main] com.example.demo.DemoApplication : Started DemoApplication in 3.292 seconds (JVM running for 3.959) MySpringApplicationRunListener started... MyApplicationRunner run... MyCommandLineRunner run MySpringApplicationRunListener running...