将所有实现类使用
@Qualifier
注释自动装配到工厂中,并从工厂返回所需的服务类。
public class MyService {
private void doStuff();
}
我的Windows服务:
@Service("myWindowsService")
public class MyWindowsService implements MyService {
@Override
private void doStuff() {
}
}
我的 Mac 服务:
@Service("myMacService")
public class MyMacService implements MyService {
@Override
private void doStuff() {
}
}
我的工厂:
@Component
public class MyFactory {
@Autowired
@Qualifier("myWindowsService")
private MyService windowsService;
@Autowired
@Qualifier("myMacService")
private MyService macService;
public MyService getService(String serviceNeeded){
if(serviceNeeded == "Windows"){
return windowsService;
} else {
return macService;
}
}
}
如果您想要更加巧妙,您可以使用枚举来存储实现类类型,然后使用枚举值来选择您想要返回的实现。
public enum ServiceStore {
MAC("myMacService", MyMacService.class),
WINDOWS("myWindowsService", MyWindowsService.class);
private String serviceName;
private Class<?> clazz;
private static final Map<Class<?>, ServiceStore> mapOfClassTypes = new HashMap<Class<?>, ServiceStore>();
static {
ServiceStore[] namesArray = ServiceStore.values();
for(ServiceStore name : namesArray){
mapOfClassTypes.put(name.getClassType, name);
}
}
private ServiceStore(String serviceName, Class<?> clazz){
this.serviceName = serviceName;
this.clazz = clazz;
}
public String getServiceBeanName() {
return serviceName;
}
public static <T> ServiceStore getOrdinalFromValue(Class<?> clazz) {
return mapOfClassTypes.get(clazz);
}
}
然后您的工厂可以接入应用程序上下文,并将实例拉入自己的映射中。当您添加新的服务类时,只需将另一个条目添加到枚举中,这就是您需要做的全部。
public class ServiceFactory implements ApplicationContextAware {
private final Map<String, MyService> myServices = new Hashmap<String, MyService>();
public MyService getInstance(Class<?> clazz) {
return myServices.get(ServiceStore.getOrdinalFromValue(clazz).getServiceName());
}
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
myServices.putAll(applicationContext.getBeansofType(MyService.class));
}
}
现在你只需将所需的类类型传递给工厂,它将为您提供所需的实例。这非常有帮助,特别是如果您想使服务通用化。
@Qualifier
时有什么问题吗? - JamesENL