ApplicationContextInitializer 接口是在spring容器执行refreshed之前的一个回调
使用步骤:
(一).写一个类,实现ApplicationContextInitializer接口
package com.alongwu.spring;
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("bean count:" + applicationContext.getBeanDefinitionCount());
}
}
(二).注册 ApplicationContextInitializer
注册的三种方法:
1.SpringApplication.addInitializers
package com.alongwu.spring;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ConfigurableApplicationContext;
@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=com.alongwu.spring.MyApplicationContextInitializer,com.alongwu.spring.MyApplicationContextInitializer2
package com.alongwu.spring;
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("bean count:" + applicationContext.getBeanDefinitionCount());
}
}
package com.alongwu.spring;
import org.springframework.context.ApplicationContextInitializer;
import org.springframework.context.ConfigurableApplicationContext;
public class MyApplicationContextInitializer2 implements ApplicationContextInitializer<ConfigurableApplicationContext> {
@Override
public void initialize(ConfigurableApplicationContext applicationContext) {
System.out.println("app name"+applicationContext.getDisplayName());
}
}
3.可以通过spring.factories机制(META-INF/spring.factories配置文件)
org.springframework.context.ApplicationContextInitializer=com.alongwu.spring.EchoApplicationContextInitializer
package com.alongwu.spring;
import org.springframework.context.ApplicationContextInitializer;
import org.springframework.context.ConfigurableApplicationContext;
public class EchoApplicationContextInitializer implements ApplicationContextInitializer<ConfigurableApplicationContext> {
@Override
public void initialize(ConfigurableApplicationContext applicationContext) {
System.out.println("===========EchoApplicationContextInitializer ================");
}
}
. ____ _ __ _ _
/\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
\\/ ___)| |_)| | | | | || (_| | ) ) ) )
' |____| .__|_| |_|_| |_\__, | / / / /
=========|_|==============|___/=/_/_/_/
:: Spring Boot :: (v1.5.15.RELEASE)
bean count:6
app name:org.springframework.context.annotation.AnnotationConfigApplicationContext@6dde5c8c
===========EchoApplicationContextInitializer ================
2018-08-31 15:22:35.884 INFO 4548 --- [ main] com.alongwu.spring.App : Starting App on C64-20170810WYU with PID 4548 (D:\studyWork\spring-boot-8\target\classes started by Administrator in D:\studyWork\spring-boot-8)
2018-08-31 15:22:35.901 INFO 4548 --- [ main] com.alongwu.spring.App : No active profile set, falling back to default profiles: default
2018-08-31 15:22:36.031 INFO 4548 --- [ main] s.c.a.AnnotationConfigApplicationContext : Refreshing org.springframework.context.annotation.AnnotationConfigApplicationContext@6dde5c8c: startup date [Fri Aug 31 15:22:36 CST 2018]; root of context hierarchy
2018-08-31 15:22:37.362 INFO 4548 --- [ main] o.s.j.e.a.AnnotationMBeanExporter : Registering beans for JMX exposure on startup
2018-08-31 15:22:37.392 INFO 4548 --- [ main] com.alongwu.spring.App : Started App in 2.232 seconds (JVM running for 2.978)
2018-08-31 15:22:37.393 INFO 4548 --- [ main] s.c.a.AnnotationConfigApplicationContext : Closing org.springframework.context.annotation.AnnotationConfigApplicationContext@6dde5c8c: startup date [Fri Aug 31 15:22:36 CST 2018]; root of context hierarchy
2018-08-31 15:22:37.394 INFO 4548 --- [ main] o.s.j.e.a.AnnotationMBeanExporter : Unregistering JMX-exposed beans on shutdown