ApplicationContextInitializer是Spring框架原有的東西,這個類的主要作用就是在ConfigurableApplicationContext類型(或者子類型)的ApplicationContext做refresh之前,允許我們對ConfiurableApplicationContext的實例做進一步的設置和處理。
ApplicationContextInitializer接口是在spring容器刷新之前執行的一個回調函數。是在ConfigurableApplicationContext#refresh() 之前調用(當spring框架內部執行 ConfigurableApplicationContext#refresh() 方法的時候或者在SpringBoot的run()執行時),作用是初始化Spring ConfigurableApplicationContext的回調接口。
ApplicationContextInitializer是Spring框架原有的概念, 這個類的主要目的就是在ConfigurableApplicationContext類型(或者子類型)的ApplicationContext做refresh之前,允許我們對ConfigurableApplicationContext的實例做進一步的設置或者處理。
通常用於需要對應用程序上下文進行編程初始化的web應用程序中。例如,根據上下文環境註冊屬性源或激活概要文件。
- 參考ContextLoader和FrameworkServlet中支持定義contextInitializerClasses作爲context-param或定義init-param。
- ApplicationContextInitializer支持Order註解,表示執行順序,越小越早執行
自定義ApplicationContextInitializer實現由三種方法:
先新建一個類實現ApplicationContextInitializer,如下:
package com.wm.contextinit.context;
import lombok.extern.slf4j.Slf4j;
import org.springframework.context.ApplicationContextInitializer;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.core.annotation.Order;
import java.util.Arrays;
/***
* @ClassName: MyApplicationContextInitializer
* @Description: ApplicationContextInitializer是一個回調接口,它會在ConfigurableApplicationContext的refresh()方法調用之前被調用,做一些容器的初始化工作。
* @Author: wm_yu
* @Create_time: 14:01 2019-11-27
*/
@Order(1)
@Slf4j
public class MyApplicationContextInitializer implements ApplicationContextInitializer {
@Override
public void initialize(ConfigurableApplicationContext configurableApplicationContext) {
log.info("MyApplicationContextInitializer.......");
// 打印容器裏面有多少個bean
System.out.println("bean count:" + configurableApplicationContext.getBeanDefinitionCount());
log.info("bean count:[{}]", configurableApplicationContext.getBeanDefinitionCount());
String[] beanDefinitionNames = configurableApplicationContext.getBeanDefinitionNames();
log.info("bean names:[{}]", Arrays.toString(beanDefinitionNames));
}
}
方法一:
在application中配置:
context:
initializer:
classes: com.wm.contextinit.context.MyApplicationContextInitializer
啓動main,如下:
可以看到這個自定義的是最先加載的
方法二:
在main方法中編碼方式啓動:
package com.wm.contextinit;
import com.wm.contextinit.context.MyApplicationContextInitializer;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class ContextinitApplication {
public static void main(String[] args) {
SpringApplication application = new SpringApplication(ContextinitApplication.class);
//加入自定義的啓動參數
application.addInitializers(new MyApplicationContextInitializer());
application.run(args);
}
}
啓動如下:
結果一樣的
方式三:
使用SpringBoot的SPI擴展---META-INF/spring.factories中配置
在META-INF下新建spring.factories文件
org.springframework.context.ApplicationContextInitializer=com.wm.contextinit.context.MyApplicationContextInitializer
啓動結果:
以上就是三種配置方式