Guice可以从类文字中实例化我的类吗?

时间:2014-05-12 23:18:58

标签: java guice

我正在使用Guice构建我的应用程序,我有一个奇怪的情况。我有一个属性文件,其中包含我的接口和实现类的映射,如 -

interface = Implclass

我想将interface.class绑定到我的implclass.class

因此,当我请求injector.getInstance(MyInterface.class)时,Guice可以返回我的Impl类的实例。

这可能吗?

2 个答案:

答案 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)

Google says yes

public class BillingModule extends AbstractModule {
  @Override 
  protected void configure() {
    bind(TransactionLog.class).to(DatabaseTransactionLog.class);
  }
}

要获得给定类名字符串的Class,请使用Class.forName