Java Guice只注入一些构造函数

Java Guice只注入一些构造函数,java,dependency-injection,guice,Java,Dependency Injection,Guice,假设我有一些Message类,如下所示。(为了简单起见,这是一个虚构的类。) 由于我有不同的MessageSender实现,并且可能希望对这种发送能力进行单元测试,因此我认为应该在Message的send()方法中注入MessageSender。但是我该怎么做呢 我所看到的和理解的所有Guice示例似乎都在构造函数中进行注入: public class Message { private String text; private MessageSender sender; // ?

假设我有一些
Message
类,如下所示。(为了简单起见,这是一个虚构的类。)

由于我有不同的
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);
  }
}
但是我的
消息
类在其构造函数中接受了一个
文本
参数,我不想注入它。那我该怎么办呢


(注意:我是一个完整的Google Guice noob。我想我了解依赖注入,但我不知道如何用Guice实际实现。)

您可以使用辅助注入通过工厂提供文本,以及Guice实例化的消息发送者:

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

  @Inject
  public Message(@Assisted String text, MessageSender sender) {
    this.text = text;
    this.sender = sender;
  }

  public void send(Person recipient) {
    this.sender.send(recipient, 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);
}

@Inject MessageFactory messageFactory;

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