實(shí)現(xiàn)方式
著急尋求解決方式的猿友先看這塊
定義配置轉(zhuǎn)化類
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>>() {
});
}
}
將轉(zhuǎn)化類放入轉(zhuǎn)化工廠
@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生命周期的屬性賦值中,會(huì)根據(jù)屬性的類型,匹配相應(yīng)的轉(zhuǎn)化類,執(zhí)行轉(zhuǎn)化,進(jìn)而賦值。
代碼改進(jìn)
不難看出,這些轉(zhuǎn)化類僅執(zhí)行轉(zhuǎn)化邏輯,不存在線程安全問(wèn)題,可以將其放入spring的IOC中,關(guān)閉對(duì)ConverterConfiguration的修改。代碼簡(jiǎn)化如下:
@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生命周期的猿友應(yīng)該明白,紅框中的方法棧都是bean生命周期的執(zhí)行路徑(這里不做闡述,感興趣的猿友可以翻閱我往期博客,里面有做源碼解讀介紹),我們從生命周期的屬性賦值開始剖析源碼。
1.找尋需要依賴注入的屬性元素列表
??2.屬性元素依次轉(zhuǎn)化
3.獲取自定義的轉(zhuǎn)化器
?4.匹配合適的解析器
?5.根據(jù)返回類型(保護(hù)泛型)匹配解析器
?6.執(zhí)行解析邏輯,進(jìn)行屬性賦值
?文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-648301.html
?文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-648301.html
?
到了這里,關(guān)于解讀spring中@Value 如何將配置轉(zhuǎn)自定義的bean的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!