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"));
}
}