【问题标题】:Inject list of beans using yaml configuration使用 yaml 配置注入 bean 列表
【发布时间】:2019-09-09 07:46:34
【问题描述】:

我有一些接口,例如“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 只是 String 值,如何指定 bean 名称?

【问题讨论】:

  • 你为什么要通过yaml配置动态注入一些bean?难道你只需要将所有bean注入实现BeanInterface的List
  • 我想配置哪些bean应该被注入列表。
  • 好的,但是应该从外部配置动态配置吗?
  • 不,不应该。只有在应用程序启动时,spring 才应该从 yaml 文件中获取配置,哪些 bean 应该注入到列表中。

标签: spring yaml


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2013-05-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-28
    • 1970-01-01
    • 2010-09-23
    相关资源
    最近更新 更多