本文共 2995 字,大约阅读时间需要 9 分钟。
Spring Boot 通过@Value注解可实现获取配置文件中的数据,而配置文件中的数据可以通过修改MutablePropertySources从数据库注入
该示例基于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; ...}
@Servicepublic class SystemConfigService extends SimpleHibernateService{ ...}
.properties
文件存在@Configurationpublic class SystemConfig { @Autowired private ConfigurableEnvironment environment; @Autowired private SystemConfigService service; @PostConstruct public void initDatabasePropertySourceUsage() { // 获取系统属性集合 MutablePropertySources propertySources = environment.getPropertySources(); try { // 从数据库获取自定义变量列表 Mapcollect = 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); } }}
@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; }}