SpringBoot系统初始化器

201 阅读1分钟

什么是系统初始化器

系统初始化器在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

下一篇记录下实现这三种方式的源码实现