我正在使用Guice构建我的应用程序,我有一个奇怪的情况。我有一个属性文件,其中包含我的接口和实现类的映射,如 -
interface = Implclass
我想将interface.class绑定到我的implclass.class
因此,当我请求injector.getInstance(MyInterface.class)时,Guice可以返回我的Impl类的实例。
这可能吗?
答案 0 :(得分:3)
你可以做一些非常简单的事情:
class Module extends AbstractModule {
Properties properties;
Module(Properties properties) {
this.properties = properties;
}
@Override
protected void configure() {
for (Entry<Object, Object> entry: properties.entrySet()) {
try {
Class<?> abstractClass = Class.forName((String)entry.getKey());
Class implementation = Class.forName((String)entry.getValue());
bind(abstractClass).to(implementation);
} catch (ClassNotFoundException e) {
//Handle e
}
}
}
}
请注意,属性文件需要包含完全限定的类名才能使其正常工作。我注意到你的问题使用了短名称。请查看this question以添加对此的支持。
Spring对基于XML的配置有广泛的支持,这可能是一个更好的选择,具体取决于你想要做什么。在代码中保存绑定很好,因为它们可以在重构后继续存在。
如果您尝试允许客户向您的应用添加功能SPI可能是更好的选择。
答案 1 :(得分:1)
public class BillingModule extends AbstractModule {
@Override
protected void configure() {
bind(TransactionLog.class).to(DatabaseTransactionLog.class);
}
}
要获得给定类名字符串的Class,请使用Class.forName。