当前位置: 首页 > 面试题库 >

Guice只注入一些构造函数

秦皓君
2023-03-14
问题内容

假设我有一些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实现,并且可能想对该发送功能进行单元测试,因此我认为我应该注入MessageSenderin
Messagesend()方法。但是我该怎么做呢?

我见过的所有我理解的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);
  }
}

但是我的Messagetext在其构造函数中接受了一个参数,我不想注入该参数。那我该怎么办呢?

(注意:我是一个完整的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);
}

辅助注射维基



 类似资料:
  • 有人能帮助实现没有注释的Guice吗? pom。xml 我所尝试的: 我得到的错误是: 我理解这个错误。 但是我希望我可以“指向”Guice到正确的构造函数......而不是使用注释。 如您所见,使用默认/空构造函数不是一个好选择,因为这个示例很简单,但我想坚持使用基于构造函数的注入。 附加: 根据我在评论中从赫曼特·辛格那里得到的“暗示”,我想我离得更近了。 我创建了一个ProductionIn

  • 主要内容:输出注入是将依赖注入对象的过程。构造函数注入很常见。在这个过程中,依赖被作为参数注入到构造函数中。请参阅下面的示例。 创建一个名为 GuiceTester 的 Java 类。 GuiceTester.java 输出 编译并运行该文件,您将看到以下输出。

  • 我有一个类,我需要注入一个变量,但构造函数没有注入guice。 x的值未被注入。guice是否有必要在构造函数中使用注入来识别方法注入?我是否需要从其他类调用此方法才能工作?Thanx提前

  • 请帮助理解在哪种情况下我应该使用构造函数注入和设置器注入。请帮我举个合适的例子。 先谢谢你。

  • 注入是将依赖注入对象的过程。 构造函数注入很常见。 在此过程中,依赖项作为参数注入构造函数。 请参阅下面的示例。 创建一个名为GuiceTester的java类。 GuiceTester.java import com.google.inject.AbstractModule; import com.google.inject.Guice; import com.google.inject.Inj

  • 我有一个有两个构造函数的类。我正在尝试使用 guice 工厂创建此类的实例。如果未传递任何参数,则应调用默认构造函数。如果传递了参数,则应调用带参数的构造函数。但目前即使我将参数传递给工厂方法,仍然会调用默认构造函数。带参数的构造函数根本不被调用。下面是我的工厂类。 以下是我尝试注入的构造函数。 下面是我在抽象模块实现类中的模块绑定。 下面是我如何调用构造函数。 我在这里做错了什么?任何帮助都将不