java – Guice只注册一些构造函数

假设我有一些Message类,如下所示. (这是一个简单的组合课.)
public class Message {
  private String text;

  public Message(String text) {
    this.text = text;
  }

  public void send(Person recipient) {
    // I think I should be Guice-injecting the sender.
    MessageSender sender = new EmailBasedMessageSender();
    sender.send(recipient,this.text);
  }
}

由于我有不同的MessageSender实现,并且可能希望单元测试这种发送能力,我想我应该在Message的send()方法中注入MessageSender.但是我该怎么办?

我看到的所有的Guice示例,我明白,在构造函数中似乎注入了:

public class Message {
  private String text;
  private MessageSender sender;

  // ??? I don't kNow what to do here,since the `text` argument shouldn't be injected.
  @Inject
  public Message(String text,MessageSender sender) {
    this.text = text;
    this.sender = sender;
  }

  public void send(Person recipient) {
    this.sender.send(recipient,this.text);
  }
}

public class MessageSenderModule extends AbstractModule {
  @Override 
  protected void configure() {
    bind(MessageSender.class).to(EmailBasedMessageSender.class);
  }
}

但是我的Message类在其构造函数中接受一个文本参数,我不想注入它.那我该怎么办呢?

(注意:我是一个完整的Google Guice noob,我认为我了解依赖注入,但我不明白如何用Guice实际实现它.)

解决方法

您可以使用辅助注射通过工厂提供文本,以及由Guice实例化的消息发送者:
public class Message {
  private String text;
  private MessageSender sender;

  @Inject
  public Message(@Assisted String text,this.text);
  }
}

厂:

public interface MessageFactory{
    Message buildMessage(String text);
}

模块:

public class MessageSenderModule extends AbstractModule {
  @Override 
  protected void configure() {
    bind(MessageSender.class).to(EmailBasedMessageSender.class);
    FactoryModuleBuilder factoryModuleBuilder = new FactoryModuleBuilder();
    install(factoryModuleBuilder.build(MessageFactory.class));
  }
}

用法

@Inject MessageFactory messageFactory;

void test(Recipient recipient){
  Message message = messageFactory.buildMessage("hey there");
  message.send(recipient);
}

Assisted Injection Wiki

相关文章

最近看了一下学习资料,感觉进制转换其实还是挺有意思的,尤...
/*HashSet 基本操作 * --set:元素是无序的,存入和取出顺序不...
/*list 基本操作 * * List a=new List(); * 增 * a.add(inde...
/* * 内部类 * */ 1 class OutClass{ 2 //定义外部类的成员变...
集合的操作Iterator、Collection、Set和HashSet关系Iterator...
接口中常量的修饰关键字:public,static,final(常量)函数...