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)
你可以简单地使用
@Autowired
private List<MyFilter<SpecificDataInterface>> filters;
Run Code Online (Sandbox Code Playgroud)
如果你想要一张地图,下面的代码将起作用。关键是你定义的方法
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)
如果您想要 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)
| 归档时间: |
|
| 查看次数: |
26810 次 |
| 最近记录: |