如何获得所有自我注入的特殊类型的豆?

时间:2015-06-08 12:35:25

标签: spring spring-boot spring-bean

我想构建一个Spring应用程序,可以轻松添加新组件,而无需太多配置。例如:您有不同类型的文档。这些文档应该能够导出为不同的文件格式。

为了使这个功能易于维护,它应该(基本上)以下列方式工作:

  • 有人对文件格式导出程序进行编程
  • 他/她编写了一个组件,用于检查文件格式导出器是否已获得许可(基于Spring条件)。如果导出器获得许可,则会在应用程序上下文中注入专用Bean。
  • “整个休息”基于注入的bean动态工作。无需触摸任何内容即可在GUI等上显示它​​。

我用以下方式描绘了它:

@Component
public class ExcelExporter implements Condition {

    @PostConstruct
    public void init() {
        excelExporter();
    }

    @Bean
    public Exporter excelExporter(){
        Exporter exporter= new ExcelExporter();
        return exporter; 
    }

    @Override
    public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
        return true;
    }
}

为了与这些出口商合作(展示它们等),我需要得到所有这些出口商。我试过这个:

    Map<String, Exporter> exporter =BeanFactoryUtils.beansOfTypeIncludingAncestors(appContext, Exporter.class, true, true);

不幸的是,这不起作用(返回0个bean)。我对此很新,有人会介意我在Spring中如何正确完成这项工作吗?也许我的方法比我的方法有更好的解决方案吗?

1 个答案:

答案 0 :(得分:4)

您可以毫不费力地在Map中获取给定类型bean的所有实例,因为它是内置的Spring功能。

只需自动装配您的地图,所有这些bean都会被注入,并使用bean的ID作为关键字。

@Autowired
Map<String,Exporter> exportersMap;

如果您需要更复杂的内容,例如特定的Map实现或自定义键。考虑定义自定义ExporterMap,如下所示

@Component
class ExporterMap implements Map{
    @Autowired
    private Set<Exporter> availableExporters;
    //your stuff here, including init if required with @PostConstruct
}