实现方式
着急寻求解决方式的猿友先看这块
定义配置转化类
public class UserConverter implements Converter<String, List<User>> {
@Override
public List<User> convert(String config) {
if (StringUtils.isEmpty(config)) {
return Collections.emptyList();
}
return JsonUtil.fromJson(config, new TypeReference<List<User>>() {
});
}
}
将转化类放入转化工厂
@Configuration
public class ConverterConfiguration {
@Bean
public 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 {
// 收集自定义的配置解析工具类
@Resource
private Set<Converter> converters;
@Bean
public ConversionServiceFactoryBean conversionService() {
ConversionServiceFactoryBean factoryBean = new ConversionServiceFactoryBean();
factoryBean.setConverters(converters);
return factoryBean;
}
}
@Component
public class UserConverter implements Converter<String, List<User>> {
@Override
public 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.执行解析逻辑,进行属性赋值