JavaSpring实现了多个不同的接口,但每个接口都扩展了相同的接口
public interface DownloaderActivity {
void execute(Map<String, Object> param);
}
@Component(value = "updateState")
@Qualifier("updateState")
public interface UpdateStateActivity extends DownloaderActivity {
}
public class UpdateStateTask implements UpdateStateActivity {
private final String TASK_NAME = "initUpdateState";
@Override
public void execute(Map<String, Object> param) {
log.info("UpdateStateTask working.");
}
}
@Configuration
public class ActivityConfig {
@Autowired
List<DownloaderActivity> downloaderActivity;
@Autowired
private static Map<String, DownloaderActivity> activities;
public static class ActivityFactory {
private static volatile ActivityFactory INSTANCE = new ActivityFactory();
private ActivityFactory() {}
public DownloaderActivity getActivity(final String name) {
return activities.get(name);
}
public static ActivityFactory getInstance() {
return INSTANCE;
}
}
}
public class UpdateState {
public void process() throws Exception {
DownloaderActivity update = ActivityConfig.ActivityFactory.getInstance().getActivity(name());
update.execute(variables);
}
}
我们的期望是我们必须得到所有活动的清单
但程序在启动时失败并出现错误
ConfigServletWebServerApplicationContext : Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'activityConfig': Unsatisfied dependency expressed through field 'downloaderActivity'; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'java.util.List<.DownloaderActivity>' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}
实现类是否缺少注释(组件和限定符)
但是我们在UpdateStateActivity上添加了注释,这样业务实现就不会依赖于spring框架。所有接口都在不同的库中,实现在另一个库中。如果在我们的类中需要一个实现类,那么我们可以使用不同的工厂类来提供Springbeans。 ActivityFactory类是为获取与活动相关的实现的Springbean而创建的,请检查类UpdateState我们如何使用ActivityFactory提供bean实例
共 (0) 个答案