日拱一卒:属性配置
2023-09-07 本文已影响0人
Tinyspot
1. 配置类
@Component
public class UserConfig {
private final List<String> shopList = new CopyOnWriteArrayList<>();
public List<String> getShopList() {
return shopList;
}
}
配置加载器
@Component
@Slf4j
public class UserConfigManager implements InitializingBean {
public static final String GROUP_ID = "concrete_config";
@Resource
private UserConfig userConfig;
@Override
public void afterPropertiesSet() throws Exception {
PropertyDescriptor[] descriptors = Introspector.getBeanInfo(UserConfig.class).getPropertyDescriptors();
if (descriptors == null || descriptors.length <= 0) {
return;
}
for (PropertyDescriptor descriptor : descriptors) {
this.init(descriptor);
}
}
private void init(PropertyDescriptor descriptor) throws IOException {
final List<String> userList = this.getUserList(descriptor);
if (userList == null) {
return;
}
String dataId = this.getDataId(descriptor);
this.parseConfigInfo(userList, ConcreteConfig.getConfig(dataId, GROUP_ID, 10 * 1000));
ConcreteConfig.addListener(dataId, GROUP_ID, new ManagerListener() {
@Override
public void receiveConfigInfo(String configInfo) {
parseConfigInfo(userList, configInfo);
log.info("parseConfigInfo: " + userList);
}
@Override
public Executor getExecutor() {
return null;
}
});
}
private List<String> getUserList(PropertyDescriptor descriptor) {
if (List.class.isAssignableFrom(descriptor.getPropertyType())) {
try {
return (List<String>) descriptor.getReadMethod().invoke(this.userConfig);
} catch (Throwable e) {
return null;
}
}
return null;
}
private String getDataId(PropertyDescriptor descriptor) {
return "com.concrete.config.UserConfig." + descriptor.getName();
}
private void parseConfigInfo(List<String> userList, String configInfo) {
if (StringUtils.isBlank(configInfo)) {
return;
}
try {
userList.clear();
List<String> list = Splitter.on("\n").trimResults().omitEmptyStrings().splitToList(configInfo);
userList.addAll(list);
} catch (Exception e) {
System.out.println("配置解析错误...");
}
}
}
2. 配置监听器
public class ConcreteConfig {
static public void addListener(String dataId, String group, ManagerListener listener) {
addListeners(dataId, group, Arrays.asList(listener));
}
static public void addListeners(String dataId, String group, List<? extends ManagerListener> listeners) {
for (ManagerListener listener : listeners) {
// 暂时直接获取值
String content = ConcreteConfig.getConfig(dataId, group, 10 * 1000);
listener.receiveConfigInfo(content);
}
}
static public String getConfig(String dataId, String group, long timeout) {
// 模拟下数据
return "111 \n 222 \n 333";
}
}
public interface ManagerListener {
Executor getExecutor();
void receiveConfigInfo(final String configInfo);
}
3. 获取属性值
@RestController
public class UserConfigController {
@Resource
private UserConfig userConfig;
@RequestMapping("/user/config")
public String userConfig() {
return JSON.toJSONString(userConfig.getShopList());
}
}