spring:注入实现接口的所有具体类的列表

h7appiyu  于 2021-07-26  发布在  Java
关注(0)|答案(1)|浏览(423)

我有一个 @Service 包含 List 其他 @Service 班级。那个 List 基本上包含了 implements UniformEventsResearchApi .
作为一个spring新手,我不确定如何让spring允许我遵循开闭原则,从而让列表自动注入所有具体实现。
这是一个不完整的uml类图:

这里有一些“代码”:

  1. @Service
  2. public class EventsResearchService {
  3. // todo: this should be Injected automatically
  4. private List<UniformEventsResearchApi> eventsResearchApis = Arrays.asList(new EventbriteApi());
  5. // Already tried, but without success:
  6. //
  7. // @Autowired
  8. // private List<UniformEventsResearchApi> eventsResearchApis2;
  9. //
  10. // @Autowired
  11. // @Qualifier("EventsResearchApi")
  12. // public void setXList(List<UniformEventsResearchApi> apis) {
  13. // this.eventsResearchApis2 = apis;
  14. // }
  15. }
  16. @Service
  17. @Qualifier("EventsResearchApi")
  18. public interface UniformEventsResearchApi { /* ... */ }
  19. public abstract class EventsResearchApi implements UniformEventsResearchApi { /* ... */ }
  20. /**Any class like this one which extends EventsResearchApi should be automatically injected in the List */
  21. public class EventbriteApi extends EventsResearchApi { /* ... */ }
wwodge7n

wwodge7n1#

实际上,这对spring来说是一个简单的任务:
您可以像普通bean一样自动关联bean列表,在这种情况下,spring确实会找到实现接口并注入的所有bean:

  1. public interface SomeInterface {
  2. }
  3. @Component
  4. public class SomeImpl1 implements SomeInterface {}
  5. @Component
  6. public class SomeImpl2 implements SomeInterface {}
  7. @Service
  8. public сlass SampleBean {
  9. @Autowired
  10. private List<SomeInterface> beans;
  11. }

注意,至少应该有一个可用的bean实现,否则spring不会允许这样的注入。如果你知道这种情况是可能的,你可以注射 Optional<List<SomeInterface>> 使用字段注入看起来相当难看,但您可以使用构造函数注入(无论如何,这更好)或考虑使用“java配置”:

  1. @Service
  2. public class SampleBean {
  3. private final List<SomeInterface> beans;
  4. // I haven’t checked this with compiler, should work
  5. @Autowired // optional, if you have a single constructor, you can omit it
  6. public SampleBean(Optional<List<SomeInterface>> beans) {
  7. this.beans = beans.orElse(Collections.emptyList());
  8. }
  9. }
展开查看全部

相关问题