
ApplicationContextInitializer接口是在spring容器刷新之前執(zhí)行的一個(gè)回調(diào)函數(shù)。

發(fā)現(xiàn)這個(gè)接口是定義在org.springframework.context包下的??纯雌鋔avadoc:
Callback interface for initializing a Spring ConfigurableApplicationContext
prior to being ConfigurableApplicationContext#refresh() refreshed.
spring上下文初始化的回調(diào)函數(shù)在上下文(ConfigurableApplicationContext)刷新(refresh)之前調(diào)用。
Typically used within web applications that require some programmatic initialization of the application context. For example, registering property sources or activating profiles against the {@linkplain ConfigurableApplicationContext#getEnvironment() context's environment}. See ContextLoader and FrameworkServlet support for declaring a "contextInitializerClasses" context-param and init-param, respectively.
通常被用作web應(yīng)用,在一些程序設(shè)計(jì)在spring容器初始化使用。比如說注冊一些熟悉配置或者激活一些配置文件針對(ConfigurableApplicationContext的getEnvironment()方法)。參考ContextLoader和FrameworkServlet支持定義一個(gè)"contextInitializerClasses"上下文參數(shù)或者初始化參數(shù)。
ApplicationContextInitializer processors are encouraged to detect whether Spring's org.springframework.core.Ordered Ordered} interface has been implemented or if the org.springframework.core.annotation.Order Order annotation is present and to sort instances accordingly if so prior to invocation.
支持Order注解。并且代表著執(zhí)行順序。
demo
定義MyApplicationContextInitializer繼承ApplicationContextInitializer接口
package com.zhihao.miao;
import org.springframework.context.ApplicationContextInitializer;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.core.annotation.Order;
@Order(2)
public class MyApplicationContextInitializer implements ApplicationContextInitializer{
@Override
public void initialize(ConfigurableApplicationContext applicationContext) {
System.out.println("bean count====="+applicationContext.getBeanDefinitionCount());
}
}
定義另外一個(gè)MyApplicationContextInitializer2繼承ApplicationContextInitializer接口:
package com.zhihao.miao;
import org.springframework.context.ApplicationContextInitializer;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.core.annotation.Order;
@Order(1)
public class MyApplicationContextInitializer2 implements ApplicationContextInitializer {
@Override
public void initialize(ConfigurableApplicationContext applicationContext) {
System.out.println("app name : " + applicationContext.getDisplayName());
}
}
主類測試:
package com.zhihao.miao;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ConfigurableApplicationContext;
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication application = new SpringApplication(Application.class);
application.addInitializers(new MyApplicationContextInitializer());
application.addInitializers(new MyApplicationContextInitializer2());
ConfigurableApplicationContext context =application.run(args);
context.close();
}
}

執(zhí)行順序和@Order注解的順序相反,Order的value值越小表示越早執(zhí)行。
上面是關(guān)于自定義ApplicationContextInitializer的一種注冊方法,還有二種注冊方法,
第二種方式
在application.properties中定義:
context.initializer.classes=com.zhihao.miao.MyApplicationContextInitializer,com.zhihao.miao.MyApplicationContextInitializer2
主類測試:
package com.zhihao.miao;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class,args);
}
}
第三種方式
新建core-baen(名字自己定義)項(xiàng)目,新建一個(gè)MyApplicationContextInitializer實(shí)現(xiàn)ApplicationContextInitializer接口
package core.bean;
import org.springframework.context.ApplicationContextInitializer;
import org.springframework.context.ConfigurableApplicationContext;
public class MyApplicationContextInitializer implements ApplicationContextInitializer<ConfigurableApplicationContext>{
@Override
public void initialize(ConfigurableApplicationContext applicationContext) {
System.out.println("========initialize=======");
}
}
然后在core-bean項(xiàng)目下的resources下新建META-INF文件夾,文件夾下新建spring.factories文件
org.springframework.context.ApplicationContextInitializer=core.bean.MyApplicationContextInitializer
在項(xiàng)目中引入
<dependency>
<groupId>com.zhihao.miao</groupId>
<artifactId>core-bean</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
啟動類:
package com.zhihao.miao;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class,args);
}
}
啟動啟動類并執(zhí)行:

總結(jié)
自定義ApplicationContextInitializer接口的方式:
1)寫一個(gè)類,實(shí)現(xiàn)ApplicationContextInitializer接口
2)注冊ApplicationContextInitializer