如何获得所有特殊类型的自注入 Bean?
How to get all self injected Beans of a special type?
我想构建一个 Spring 应用程序,无需太多配置即可轻松添加新组件。例如:您有不同种类的文件。这些文档应该能够导出为不同的文件格式。
为了使此功能易于维护,它应该(基本上)按以下方式工作:
- 有人编写了文件格式导出程序
- 他/她编写了一个组件,用于检查文件格式导出器是否已获得许可(基于 Spring 条件)。如果出口商获得许可,则会在应用程序上下文中注入专门的 Bean。
- "whole rest" 基于注入的 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 中正确完成吗?也许我的问题有比我的方法更好的解决方案?
您可以毫不费力地在 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
}
我想构建一个 Spring 应用程序,无需太多配置即可轻松添加新组件。例如:您有不同种类的文件。这些文档应该能够导出为不同的文件格式。
为了使此功能易于维护,它应该(基本上)按以下方式工作:
- 有人编写了文件格式导出程序
- 他/她编写了一个组件,用于检查文件格式导出器是否已获得许可(基于 Spring 条件)。如果出口商获得许可,则会在应用程序上下文中注入专门的 Bean。
- "whole rest" 基于注入的 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 中正确完成吗?也许我的问题有比我的方法更好的解决方案?
您可以毫不费力地在 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
}