Guice只注入一些构造函数
问题描述:
假设我有一些Message
类,如下所示。 (这是为了简单起见,虚构的类。)Guice只注入一些构造函数
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()
方法。但我该怎么做?
所有吉斯的例子我见过和我的理解似乎做注射在构造函数:
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
参数的构造函数中,我不想要注入。那么我该怎么做呢?
(注:我是一个完整的谷歌吉斯小白我想我明白依赖注入,但我不明白如何真正与吉斯实现它)
答
你可以使用辅助注塑提供通过工厂文字,与由实例化吉斯消息发送者沿着:
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);
}