Java – Guice only registers some constructors
Suppose I have some message classes, as shown below This is a simple combination class
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); } }
Since I have different messagesender implementations and may want to unit test this sending capability, I think I should inject messagesender into the send () method of message But what should I do?
All the Guice examples I saw, I understand, seem to be injected into the constructor:
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); } }
But my message class accepts a text parameter in its constructor, and I don't want to inject it What should I do?
(Note: I am a complete Google Guice noob. I think I understand dependency injection, but I don't understand how to actually implement it with Guice.)
Solution
You can use assisted injection to provide text through the factory and message senders instantiated by Guice:
public class Message { private String text; private MessageSender sender; @Inject public Message(@Assisted String text,this.text); } }
Factory:
public interface MessageFactory{ Message buildMessage(String text); }
modular:
public class MessageSenderModule extends AbstractModule { @Override protected void configure() { bind(MessageSender.class).to(EmailBasedMessageSender.class); FactoryModuleBuilder factoryModuleBuilder = new FactoryModuleBuilder(); install(factoryModuleBuilder.build(MessageFactory.class)); } }
Usage:
@Inject MessageFactory messageFactory; void test(Recipient recipient){ Message message = messageFactory.buildMessage("hey there"); message.send(recipient); }
Assisted Injection Wiki