手写 RPC 框架项目教程 - 鱼友项目笔记 笔记
在教程中,我们只能读取 .properties 的配置文件,但是现在主流的都是yml/yaml配置文件,那我们能不能进行扩展来支持这两种配置文件的数据读取和封装呢,这当然是可以的。
首先我们依旧使用上面的那种方式来获取 yml/yaml 文件。我们可以配置一个优先级,当没有 properties 文件时再去读取 yml/ymal 文件。代码如下:
我们打印结果看看:
▼java复制代码rpc: host: 127.0.0.1 port: 8081 version: 1.0.0 rpv: port: 8082
由此可以看出来,使用Props来读取yaml文件根本无法体现出层级的那种关系,而且同样名称的属性下面的会覆盖上面的。所有我们不能这样做。
我们可以自己去获取到配置文件的 classpath,然后通过 FileReader 来对配置文件进行读取。最后通过 Hutool工具包的YamlUtil 来对配置文件进行解析,代码如下:
▼java复制代码/** * 加载配置对象(支持配置环境) */ private static <T> T loadConfig(Class<T> clazz, String prefix, String environment) { StringBuilder configFileBuilder = getConfigFileBuilder(Props.EXT_NAME,environment); Props props = new Props(configFileBuilder.toString()); // 若properties配置文件为空就读取yaml文件 if (props.isEmpty()){ // 通过classLoader来获取yaml文件的classpath configFileBuilder = getConfigFileBuilder(RpcConstant.RPC_YAML_SUFFIX,environment); ClassLoader classLoader = ClassLoaderUtil.getClassLoader(); URL resource = classLoader.getResource(configFileBuilder.toString()); assert resource != null; FileReader fileReader = null; try { // 构造一个FileReader fileReader = new FileReader(new File(resource.getFile())); } catch (FileNotFoundException e) { // 若不存在直接返回默认。 return props.toBean(clazz); } Dict yamlMap = YamlUtil.load(fileReader); return BeanUtil.copyProperties(yamlMap.get(RpcConstant.RPC_PREFIX),clazz); } return props.toBean(clazz,prefix); }
遇到的问题:
① 在我们使用类加载器的时候,类路径里面不能使用中文目录,否则会抛出找不到文件异常。
② 在我们使用 Hutool工具包的YamlUtil 时,系统会直接报错
没有找到对应的类?这是怎么回事,我们点进源码看一下:
报错了,没有这个类,但是他也写了,这是基于 Snakeyaml 的Yaml读写工具,所以我们只需要引入一个依赖就能解决
▼maven复制代码<dependency> <groupId>org.yaml</groupId> <artifactId>snakeyaml</artifactId> <version>1.33</version> </dependency>
引入后就能正常使用了。(鱼友们有更好的办法吗,可以告诉我一下,谢谢)
评论
问答助学
相关内容
0个评论
全部评论
点击登录,快来和大家讨论吧~
表情
图片
暂无评论

