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, и я, возможно, захочу провести модульное тестирование этой возможности отправки, я думаю, что мне следует внедрить MessageSender в Message метод send(). Но как мне это сделать?

Все примеры 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 принимает в своем конструкторе аргумент text, который я не хочу инъектировать. Что же я должен сделать вместо этого?

(Примечание: я полный профан в Google Guice. Я думаю, что понимаю инъекцию зависимостей, но не понимаю, как на самом деле реализовать ее с помощью Guice.)

12
задан grautur 6 February 2012 в 00:29
поделиться