前言

我们在使用SpringBoot开发系统时,一般是将配置信息存储在yml配置文件中。但当我们设计的系统中,如果有一些配置信息是需要管理员后台中灵活配置的,那我们该怎么去实现呢?
如果我们每次使用到这些配置信息的时候,都去查询数据库,那么无疑是对资源的一种浪费,那么有没有一种方法,在应用启动时,查询数据库获得配置信息,将配置信息设置成一个全局变量,然后在使用时再去获取这个变量呢?答案是可以的。
在这里,我们只需要掌握两个知识点:

  • @PostConstruct注解
  • setProperty方法

@PostConstruct注解

从Java EE5规范开始,ServLet新增了一个@PostConstruct生命周期注解,这个注解用来修饰一个非静态方法。被@PostConstruct修饰的方法会在服务器加载Servlet时执行,且只会执行一次。
image.png
在Spring中,@PostConstruct的执行顺序在@Autowired自动注入之后。

setProperty方法

System.setProperty方法,可以设置一个系统中的全局变量,在项目的任意地方都能够通过System.getProperty方法去获取这个变量。

技术实现及效果

在SpringBoot中,我们先创建一个@Service所修饰的类,使其能被SpringBootApplication扫描到。并在类中定义一个被@PostConstruct修饰的非静态方法,使其在@Autowired自动执行。在读取完数据库配置信息之后,我们再通过System.setProperty方法来对读取的配置信息进行赋值。

/**
 * 在Spring应用启动是执行,获取系统配置信息
 * @author 刘欣的代码笔记
 * @since 2020-07-31
 */
@Service("CommGetConfigSetting")
public class GetConfig {
    @Autowired
    SettingService settingService;

    @PostConstruct
    public void initWebConfig(){
        System.out.println("读取配置信息");
        List<Setting> settingList = settingService.list();
        settingList.forEach(setting ->
                System.setProperty(setting.getName(),setting.getValue())
        );
        System.out.println("配置信息读取完毕");
    }
}

这样,我们在数据库中读取的配置就已经全部注册成全局变量了,我们在需要用到这些配置的时候,使用System.getProperty进行取值。


我们可以看到,在项目启动时,GetConfig方法自动执行了,并读取了数据库的信息:
image.png
我们再访问相应的控制器:
image.png
image.png
我们可以看到,我们成功的获取到了应用启动时读取的数据库配置信息。