Guice 仅注入一些构造函数

问题描述 投票:0回答:1

假设我有一些像下面这样的

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 实际实现它。)

java dependency-injection guice
1个回答
20
投票

您可以使用辅助注入通过工厂提供文本,以及由 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);
}

辅助注射维基

© www.soinside.com 2019 - 2024. All rights reserved.