【发布时间】:2012-03-11 14:02:15
【问题描述】:
当存在同一接口的多个实现并且此依赖项是在运行时根据参数定义时,我对如何使用 guice 实现依赖注入有些疑问,所以我将举一个例子来轻松解释我的问题:
想象一下,你有一个模块来加载多种格式的文件,基本上你有一个定义合约的接口,每种格式都有多个实现:
public interface FileLoader {
void load(File file);
}
public class YMLFileLoader{
void load(File file){
System.out.println("Loading YML");
}
}
public class XMLFileLoader{
void load(File file){
System.out.println("Loading XML");
}
}
现在,在运行时 guice 必须根据文件扩展名定义必须用于加载它的实现。 我保持代码干净的想法是使用注释,因为每个实现都指定了她通过 @FileLoaderType 注释加载的内容。
@Singleton
@FileLoaderType("yml")
public class YMLFileLoader{
void load(File file)
{
System.out.println("Loading YML");
}
}
@Singleton
@FileLoaderType("xml")
public class XMLFileLoader{
void load(File file)
{
System.out.println("Loading XML");
}
}
我的第一个问题是是否可以实施?
第一个问题是肯定的,有什么方法可以实现这个解决方案,对于 FileLoader 的每个新实现都不需要在支持该解决方案的 AbstractModule 实现中进行重构? 换句话说,基本上对于 FileLoader 的每个新实现只需要注解 @FileLoaderType 的存在,让 Guice 知道如果扩展与她匹配,它应该注入的依赖项是什么。
【问题讨论】:
标签: java dependency-injection guice