# smart-config
**Repository Path**: yangfeng20/smart-config
## Basic Information
- **Project Name**: smart-config
- **Description**: Smart-Config 智能配置:单体应用下的动态配置;单机版Apollo
- **Primary Language**: Java
- **License**: Apache-2.0
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 9
- **Forks**: 0
- **Created**: 2024-03-31
- **Last Updated**: 2025-07-01
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# Smart-Config
智能配置:单体应用下的配置中心,支持动态配置,在单体应用下拥有微服务配置中心般的体验。
主要用来解决在单体应用没有配置中心时,想要动态变更配置。可以理解为单机版的Apollo。
### 优势
- 权限校验
- 动态变更配置
- webUi修改配置
- 支持非SpringBoot应用
- 无缝衔接`SpringBoot`应用
- 支持结构化数据(json,集合,对象)
- 轻量级无冗余第三方库
- 内嵌轻量级jetty服务器
- webUi支持中英文切换
- 支持springboot多配置文件
- 支持`spring.config.location`以及`spring.profiles.active`
- 支持启动参数修改webUi端口以及配置描述推断
- webUi支持默认值回显
- 配置持久化,像使用微服务配置中心一样
- 内置多种冲突策略,且可自定义冲突策略
- 预留多种spi扩展接口(配置加载,配置变更,冲突合并...)
### 效果展示


### 使用
#### 依赖引入
```xml
io.github.yangfeng20
smart-config-core
1.0.4
```
- springboot3需要做单独的代码兼容,所以版本独立发布。
- 如果使用的是springboot3,请在正常版本后添加[-springboot3]
- 例如:
```xml
io.github.yangfeng20
smart-config-core
1.0.4-springboot3
```
- 同时由于springboot3中web-starter也引入了jetty依赖
- 会发生依赖冲突,最终类找不到
- 需要引入依赖管理,并指定jetty版本,强制使用jetty 11.0.20版本
```xml
org.eclipse.jetty
jetty-bom
11.0.20
pom
import
```
1. Spring-Boot使用
主类添加注解`@EnableSmartConfig`
```java
@EnableSmartConfig
public class XxxApplication {
ApplicationContext application = SpringApplication.run(XxxApplication.class, args);
}
```
使用@Value注解
```java
public class AppConfig{
@Value("${configKey}")
private String value;
@JsonValue("${list:[1]}")
private List list;
@JsonValue("${config.entity:{}}")
private XxxEntity entity;
}
```
2. 非spring项目使用
创建LocalFileConfig对象,参数分别为webUi的端口,是否推断配置描述。
```java
public class App{
public static void main(String[]args){
SmartConfig smartConfig = new LocalFileConfig(6767, true);
List list = new ArrayList<>();
list.add("com.maple.smart.config.test");
AbsConfigBootstrap bootstrap = new LocalConfigBootstrap(true, 6767,"classpath:application.properties", list);
bootstrap.init();
}
}
```
静态类的静态字段使用@SmartValue注解
```java
public class AppConfig{
@SmartValue("配置key:默认值")
private static String config1;
@SmartValue("biz.name:abc")
private static String bizName;
@JsonValue("${list:[1]}")
private static List list;
@JsonValue("${config.entity:{}}")
private static XxxEntity entity;
}
```
### 注意
- Web-Ui默认端口:6767
- SpringBoot应用配置类被代理后请勿直接访问属性,而是通过getter访问
- 非Spring应用仅支持静态变量。
- 默认值回显开启时,如果key有两个默认值,即在代码中使用直接使用注解引用key,并且在配置文件中不存在。
```java
@JsonValue("${list:[]}")
public List list1;
@JsonValue("${list:[1,2,3]}")
public List list2;
```
- webui中显示的值为最后一次赋值的默认值,这个顺序为容器决定
- 多个默认值不建议使用默认值回显功能,可能导致webui展示与代码中默认值不一致
- `@Value`暂不支持默认值回显,请使用`@JsonValue`或者`@SmartValue`
### 后续计划
- [x] web配置中心展示默认值配置
- [x] 定时在操作系统临时目录保存一份最新配置;加载时合并
- spel支持
- 环境变量以及jvm参数数据源支持
- [x] 导出配置(最好格式不变)
- yaml格式文件支持
- 配置增加数据来源字段(配置文件,系统临时文件,代码默认值...)
### 测试运行
- 如果要直接跑当前项目的源代码,请先切换到对应分支。springboot3切换到springboot3分支。其他切换到master分支。
- 并在不同的分支选择不同的jdk版本。springboot3选择jdk17以上即可