【发布时间】:2017-01-03 12:54:24
【问题描述】:
我正在尝试使用 Spring 应用 Strategy 模式(我认为我弄错了),如下所示
我的主课看起来像
@Component
public class DirectoryUserImportWorkflow {
private List<DirectoryUserDataSource> dataSources = Arrays.asList(new ActiveDirectoryDataSource(), new CsvDataSource());
@Autowired
private DirectoryUsersFetcher directoryUsersFetcher;
public void run() {
dataSources.forEach(dataSource -> directoryUsersFetcher.importUsers(dataSource));
}
}
其中DirectoryUsersFetcher 是一个接口
public interface DirectoryUsersFetcher {
Iterator<String> importUsers(DirectoryUserDataSource dataSource);
}
有2个实现
@Component
public class ActiveDirectoryUsersFetcher implements DirectoryUsersFetcher {
public Iterator<String> importUsers(DirectoryUserDataSource dataSource) {
System.out.println("Returning data from Active Directory");
return Arrays.asList("ActiveDirectoryUser1", "ActiveDirectoryUser2", "ActiveDirectoryUser3").iterator();
}
}
和
@Component
public class CsvUsersFetcher implements DirectoryUsersFetcher {
public Iterator<String> importUsers(DirectoryUserDataSource dataSource) {
System.out.println("Returning data from CSV");
return Arrays.asList("CsvUser1", "CsvUser2", "CsvUser3").iterator();
}
}
我希望根据DataSourceType 的含义在运行时使用其中一个
public enum DataSourceType {
DirectoryServer,
Csv
}
DataSource 本身就是一个界面,看起来像
public interface DirectoryUserDataSource {
DataSourceType getType();
}
有2个实现
public class ActiveDirectoryDataSource implements DirectoryUserDataSource {
public DataSourceType getType() {
return DataSourceType.DirectoryServer;
}
}
和
public class CsvDataSource implements DirectoryUserDataSource {
public DataSourceType getType() {
return DataSourceType.Csv;
}
}
我的test 看起来像
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = {DirectoryUserImportWorkflow.class, ActiveDirectoryUsersFetcher.class, CsvUsersFetcher.class})
public class DirectoryUserImportWorkflowTest {
@Autowired
private DirectoryUserImportWorkflow workflow;
@Test
public void runStrategy() throws Exception {
workflow.run();
}
}
我看到的是
at org.apache.maven.surefire.booter.ForkedBooter.main(ForkedBooter.java:75)
Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'directoryUserImportWorkflow': Unsatisfied dependency expressed through field 'directoryUsersFetcher': No qualifying bean of type [com.learner.datafetcher.DirectoryUsersFetcher] is defined: expected single matching bean but found 2: activeDirectoryUsersFetcher,csvUsersFetcher; nested exception is org.springframework.beans.factory.NoUniqueBeanDefinitionException: No qualifying bean of type [com.learner.datafetcher.DirectoryUsersFetcher] is defined: expected single matching bean but found 2: activeDirectoryUsersFetcher,csvUsersFetcher
我该如何解决这个问题?
我需要什么?
基于DataSource 是ActiveDirectory 或Csv,特定的提取器应调用ActiveDirectoryUsersFetcher 或CsvUsersFetcher
我在哪里缺少理解?
提前致谢
【问题讨论】:
-
为什么fetcher一开始就不包含数据源?
标签: java spring java-8 strategy-pattern