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

Ask*_*mov 37 java spring autowired spring-boot

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

public interface MyFilter<E extends SomeDataInterface> 
Run Code Online (Sandbox Code Playgroud)

(一个很好的例子是Spring的公共接口ApplicationListener <E extends ApplicationEvent>)

我有几个实现,如:

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

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

@Component
public class DesignatedFilter3 implements MyFilter<AnotherSpecificDataInterface>{...}
Run Code Online (Sandbox Code Playgroud)

然后,在某些对象中,我有兴趣利用所有实现MyFilter <SpecificDataInterface> 但不是 MyFilter <AnotherSpecificDataInterface>的过滤器

这会是什么语法?

mh-*_*dev 66

下面将注入具有将SpecificDataInterface作为泛型参数扩展到List的类型的每个MyFilter实例.

@Autowired
private List<MyFilter<? extends SpecificDataInterface>> list;
Run Code Online (Sandbox Code Playgroud)

  • 我认为您不是要输入“ = new ArrayList &lt;&gt;();” 最后:) (2认同)
  • 你的正确,我删除了它:)。额外信息:它仍然可以使用它。 (2认同)

Iss*_*TIF 9

你可以简单地使用

@Autowired
private List<MyFilter<SpecificDataInterface>> filters;
Run Code Online (Sandbox Code Playgroud)


Qua*_*yen 6

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

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));
}
Run Code Online (Sandbox Code Playgroud)


mag*_*ter 5

如果您想要 a Map<String, MyFilter>,其中key( String) 代表 bean 名称:

private final Map<String, MyFilter> services;

public Foo(Map<String, MyFilter> services) {
  this.services = services;
}
Run Code Online (Sandbox Code Playgroud)

这是recommended替代方案:

@Autowired
private Map<String, MyFilter> services;
Run Code Online (Sandbox Code Playgroud)