日拱一卒:属性配置

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());
    }
}
上一篇 下一篇

猜你喜欢

热点阅读