Spring:获取某些接口和类型的所有Bean

时间:2016-10-27 13:37:22

标签: java spring spring-boot autowired

在我的Spring Boot应用程序中,假设我有Java接口:

public interface MyFilter<E extends SomeDataInterface> 

(一个很好的例子是Spring的公共接口ApplicationListener&lt; E extends ApplicationEvent&gt;

我有几个实现,如:

@Component
public class DesignatedFilter1 implements MyFilter<SpecificDataInterface>{...}

@Component
public class DesignatedFilter2 implements MyFilter<SpecificDataInterface>{...}

@Component
public class DesignatedFilter3 implements MyFilter<AnotherSpecificDataInterface>{...}

然后,在某些对象中,我有兴趣使用实现MyFilter的所有过滤器&lt; SpecificDataInterface&gt; 但不是 MyFilter&lt; AnotherSpecificDataInterface&gt;

这会是什么语法?

4 个答案:

答案 0 :(得分:57)

以下内容将每个具有将SpecificDataInterface作为泛型参数扩展的类型的MyFilter实例注入到List中。

@Autowired
private List<MyFilter<? extends SpecificDataInterface>> list;

答案 1 :(得分:9)

您只需使用

即可
@Autowired
private List<MyFilter<SpecificDataInterface>> filters;

答案 2 :(得分:1)

如果您想要一张地图,下面的代码将起作用。关键是您定义的方法

private Map<String, MyFilter> factory = new HashMap<>();

@Autowired
public ReportFactory(ListableBeanFactory beanFactory) {
  Collection<MyFilter> interfaces = beanFactory.getBeansOfType(MyFilter.class).values();
  interfaces.forEach(filter -> factory.put(filter.getId(), filter));
}

答案 3 :(得分:0)

如果要使用Map<String, MyFilter>,其中keyString)代表bean名称:

private final Map<String, MyFilter> services;

public Foo(Map<String, MyFilter> services) {
  this.services = services;
}

这是recommended的替代选择:

@Autowired
private Map<String, MyFilter> services;