文章内容上次编辑时间于 1 year ago。文章内容已经很陈旧了,也许不再适用!
文章共 465 字,阅读完预计需要 47 秒。文章篇幅适中,可以放心阅读。

前言

我们在使用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
我们可以看到,我们成功的获取到了应用启动时读取的数据库配置信息。

My favorite thing is to leave this blank :)