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

How to get all self injected Beans of a special type?

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

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

我是这样画的:

@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 中正确完成吗?也许我的问题有比我的方法更好的解决方案?

您可以毫不费力地在 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
}