私のSpring Bootアプリケーションで、Javaのインターフェースがあるとします:
public interface MyFilter<E extends SomeDataInterface>
(良い例は、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>{...}
次に、いくつかのオブジェクトで利用することに興味がありますすべてのフィルター MyFilter <SpecificDataInterface>を実装しますただしNOT MyFilter <AnotherSpecificDataInterface>
これの構文は何ですか?
次の例は、SpecificDataInterfaceを汎用引数としてリストに拡張する型を持つすべてのMyFilterインスタンスを挿入します。
@Autowired
private List<MyFilter<? extends SpecificDataInterface>> list;
単純に使用できます
@Autowired
private List<MyFilter<SpecificDataInterface>> filters;
マップが必要な場合は、以下のコードが機能します。キーは定義されたメソッドです
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));
}