Spring Boot(十二)擴展分析 Initializer 和 Runner

 1.Spring容器執行refreshed之前的回調


    1.ApplicationContextInitializer 接口


        1.使用步驟


            1.寫一個類,實現ApplicationContextInitializer接口

public class MyApplicationContextInitializer implements ApplicationContextInitializer<ConfigurableApplicationContext> {
    public void initialize(ConfigurableApplicationContext applicationContext) {
        System.out.println("bean count="+applicationContext.getBeanDefinitionCount());
    }
}

            2.註冊ApplicationContextInitializer


        2.註冊方法


            0.直接納入到Spring容器中,不能實現註冊
                如 使用 @Component 註解
            1.SpringApplication.addInitializers

@SpringBootApplication
public class App {
    public static void main(String[] args) {
        SpringApplication app=new SpringApplication(App.class);
        app.addInitializers(new MyApplicationContextInitializer());
        ConfigurableApplicationContext context=app.run(args);
        context.close();
    }
}

            2.通過配置項context.initializer.classes 指定,可以指定多個 ,用逗號 隔開
                在 application.properties 配置文件中 添加 context.initializer.classes=實現pplicationContextInitializer的類的全局名稱 


(如:context.initializer.classes=com.edu.spring.springboot.SpringBoot12_ExtendAnalysis.MyApplicationContextInitializer)

            3.可以通過spring.factories機制(這次listener監聽器,也可以使用這種方法)
                1.新創建一個maven項目
                2.創建ApplicationContextInitializer 的實現類
                3.在 resources/META-INF/spring.factories 裏 
                    添加 ApplicationContextInitializer的全局名稱=ApplicationContextInitializer 實現類的全局名稱


(如:org.springframework.context.ApplicationContextInitializer=com.edu.spring.initializer.EchoApplicationContextInitializer)


                4.通過maven把新建的項目的依賴添加到舊的項目裏

 2.pring容器啓動成功後緊接着執行的回調


    1.CommandLineRunner/ApplicationRunner 接口


        1.使用步驟


            1.寫一個類,實現CommandLineRunner/ApplicationRunner
                
            2.把該類納入到Spring容器的管理之中

 

        2.注意:可以使用 @Order() 註解 或 Order接口 來控制執行順序 。數值越小,越先執行

@Order(1)
@Component
public class ServiceSuccessReport implements CommandLineRunner{}

        3.CommandLineRunner/ApplicationRunner 區別


            1.區別在於參數不一樣
                1.CommandLineRunner的參數是最原始的參數,沒有做任何處理
                2.ApplicationRunner的參數是ApplicationArguments,是對原始數據做了進一步的封裝
                    1.ApplicationArguments是對參數(main方法)做了進一步處理
                    2.可以解析--name=value的啓動參數,我們可以通過name來獲取value

@Component
public class StartedApplicationRunner implements ApplicationRunner {
    public void run(ApplicationArguments args) throws Exception {
        System.out.println("name  value=" + args.getOptionValues("name"));
    }
}

發佈了40 篇原創文章 · 獲贊 2 · 訪問量 9810
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章