在我们的 Java EE 应用程序中,我们处理不同的文件类型。但不是将所有类型注入为
@Any
@Inject
private Instance<FileHandler> handler
我们用一个大开关来做到这一点。所有处理程序都从 FileHandler 扩展,它是一个抽象类,而不是一个接口。有没有办法让它通用?从我所看到的 Instance 来看,您仍然必须传递您想要使用的实现的类文件。
@Inject
private XmlHandler xmlHandler;
@Inject
private CsvHandler csvHandler;
public void method(String fileType) {
switch (fileType) {
case "xml":
xmlHandler.handle();
break;
case "csv":
csvHandler.handle();
break;
}
}
枚举列出所有这些:
public enum FileHandlers {
XmlHandler,
CsvHandler
}
要指定的限定符:
@Target({ElementType.TYPE,ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
@Qualifier
public @interface FileHandlerChooser {
FileHandlers choose();
}
实施:
@FileHandlerChooser(choose = FileHandlers.XmlHandler)
public class XmlHandler implements FileHandler {
...
}
注射:
@Inject
@FileHandlerChooser(choose = FileHandlers.XmlHandler)
private FileHandler fileHandler;