Spring扩展机制:ApplicationContextIni
2021-06-15 本文已影响0人
十毛tenmao
ApplicationContextInitializer接口的实现类在Spring上下文refresh之前会被调用,利用这个扩展能力可以实现对Spring上下文的修改
初始化扩展类
一般在初始化类中可以实现
- 环境变量的处理和设置
- bean信息的解析
- 加载其他的配置信息源
@Slf4j
public class TenmaoInitializer implements ApplicationContextInitializer<ConfigurableApplicationContext> {
@Override
public void initialize(ConfigurableApplicationContext applicationContext) {
log.info("Hello, TenmaoInitializer For SpringBoot!");
//读取环境变量
ConfigurableEnvironment environment = applicationContext.getEnvironment();
String name = environment.getProperty("name", "application-name");
log.info("name: {}", name);
//读取bean信息
String[] definitionNames = applicationContext.getBeanFactory().getBeanDefinitionNames();
for (String definitionName : definitionNames) {
log.info("{}", definitionName);
}
//加载其他配置信息源,这里使用一个map来作为配置信息源,实际使用中是可以从远程网络中获取
Map<String, String> config = new HashMap<>(4);
config.put("age", "10");
environment.getPropertySources().addFirst(new PropertySource<Map<String, String>>("ten_config", config) {
@Override
public String getProperty(@NonNull String name) {
return getSource().get(name);
}
});
}
}
Spring入口
@Slf4j
@SpringBootApplication
public class SpringInitializerApplication implements CommandLineRunner {
@Value("${age}")
private int age;
public static void main(String[] args) {
SpringApplication.run(SpringInitializerApplication.class, args);
}
@Override
public void run(String... args) throws Exception {
log.info("age: {}", age);
}
}
注意:这里注入了一个变量age
,这个变量是从自定义的配置源Map<Sting, String>获取到的
启动方式一(推荐):resources/META-INF/spring.factories
一般推荐使用这种方式,因为可以方便使用方快速接入,引入jar包就可以了
org.springframework.context.ApplicationContextInitializer=com.tenmao.initializer.TenmaoInitializer
启动方式二:application.properties
context.initializer.classes=com.tenmao.initializer.TenmaoInitializer
启动方式三:手动添加初始化器SpringApplication#addInitializers
public static void main(String[] args) {
SpringApplication application = new SpringApplication(SpringInitializerApplication.class);
//添加初始化器
application.addInitializers(new TenmaoInitializer());
application.run(args);
}