当前位置: 首页 > news >正文

解读spring中@Value 如何将配置转自定义的bean

实现方式

着急寻求解决方式的猿友先看这块

定义配置转化类

public class UserConverter implements Converter<String, List<User>> {@Overridepublic List<User> convert(String config) {if (StringUtils.isEmpty(config)) {return Collections.emptyList();}return JsonUtil.fromJson(config, new TypeReference<List<User>>() {});}}

将转化类放入转化工厂


@Configuration
public class ConverterConfiguration {@Beanpublic ConversionServiceFactoryBean conversionService() {ConversionServiceFactoryBean factoryBean = new ConversionServiceFactoryBean();factoryBean.setConverters(Sets.newHashSet(new UserConverter()));return factoryBean;}
}

属性注入

@Service
public class UserService{@Value("${userConfig:[]}")
private List<User> users;
}

spring在bean生命周期的属性赋值中,会根据属性的类型,匹配相应的转化类,执行转化,进而赋值。

代码改进

不难看出,这些转化类仅执行转化逻辑,不存在线程安全问题,可以将其放入spring的IOC中,关闭对ConverterConfiguration的修改。代码简化如下:


@Configuration
public class ConverterConfiguration {// 收集自定义的配置解析工具类@Resourceprivate Set<Converter> converters;@Beanpublic ConversionServiceFactoryBean conversionService() {ConversionServiceFactoryBean factoryBean = new ConversionServiceFactoryBean();factoryBean.setConverters(converters);return factoryBean;}
}@Component
public class UserConverter implements Converter<String, List<User>> {@Overridepublic List<User> convert(String config) {if (StringUtils.isEmpty(config)) {return Collections.emptyList();}return JsonUtil.fromJson(config, new TypeReference<List<User>>() {});}}

按需拓展定义各式各样的Converter即可

下面谈下具体spring是怎么做的

熟悉springbean生命周期的猿友应该明白,红框中的方法栈都是bean生命周期的执行路径(这里不做阐述,感兴趣的猿友可以翻阅我往期博客,里面有做源码解读介绍),我们从生命周期的属性赋值开始剖析源码。

1.找寻需要依赖注入的属性元素列表

  2.属性元素依次转化

3.获取自定义的转化器

 4.匹配合适的解析器

 5.根据返回类型(保护泛型)匹配解析器

 6.执行解析逻辑,进行属性赋值

 

 

 

http://www.lryc.cn/news/118246.html

相关文章:

  • 前端开发实习总结参考范文(合集)
  • ♥ vue中$forceUpdate()
  • Java一般用于postgis空间数据库通用的增删查改sql命令
  • 【C++类和对象】类有哪些默认成员函数呢?(上)
  • (docker)mysql镜像拉取-创建容器-容器的使用【个人笔记】
  • 【时间格式引发的事故】
  • 【数据结构】栈及其实现
  • Linux命令200例:mount将文件系统挂载到指定目录下(常用)
  • 互联网摸鱼日报(2023-08-11)
  • 第十五章、【Linux】例行性工作调度
  • 基于Promise.resolve实现Koa请求队列中间件
  • 【结构型设计模式】C#设计模式之桥接模式
  • 【12】Git工具 协同工作平台使用教程 Gitee使用指南 腾讯工蜂使用指南【Gitee】【腾讯工蜂】【Git】
  • zookeeper增加IP白名单-安全设置
  • Mac 调试 ios safar
  • Linu网络服务NFS
  • 24届近5年同济大学自动化考研院校分析
  • 多源BFS
  • 自制电子农历
  • 解决nvm安装后,node生效但npm无效
  • Chrome DevTools 与 WebSocket 数据查看失焦的问题
  • Javascript 正则
  • C语言可变数组 嵌套的可变数组,翻过了山跨过了河 又掉进了坑
  • FFmpeg安装和使用
  • HTTP代理编程:Python实用技巧与代码实例
  • java调用第三方接口工具类 (HttpClientUtils.java)
  • f1tenth仿真设置
  • Technical debt (技术负债 / 技术债)
  • 【MATLAB第67期】# 源码分享 | 基于MATLAB的morris全局敏感性分析
  • ruby send call 的简单使用