首页 > 解决方案 > 使用 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 名称?

标签: springyaml

解决方案


一种解决方案可能是在应用程序启动时将 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


推荐阅读