ApplicationContextInitializer接口在spring容器执行refreshed之前回调,实现方式有3种
方式一:调用SpringApplication的addInitializers方法注册
pom.xml
4.0.0
com.edu.spring
springboot
1.0.0
jar
springboot
http://www.example.com
org.springframework.boot
spring-boot-dependencies
2.1.6.RELEASE
import
pom
UTF-8
1.8
1.8
org.springframework.boot
spring-boot-starter
View Code
MyApplicationContextInitializer.java,实现ApplicationContextInitializer接口
packagecom.edu.spring.springboot;importorg.springframework.context.ApplicationContextInitializer;importorg.springframework.context.ConfigurableApplicationContext;public class MyApplicationContextInitializer implementsApplicationContextInitializer{
@Overridepublic voidinitialize(ConfigurableApplicationContext applicationContext) {//TODO Auto-generated method stub
System.out.println("当前容器bean数量:"+applicationContext.getBeanDefinitionCount());
}
}
View Code
App.java,调用SpringApplication的addInitializers方法(可以有多个)
packagecom.edu.spring.springboot;importorg.springframework.boot.SpringApplication;importorg.springframework.boot.autoconfigure.SpringBootApplication;importorg.springframework.context.ConfigurableApplicationContext;
@SpringBootApplicationpublic classApp
{public static voidmain( String[] args )
{
SpringApplication app=new SpringApplication(App.class);
app.addInitializers(newMyApplicationContextInitializer());
ConfigurableApplicationContext context=app.run(args);
context.close();
}
}
View Code
运行结果如下:
方式二:application.properties中配置context.initializer.classes属性(可以配置多个)
application.properties
context.initializer.classes=com.edu.spring.springboot.MyApplicationContextInitializer,com.edu.spring.springboot.MyApplicationContextInitializer2
View Code
MyApplicationContextInitializer2.java
packagecom.edu.spring.springboot;importorg.springframework.context.ApplicationContextInitializer;importorg.springframework.context.ConfigurableApplicationContext;public class MyApplicationContextInitializer2 implementsApplicationContextInitializer{
@Overridepublic voidinitialize(ConfigurableApplicationContext applicationContext) {//TODO Auto-generated method stub
System.out.println("app name:"+applicationContext.getApplicationName());
}
}
View Code
App.java,去掉addInitializers方法
packagecom.edu.spring.springboot;importorg.springframework.boot.SpringApplication;importorg.springframework.boot.autoconfigure.SpringBootApplication;importorg.springframework.context.ConfigurableApplicationContext;
@SpringBootApplicationpublic classApp
{public static voidmain( String[] args )
{
SpringApplication app=new SpringApplication(App.class);
ConfigurableApplicationContext context=app.run(args);
context.close();
}
}
View Code
运行结果如下:
方式三:使用spring.factories机制
resources/META-INF/spring.factories
org.springframework.context.ApplicationContextInitializer=com.edu.spring.springboot.EchoApplicationContextInitializer
View Code
EchoApplicationContextInitializer.java
packagecom.edu.spring.springboot;importorg.springframework.context.ApplicationContextInitializer;importorg.springframework.context.ConfigurableApplicationContext;public class EchoApplicationContextInitializer implementsApplicationContextInitializer{public voidinitialize(ConfigurableApplicationContext applicationContext) {
System.out.println("=============EchoApplicationContextInitializer=================");
}
}
View Code
App.java
packagecom.edu.spring.springboot;importorg.springframework.boot.SpringApplication;importorg.springframework.boot.autoconfigure.SpringBootApplication;importorg.springframework.context.ConfigurableApplicationContext;
@SpringBootApplicationpublic classApp
{public static voidmain( String[] args )
{
SpringApplication app=new SpringApplication(App.class);
ConfigurableApplicationContext context=app.run(args);
context.close();
}
}
View Code
运行结果如下:
由于spring.factories机制会扫描所有工程里面的/META-INF/spring.factories文件,所以另建一个工程也可以运行,如下:
新建core-bean
pom.xml
4.0.0
com.edu.core
core-bean
1.0.0
jar
springboot
http://www.example.com
UTF-8
1.8
1.8
org.springframework
spring-context
4.3.2.RELEASE
View Code
EchoApplicationContextInitializer.java
packagecom.edu.initializer;importorg.springframework.context.ApplicationContextInitializer;importorg.springframework.context.ConfigurableApplicationContext;public class EchoApplicationContextInitializer implementsApplicationContextInitializer{public voidinitialize(ConfigurableApplicationContext applicationContext) {
System.out.println("=============core-bean:EchoApplicationContextInitializer=================");
}
}
View Code
resources/META-INF/spring.factories
org.springframework.context.ApplicationContextInitializer=com.edu.initializer.EchoApplicationContextInitializer
View Code
原工程的pom.xml文件引入core-bean坐标
pom.xml
4.0.0
com.edu.spring
springboot
1.0.0
jar
springboot
http://www.example.com
org.springframework.boot
spring-boot-dependencies
2.1.6.RELEASE
import
pom
UTF-8
1.8
1.8
org.springframework.boot
spring-boot-starter
com.edu.core
core-bean
1.0.0
View Code
运行原工程App.java
packagecom.edu.spring.springboot;importorg.springframework.boot.SpringApplication;importorg.springframework.boot.autoconfigure.SpringBootApplication;importorg.springframework.context.ConfigurableApplicationContext;
@SpringBootApplicationpublic classApp
{public static voidmain( String[] args )
{
SpringApplication app=new SpringApplication(App.class);
ConfigurableApplicationContext context=app.run(args);
context.close();
}
}
View Code
运行结果如下:
CommandLineRunner、ApplicationRunner是spring容器启动成功后最后的回调,@Order控制顺序,数字越小越先执行,请看示例:
ServerSuccessReport.java
packagecom.edu.spring.springboot;importjava.util.Arrays;importorg.springframework.boot.CommandLineRunner;importorg.springframework.core.annotation.Order;importorg.springframework.stereotype.Component;
@Order(1)
@Componentpublic class ServerSuccessReport implementsCommandLineRunner {
@Overridepublic void run(String... args) throwsException {//TODO Auto-generated method stub
System.out.println("==========ServerSuccessReport1============"+Arrays.asList(args));
}
}
View Code
ServerSuccessReport2.java
packagecom.edu.spring.springboot;importjava.util.Arrays;importorg.springframework.boot.CommandLineRunner;importorg.springframework.core.annotation.Order;importorg.springframework.stereotype.Component;
@Order(3)
@Componentpublic class ServerSuccessReport2 implementsCommandLineRunner {
@Overridepublic void run(String... args) throwsException {//TODO Auto-generated method stub
System.out.println("==========ServerSuccessReport2============"+Arrays.asList(args));
}
}
View Code
StartedApplicationRunner.java
packagecom.edu.spring.springboot;importjava.util.Arrays;importorg.springframework.boot.ApplicationArguments;importorg.springframework.boot.ApplicationRunner;importorg.springframework.core.annotation.Order;importorg.springframework.stereotype.Component;
@Order(2)
@Componentpublic class StartedApplicationRunner implementsApplicationRunner {public void run(ApplicationArguments args) throwsException {
System.out.println("应用已经启动,参数为:"+Arrays.asList(args.getSourceArgs()));
}
}
View Code
App.java
packagecom.edu.spring.springboot;importorg.springframework.boot.SpringApplication;importorg.springframework.boot.autoconfigure.SpringBootApplication;importorg.springframework.context.ConfigurableApplicationContext;
@SpringBootApplicationpublic classApp
{public static voidmain( String[] args )
{
SpringApplication app=new SpringApplication(App.class);
ConfigurableApplicationContext context= app.run("aa","bb ");
context.close();
}
}
View Code
运行结果如下:
CommandLineRunner与ApplicationRunner的区别是CommandLineRunner参数是原始的,ApplicationRunner参数是对原始参数的封装。