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实现,并且可能想要对这种发送能力进行unit testing,我想我应该在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 noob。我想我理解dependency injection,但我不明白如何用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); } 

辅助注射维基