盘点Spring/Boot的那些常用扩展点( 四 )


}
对于的实现 , 两个实现
:可以解析或者xml结尾的配置文件
ader:解析以yml或者yaml结尾的配置文件
所以可以看出 , 要想实现json格式的支持 , 只需要自己实现可以用来解析json格式的配置文件的就可以了 。
动手来一个 。
实现可以读取json格式的配置文件
实现这个功能 , 只需要两步就可以了 。
第一步:自定义一个
ader , 实现接口
class ader{
@Overridepublic String[] getFileExtensions() {//这个方法表明这个类支持解析以json结尾的配置文件return new String[]{"json"};}@Overridepublic List> load(String name, Resource resource) throws IOException {ReadableByteChannel readableByteChannel = resource.readableChannel();ByteBuffer byteBuffer = ByteBuffer.allocate((int) resource.contentLength());//将文件内容读到 ByteBuffer 中readableByteChannel.read(byteBuffer);//将读出来的字节转换成字符串String content = new String(byteBuffer.array());// 将字符串转换成 JSONObjectJSONObject jsonObject = JSON.parseObject(content);Map map = new HashMap<>(jsonObject.size());//将 json 的键值对读出来 , 放入到 map 中for (String key : jsonObject.keySet()) {map.put(key, jsonObject.getString(key));}return Collections.singletonList(new MapPropertySource("jsonPropertySource", map));}
}
第二步:配置
ader 已经有了 , 那么怎么用呢?当然是SPI机制了 , 对于配置文件的处理 , 就是依靠SPI机制 , 这也是能扩展的重要原因 。
SPI机制加载实现
.文件配置
会先通过SPI机制加载所有 , 然后遍历每个 , 判断当前遍历的 , 通过获取到当前能够支持哪些配置文件格式的解析 , 让后跟当前需要解析的文件格式进行匹配 , 如果能匹配上 , 那么就会使用当前遍历的来解析配置文件 。
其实就属于策略接口 , 配置文件的解析就是策略模式的运用 。
所以 , 只需要按照这种格式 , 在.文件中配置一下就行了 。
org..boot.env.=
com......ader
到此 , 其实就扩展完了 , 接下来就来测试一下 。
测试
先创建一个.json的配置文件
.json配置文件
改造User
class User {
// 注入配置文件的属性
@Value(“${.:}”)
;
}
启动项目
@n
class{
public static void main(String[] args) {ConfigurableApplicationContext applicationContext = SpringApplication.run(Application.class);User user = applicationContext.getBean(User.class);System.out.println("获取到的Bean为" + user + " , 属性username值为:" + user.getUsername());}@Beanpublic User user() {return new User();}
}
运行结果:
获取到的Bean为com....User@ , 属性值为:三友的java日记
成功将json配置文件的属性注入到User对象中 。
至此 , 就支持了以json为结尾的配置文件格式 。
Nacos对于的实现
如果你的项目正在用Nacos作为配置中心 , 那么刚刚好 , Nacos已经实现json配置文件格式的解析 。
Nacos对于的实现
Nacos不仅实现了json格式的解析 , 也实现了关于xml格式的配置文件的解析 , 并且优先级会比默认的xml格式文件解析的优先级高 。至于Nacos为啥需要实现?其实很简单 , 因为Nacos作为配置中心 , 不仅支持和yaml格式的文件 , 还支持json格式的配置文件 , 那么客户端拿到这些配置就需要解析 , 已经支持了和yaml格式的文件的解析 , 那么Nacos只需要实现不支持的就可以了 。