Springboot之从数据库读取配置信息进⾏注⼊
背景:公司的项⽬很⼤,往往⼀个项⽬⽗项⽬下⾯有很多⼦项⽬,每个项⽬都要在application.properties配置⽂件中写很多的配置,后来发现有很多配置信息都是固定的,每个项⽬都需要取维护就会很⿇烦,所以准备采取在数据库中进⾏配置,统⼀管理,有点类似于nacos、的服务中的配置⽂件管理功能,如果⽤这些插件就需要引⼊⼀套新的项⽬,会⽐较⿇烦,很多功能也⽤不上,所以就⾃⼰写⼀个。
思路:其实想⼀下整体的思路就是在项⽬完全启动之前,查询数据库,将参数查询到然后赋值到内存中即可。
@Configuration
@Component
public class ConfigBeforeInit {
@Autowired
private ConfigurableEnvironment environment;
@Autowired
private SystemConfigService service;
@PostConstruct
public void initSystemConfig() {
// 获取系统属性集合
MutablePropertySources propertySources = PropertySources();
// 从数据库获取⾃定义变量列表
Map<String, String> collect = AllBySystemType().stream().Map(SysConfig::getCode, SysConfig::getValue));
// 将转换后的列表加⼊属性中
spring怎么读取propertiesProperties properties = new Properties();
properties.putAll(collect);
// 将属性转换为属性集合,并指定名称
PropertiesPropertySource constants = new PropertiesPropertySource("system-config", properties);
// 定义寻属性的正则,该正则为系统默认属性集合的前缀
Pattern p = compile("^applicationConfig.*");
// 接收系统默认属性集合的名称
String name = null;
// 标识是否到系统默认属性集合
boolean flag = false;
// 遍历属性集合
for (PropertySource<?> source : propertySources) {
// 正则匹配匹配到:OriginTrackedMapPropertySource {name='applicationConfig: [classpath:/application.properties]'}
if (p.Name()).matches()) {
// 接收名称
name = Name();
// 变更标识
flag = true;
break;
}
}
if (flag) {
// 到则将⾃定义属性添加到该属性之后,意思就是以application.properties⽂件配置为准如果想要以数据库配置为准,就修改为 propertySources.addBefore(name, constants)            propertySources.addAfter(name, constants);
} else {
// 没到默认添加到最后
propertySources.addFirst(constants);
}
}
}
@Data
@Table(name = "sys_config")
@Entity
public class SysConfig implements Serializable {
/**
* 主键
*/
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
/**
* 参数名
*/
@Column
private String code;
/**
* 参数值
*/
@Column
private String value;
/**
* 配置名称
*/
@Column
private String name;
/**
* 配置描述
*/
@Column
private String description;
/**
* 系统类型
*/
@Column
private String systemType;
}
@Repository
@Component
public interface SystemConfigRepository extends JpaRepository<SysConfig, Long> {
List<SysConfig> findAllBySystemTypeIn(List systemType);
}
@Service
@Component
@Slf4j
public class SystemConfigService {
@Value("#{'${pes}'.split(',')}")
private List<String> types;
@Autowired
private SystemConfigRepository systemConfigRepository;
public List<SysConfig> getAllBySystemType() {
List<SysConfig> configs = systemConfigRepository.findAllBySystemTypeIn(types);        log.info("加载数据库系统{},配置⽂件: {} ", types, configs);
return configs;
}
}

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。