前言
我们在使用SpringBoot开发系统时,一般是将配置信息存储在yml配置文件中。但当我们设计的系统中,如果有一些配置信息是需要管理员后台中灵活配置的,那我们该怎么去实现呢?
如果我们每次使用到这些配置信息的时候,都去查询数据库,那么无疑是对资源的一种浪费,那么有没有一种方法,在应用启动时,查询数据库获得配置信息,将配置信息设置成一个全局变量,然后在使用时再去获取这个变量呢?答案是可以的。
在这里,我们只需要掌握两个知识点:
@PostConstruct
注解setProperty
方法
@PostConstruct
注解
从Java EE5规范开始,ServLet新增了一个@PostConstruct
生命周期注解,这个注解用来修饰一个非静态方法。被@PostConstruct
修饰的方法会在服务器加载Servlet时执行,且只会执行一次。
在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方法自动执行了,并读取了数据库的信息:
我们再访问相应的控制器:
我们可以看到,我们成功的获取到了应用启动时读取的数据库配置信息。