博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
SpringBoot从数据库加载配置信息
阅读量:6235 次
发布时间:2019-06-22

本文共 2995 字,大约阅读时间需要 9 分钟。

版权声明:本文首发 http://asing1elife.com ,转载请注明出处。 https://blog.csdn.net/asing1elife/article/details/82811803

Spring Boot 通过@Value注解可实现获取配置文件中的数据,而配置文件中的数据可以通过修改MutablePropertySources从数据库注入

该示例基于Hibernate实现

更多精彩

  • 更多技术博客,请移步

实体类

  1. 根据Hibernate的配置,实体类对应数据库中的表即可
@Entity@Table(name = "sys_config")@Inheritance(strategy = InheritanceType.SINGLE_TABLE)public class Config implements Serializable {
@Id private Long id; @Column private String code; @Column private String value; @Column private String name; @Column private String description; ...}

服务类

  1. 服务类用于从数据库中获取列表信息
@Servicepublic class SystemConfigService extends SimpleHibernateService
{
...}

配置类

  1. 该配置类会在系统启动时自动加载
  2. 根据内部逻辑会将从数据库取出的列表信息注入到MutablePropertySources属性集合中
  3. 动态注入的属性集合无需有对应的 .properties 文件存在
@Configurationpublic class SystemConfig {
@Autowired private ConfigurableEnvironment environment; @Autowired private SystemConfigService service; @PostConstruct public void initDatabasePropertySourceUsage() {
// 获取系统属性集合 MutablePropertySources propertySources = environment.getPropertySources(); try {
// 从数据库获取自定义变量列表 Map
collect = service.getAll().stream().collect(Collectors.toMap(Config::getCode, Config::getValue)); // 将转换后的列表加入属性中 Properties properties = new Properties(); properties.putAll(collect); // 将属性转换为属性集合,并指定名称 PropertiesPropertySource constants = new PropertiesPropertySource("system-config", properties); // 定义寻找属性的正则,该正则为系统默认属性集合的前缀 Pattern p = Pattern.compile("^applicationConfig.*"); // 接收系统默认属性集合的名称 String name = null; // 标识是否找到系统默认属性集合 boolean flag = false; // 遍历属性集合 for (PropertySource
source : propertySources) {
// 正则匹配 if (p.matcher(source.getName()).matches()) {
// 接收名称 name = source.getName(); // 变更标识 flag = true; break; } } if (flag) {
// 找到则将自定义属性添加到该属性之前 propertySources.addBefore(name, constants); } else {
// 没找到默认添加到第一位 propertySources.addFirst(constants); } } catch (Exception e) {
throw new RuntimeException(e); } }}

工具类

  1. 由于Spring Boot不支持静态变量的自动注入,所以需要使用一个非静态的setter方法将通过**@Value**注解获取到的属性信息赋值给对应静态变量
  2. @DependsOn({"systemConfig"}) 的意思是说 Constants 依赖于 SystemConfig ,所以需要确保 SystemConfig 在 Constants 之前加载
@Configuration@DependsOn({
"systemConfig"})public class Constants {
// 资源服务器地址 public static String RESOURCE_SERVER_URL; @Value("${resource.server.url}") public void setResourceServerUrl(String resourceServerUrl) {
RESOURCE_SERVER_URL = resourceServerUrl; }}
你可能感兴趣的文章
jinja2模版生成页面时会产生大量空行和空格,如何移除?
查看>>
sublime的代码格式化快捷键
查看>>
Mybatis - Sql标签详解
查看>>
Xftp 如何显示隐藏文件?
查看>>
回归的线性模型---线性基函数模型
查看>>
强上阿里云之安装memcached
查看>>
(已解决)struts2 date 标签 问题 ,貌似是个BUG 大家鉴定下
查看>>
java枚举分析
查看>>
JAVA线程异常终止
查看>>
dede 伪静态
查看>>
linux里source、sh、bash、./有什么区别
查看>>
windows安装MongoDB
查看>>
Silverlight4 Framework 之困局
查看>>
最小二乘法之一元线性拟合
查看>>
wordpress如何添加调用侧边栏小工具功能
查看>>
ffmpeg 屏幕录像
查看>>
mapreduce如何调用第三方jar包
查看>>
Java编码风格
查看>>
Spring MVC防御CSRF、XSS和SQL注入攻击
查看>>
gcc命令使用记录
查看>>