使用 yaml 配置注入 bean 列表



我得到了一些接口,例如"BeanInterface"和多个Spring Beans,它们实现了这个接口,例如BeanA,BeanB。在其他课程中,我得到了这个豆子的列表:List<BeanInterface>。我正在尝试做的是仅注入List<BeanInterface>yaml配置中指定的Beans。

为此,我在 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;
}
}

创建一个动态接口及其 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
{
}

application.yaml

app:
beans: FirstDynamic, SecondDynamic

下面是示例的示例输出:

注入豆大小:2

最新更新