Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/398.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用guice的构造函数参数注入_Java_Guice - Fatal编程技术网

Java 使用guice的构造函数参数注入

Java 使用guice的构造函数参数注入,java,guice,Java,Guice,这是一个与其他关于构造函数参数的问题略有不同的问题(或者至少我是这么认为的,当然我可能错了)。因此,我使用MapBinder来存储一组实现,然后在运行时根据一些标准选择一个。下面是一些代码: public interface MessageService { void send(); } public class FacebookMessageService implements MessageService { private final String name; @Injec

这是一个与其他关于构造函数参数的问题略有不同的问题(或者至少我是这么认为的,当然我可能错了)。因此,我使用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();
  }
}
公共接口消息服务{
无效发送();
}
公共类FacebookMessageService实现MessageService{
私有最终字符串名;
@注入
public FacebookMessageService(字符串名称){
this.name=名称;
}
公共无效发送(){
System.out.println(“通过facebook服务向“+name”发送消息);
}
}
公共类MessageModule扩展了AbstractModule{
@凌驾
受保护的void configure(){
MapBinder MapBinder=MapBinder.newMapBinder
mapBinder.addBinding(“facebook”).to(FacebookMessageService.class);
}
}
公共类消息客户端{
@注入
Map Map;//正在注入Mapbinder
public void callSender(){
Injector=Guice.createInjector(新消息模块());
注入器。注入器成员(本);
MessageService=map.get(“facebook”);
service.send();
}
}

我无法确定如何使用
名称
参数获取
facebook消息服务
?如果将
AssistedInject
工厂一起使用
,则无法确定如何将实现注入
MapBinder

您可以注入'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);
    }
}
公共类FacebookMessageService实现MessageService{
私有最终字符串名;
@注入
公共FacebookMessageService(@Named(“facebookServiceName”)字符串名称){
this.name=名称;
}
}
公共类MessageModule扩展了AbstractModule{
@凌驾
受保护的void configure(){
//绑定“facebookServiceName”
//我认为这个绑定应该在映射绑定之前存在
bindConstant().annotatedWith(Names.named(“facebookServiceName”))
.to(“在此插入您的论点”);
MapBinder MapBinder=MapBinder.newMapBinder
mapBinder.addBinding(“facebook”).to(FacebookMessageService.class);
}
}

在FacebookMessageService构造函数中放置一个调试点,以查看其是否有效。

您可以插入'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);
    }
}
公共类FacebookMessageService实现MessageService{
私有最终字符串名;
@注入
公共FacebookMessageService(@Named(“facebookServiceName”)字符串名称){
this.name=名称;
}
}
公共类MessageModule扩展了AbstractModule{
@凌驾
受保护的void configure(){
//绑定“facebookServiceName”
//我认为这个绑定应该在映射绑定之前存在
bindConstant().annotatedWith(Names.named(“facebookServiceName”))
.to(“在此插入您的论点”);
MapBinder MapBinder=MapBinder.newMapBinder
mapBinder.addBinding(“facebook”).to(FacebookMessageService.class);
}
}

在FacebookMessageService构造函数中放置一个调试点,以查看这是否有效。

我没有使用MapBinder,但根据,您应该注入MapBinder本身,而不是密钥,这是您想要的吗?@AlperAkture不确定您这里所说的
密钥
是什么意思,但MapBinder正在注入客户端。上面的代码可以工作,但我不知道如何注入
name
参数,所以它基本上打印“通过facebook服务发送消息到”,而不带
name
你能从一个prop文件加载FacebookMessageService构造函数参数吗,比如?这对配置来说很有意义,但在我的例子中,它是一个接口。对不起,上面有一个字符串,但这只是为了简化问题。:)但是我不知道这个配置。谢谢!:)np,也许我没有完全理解你的用例。你想在FacebookMessageService构造函数中注入什么?我没有使用MapBinder,但根据,你应该注入MapBinder本身,而不是密钥,这就是你想要的吗?@AlperAkture我不确定你这里所说的
key
是什么意思,但MapBinder正在客户端中注入。上面的代码可以工作,但我不知道如何注入
name
参数,所以它基本上打印“通过facebook服务发送消息到”,而不带
name
你能从一个prop文件加载FacebookMessageService构造函数参数吗,比如?这对配置来说很有意义,但在我的例子中,它是一个接口。对不起,上面有一个字符串,但这只是为了简化问题。:)但是我不知道这个配置。谢谢!:)np,也许我没有完全理解你的用例。你想在FacebookMessageService构造函数中注入什么?我没有使用MapBinder,但根据,你应该注入MapBinder本身,而不是密钥,这就是你想要的吗?@AlperAkture我不确定你这里所说的
key
是什么意思,但MapBinder正在客户端中注入。上面的代码可以工作,但我不知道如何注入
name
参数,所以它基本上打印“通过facebook服务发送消息到”,而不带
name
你能从一个prop文件加载FacebookMessageService构造函数参数吗,比如?这对配置来说很有意义,但在我的例子中,它是一个接口。对不起,上面有一个字符串,但这只是为了简化问题。:)但是我不知道这个配置。谢谢!:)np,也许我没有完全理解你的用例。您希望将什么注入FacebookMessageService构造函数?