有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

JavaGuice向类构造函数注入对象

我刚开始找Guice做一个新项目。我有类似的东西

ConfigImpl类ans配置接口

 interface Config{...}

 class ConfigImpl implements Config {
   private static final Map<> propMap;
   public ConfigImpl(Map<> propMap) {
     this.propMap = someProps;
   }
 }

我想出的Guice注射法

public class MyInjector extends AbstractModule {
  protected void configure() {
    bind(Config.class).to(ConfigImpl.class)
  }
}

最后

public SomeClass {
  Config someConfig;
  Injector injector = Guice.createInjector(new MyInjector());
  someConfig = injector.getInstance(Config.class);          
}

现在我非常困惑,因为我找不到将propMap传递到ConfigImpl类的方法。我想知道用Guice做这件事的正确方法。谢谢


共 (1) 个答案

  1. # 1 楼答案

    您应该从模块中注入propMaps

    public class MyInjector extends AbstractModule {
      private final Map<String,String> mapProps;
      public MyInjector(Map<String,String> mapProps) {
        this.mapProps = mapProps;
      }
      protected void configure() {
        bind(Config.class).to(ConfigImpl.class).in(Scope.SINGLETON);         // You most than likely want this
        bind(new TypeLiteral<Map<String,String>>() {}).toInstance(mapProps); // binding for the map.
      }
    }
    

    然后像这样使用它:

    public class SomeClass {
      void doSomething() {
        Map<String,String> mapProps = ... ;
        Injector injector = Guice.createInjector(new MyInjector(mapProps));
        Config someConfig = injector.getInstance(Config.class);          
      }
    }
    

    另外,您应该修复ConfigImpl类:

    class ConfigImpl implements Config {
      private final Map<String,String> propMap;
      @Inject                                         // mandatory since you use a non-default constructor
      public ConfigImpl(Map<String,String> propMap) { // add the generic type of the map
        this.propMap = propMap;
      }
    }