【问题标题】:Guice injecting only some of the constructorGuice 只注入了一些构造函数
【发布时间】:2012-02-06 08:44:33
【问题描述】:

假设我有一些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 实现,并且可能想要对这种发送能力进行单元测试,我想我应该在Messagesend() 方法中注入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 类在其构造函数中接受text 参数,我不想注入它。那我应该怎么做呢?

(注意:我是一个完整的 Google Guice 菜鸟。我想我了解依赖注入,但我不明白如何用 Guice 实际实现它。)

【问题讨论】:

    标签: java dependency-injection guice


    【解决方案1】:

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

    Assisted Injection Wiki

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-07-14
      • 1970-01-01
      • 2013-11-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多