【问题标题】:Constructor parameter injection using guice使用 guice 的构造函数参数注入
【发布时间】:2015-06-18 18:27:11
【问题描述】:

这是一个与其他已回答的关于构造函数参数的问题略有不同的问题(或者至少我是这么认为的,当然我可能错了)。所以我使用 MapBinder 来存储一堆实现,然后在运行时根据一些标准选择一个。这是一些代码:

public interface MessageService {
  void send();
}

public class FacebookMessageService implements MessageService {
  private final String name;

  @Inject
  public FacebookMessageService(String name) {
    this.name = name;
  }

  public void send() {
    System.out.println("Sending message via facebook service to " + name);
  }
}

public class MessageModule extends AbstractModule {
  @Override
  protected void configure() {
    MapBinder<String, MessageService> mapBinder = MapBinder.newMapBinder<.....>
    mapBinder.addBinding("facebook").to(FacebookMessageService.class);
  }
}

public class MessageClient {
  @Inject
  Map<String, MessageService> map; //Mapbinder being injected

  public void callSender() {
    Injector injector = Guice.createInjector(new MessageModule());
    injector.injectMembers(this);

    MessageService service = map.get("facebook");
    service.send();
  }
}

我无法弄清楚如何使用name 参数获取FacebookMessageService?如果我将AssistedInjectFactory 一起使用,那么我无法弄清楚如何将实现注入MapBinder

【问题讨论】:

  • 我没用过MapBinder,但是按照this的说法,你应该是自己注入MapBinder,而不是key,这就是你想要的吗?
  • @AlperAkture 我不确定你在这里所说的key 是什么意思,但是mapBinder 正在被注入客户端。上面的代码有效,但我不知道如何注入 name 参数,所以它基本上打印“通过 facebook 服务发送消息”而没有 name
  • 你能从一个 prop 文件中加载 FacebookMes​​sageService 构造函数参数吗,比如this
  • 这对配置很有意义,但在我的情况下它是一个接口。抱歉,我在那里有一个字符串,但这只是为了简化问题。 :) 我不知道那个配置。谢谢! :)
  • np,也许我没有完全了解您的用例。你想在 FacebookMes​​sageService 构造函数中注入什么?

标签: java guice


【解决方案1】:

你可以注入'name'参数。

public class FacebookMessageService implements MessageService {
    private final String name;

    @Inject
    public FacebookMessageService(@Named("facebookServiceName") String name) {
       this.name = name;
    }
}

public class MessageModule extends AbstractModule {
    @Override
    protected void configure() {
        // bind the "facebookServiceName"
        // I think this binding should exist before the map binding
        bindConstant().annotatedWith(Names.named("facebookServiceName"))
                      .to("insert your argument here");

        MapBinder<String, MessageService> mapBinder = MapBinder.newMapBinder<.....>
        mapBinder.addBinding("facebook").to(FacebookMessageService.class);
    }
}

在 FacebookMes​​sageService 构造函数中放置一个调试点,看看这是否有效。

【讨论】:

    猜你喜欢
    • 2017-07-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-27
    • 1970-01-01
    相关资源
    最近更新 更多