【发布时间】:2014-05-12 23:18:57
【问题描述】:
我正在使用 Guice 构建我的应用程序,但我遇到了一种特殊情况。我有一个属性文件,其中包含我的接口和实现类的映射,例如 -
interface = Implclass
我想将 interface.class 绑定到我的 implclass.class
所以当我请求 injector.getInstance(MyInterface.class) Guice 可以返回我的 Impl 类的实例。
这可能吗?
【问题讨论】:
我正在使用 Guice 构建我的应用程序,但我遇到了一种特殊情况。我有一个属性文件,其中包含我的接口和实现类的映射,例如 -
interface = Implclass
我想将 interface.class 绑定到我的 implclass.class
所以当我请求 injector.getInstance(MyInterface.class) Guice 可以返回我的 Impl 类的实例。
这可能吗?
【问题讨论】:
你可以像这样做一些非常简单的事情:
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 可能是更好的选择。
【讨论】:
public class BillingModule extends AbstractModule {
@Override
protected void configure() {
bind(TransactionLog.class).to(DatabaseTransactionLog.class);
}
}
要获得一个给定类名字符串的类,请使用Class.forName。
【讨论】: