什么是系统初始化器
系统初始化器在SprinBoot中类名是:ApplicationContextInitializer,Spring在容器刷新前执行的一个回调函数。
作用:
它能够让我们向Spring容器中注入我们自己的属性,我们可以使用实现这个接口来自定义实现
实现自己的系统初始化器(第一种方式)
1:在SpringBoot项目中新建一个类
public class FirstInitializer implements ApplicationContextInitailizer<ConfigurableApplicationContext>{
@Override
public void initialize(ConfigurableApplicationContext applicationContext) {
ConfigurableEnvironment environment = applicationContext.getEnvironment();
Map<String,Object> map = new HashMap<>();
//设置我们自己的属性
map.put("key1","value1");
MapPropertySource mapPropertySource = new MapPropertySource("firstInitializer",map);
environment.getPropertySources().addLast(mapPropertySource);
logger.info("屬性配置完成,{}",map);
}
}
2:在resource目录下新建一个文件夹,名称是META-INF,在文件夹中创建一个文件spring.factories
里面的内容是:org.springframework.context.ApplicationContextInitializer=com.example.souce.initializer.FirstInitializer
3:配置好了,如何证明属性设置成功了呢?? 新建一个Service类
@Service
public class TestService implements ApplicationContextAware{
private ApplicationContextAware applicationContextAware;
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
this.applicationContext = applicationContext;
}
public String test() {
String value = applicationContext.getEnvironment().getProperty("key1");
return value;
}
}
4:新建一个Controller类
@RestController
public class TestController {
@Autowired
TestService testService;
@GetMapping("/test")
public String test() {
return testService.test();
}
}
5:浏览器访问localhost:8080/test,就可以看到我们自己设置的属性值了
实现自己的系统初始化器(第二种方式)
1:在SpringBoot项目中新建一个类
public class SecondInitializer implements ApplicationContextInitailizer<ConfigurableApplicationContext>{
@Override
public void initialize(ConfigurableApplicationContext applicationContext) {
ConfigurableEnvironment environment = applicationContext.getEnvironment();
Map<String,Object> map = new HashMap<>();
//设置我们自己的属性
map.put("key2","value2");
MapPropertySource mapPropertySource = new MapPropertySource("secondInitializer",map);
environment.getPropertySources().addLast(mapPropertySource);
logger.info("屬性配置完成,{}",map);
}
}
2:修改启动类
修改之前:
public static void main(String[] args) {
SpringApplication.run(SouceApplication.class,args);
}
修改之后:
public static void main(String[] args) {
SpringApplication springApplication = new SpringApplication(SouceApplication.class);
springApplication.addInitializers(new SecondInitializer());
springApplication.run(args);
}
3:测试,将第一种方式中的TestService的键值改成key2就行,然后再次运行项目,访问localhost:8080/test
实现自己的系统初始化器(第三种方式)
1:在SpringBoot项目中新建一个类
public class ThirdInitializer implements ApplicationContextInitailizer<ConfigurableApplicationContext>{
@Override
public void initialize(ConfigurableApplicationContext applicationContext) {
ConfigurableEnvironment environment = applicationContext.getEnvironment();
Map<String,Object> map = new HashMap<>();
//设置我们自己的属性
map.put("key3","value3");
MapPropertySource mapPropertySource = new MapPropertySource("thirdInitializer",map);
environment.getPropertySources().addLast(mapPropertySource);
logger.info("屬性配置完成,{}",map);
}
}
2:在application.properties的配置文件配置一行
context.initializer.classes=com.example.souce.initializer.ThirdInitializer
3:测试,将第一种方式中的TestService的键值改成key3就行,然后再次运行项目,访问localhost:8080/test