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