在我的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;
这会是什么语法?
答案 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>
,其中key
(String
)代表bean名称:
private final Map<String, MyFilter> services;
public Foo(Map<String, MyFilter> services) {
this.services = services;
}
这是recommended
的替代选择:
@Autowired
private Map<String, MyFilter> services;