我有一个 @Service
包含 List
其他 @Service
班级。那个 List
基本上包含了 implements UniformEventsResearchApi
.
作为一个spring新手,我不确定如何让spring允许我遵循开闭原则,从而让列表自动注入所有具体实现。
这是一个不完整的uml类图:
这里有一些“代码”:
@Service
public class EventsResearchService {
// todo: this should be Injected automatically
private List<UniformEventsResearchApi> eventsResearchApis = Arrays.asList(new EventbriteApi());
// Already tried, but without success:
//
// @Autowired
// private List<UniformEventsResearchApi> eventsResearchApis2;
//
// @Autowired
// @Qualifier("EventsResearchApi")
// public void setXList(List<UniformEventsResearchApi> apis) {
// this.eventsResearchApis2 = apis;
// }
}
@Service
@Qualifier("EventsResearchApi")
public interface UniformEventsResearchApi { /* ... */ }
public abstract class EventsResearchApi implements UniformEventsResearchApi { /* ... */ }
/**Any class like this one which extends EventsResearchApi should be automatically injected in the List */
public class EventbriteApi extends EventsResearchApi { /* ... */ }
1条答案
按热度按时间wwodge7n1#
实际上,这对spring来说是一个简单的任务:
您可以像普通bean一样自动关联bean列表,在这种情况下,spring确实会找到实现接口并注入的所有bean:
注意,至少应该有一个可用的bean实现,否则spring不会允许这样的注入。如果你知道这种情况是可能的,你可以注射
Optional<List<SomeInterface>>
使用字段注入看起来相当难看,但您可以使用构造函数注入(无论如何,这更好)或考虑使用“java配置”: