spring - 使用 yaml 配置注入 bean 列表
问题描述
我得到了一些接口,例如“BeanInterface”和多个实现此接口的 Spring Bean,例如 BeanA、BeanB。在其他课程中,我得到了这个 bean 的列表:List<BeanInterface>
。我想要做的是List<BeanInterface>
只注入在 yaml 配置中指定的 Bean。
为此,我在 yaml 中指定了要注入的 bean 名称列表。
app:
beans:
- BeanA
- BeanB
结果是——
Property: app.beans[0]
Value:
Origin: class path resource [application-local.yaml]:86:6
Reason: No converter found capable of converting from type [java.lang.String] to type [com.myprojects.BeanInterface]
属性 BeanA、BeanB 只是字符串值,那么如何指定 bean 名称?
解决方案
一种解决方案可能是在应用程序启动时将 bean 注入列表,然后检索该 bean 以供以后使用。向我展示一个使用 BeanFactory 获取 bean 并将它们添加到列表的示例:
通过 application.yaml 中的给定名称将 bean 注入列表的配置类:
@Configuration
public class DynamicBeanInjection
{
@Value( "${app.beans}" )
private String[] beans;
@Autowired
private BeanFactory beanFactory;
@Bean
List<DynamicInterface> getDynamicBeans( )
{
final List<DynamicInterface> dynamicInterfaces = new ArrayList<>( );
for ( String bean : beans )
{
dynamicInterfaces.add( beanFactory.getBean( bean, DynamicInterface.class ) );
}
return dynamicInterfaces;
}
}
创建一个 DynamicInterface 及其 3 个实现:
public interface DynamicInterface
{
}
@Component("FirstDynamic")
public class FirstDynamic implements DynamicInterface
{
}
@Component("SecondDynamic")
public class SecondDynamic implements DynamicInterface
{
}
@Component("ThirdDynamic")
public class ThirdDynamic implements DynamicInterface
{
}
应用程序.yaml
app:
beans: FirstDynamic, SecondDynamic
这是示例输出的示例:
注入豆大小:2
推荐阅读
- react-native - 反应原生手势处理程序 - 多次调整拖动时元素跳跃
- javascript - 存储更新 mobx 时组件不会重新渲染
- spring - 如何使用spring batch excel从excel文件中读取数值
- arrays - 从 indexSet 中获取选定的行
- linux - 知道如何在 linux 和 shell 脚本中使用带条件的超时命令
- r - 使用第三个值的频率作为值创建 2 个变量矩阵
- nuxtjs - nuxtjs + vue-native-websocket 怎么用?
- python - 绘制叶绿素形状未显示
- javascript - Vue.js 在父子组件之间动态映射数据
- javascript - Ag-Grid:“从剪贴板粘贴”在 Firefox 中不起作用