1. 程式人生 > 實用技巧 >SpringBoot原理髮現(四)

SpringBoot原理髮現(四)


說明:

本系列基於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...