gra*_*tur 12 java dependency-injection 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);
}
}
Run Code Online (Sandbox Code Playgroud)
因为我有不同的MessageSender
实现,并且可能要进行单元测试这种能力送,我想我应该注射MessageSender
的Message
的send()
方法.但是我该怎么做?
我见过的所有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);
}
}
Run Code Online (Sandbox Code Playgroud)
但我的Message
类text
在其构造函数中引入了一个参数,我不想注入它.那么我该怎么做呢?
(注意:我是一个完整的Google Guice noob.我想我理解依赖注入,但我不明白如何用Guice实现它.)
Joh*_*sen 19
您可以使用辅助注入通过工厂提供文本,以及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);
}
}
Run Code Online (Sandbox Code Playgroud)
厂:
public interface MessageFactory{
Message buildMessage(String text);
}
Run Code Online (Sandbox Code Playgroud)
模块:
public class MessageSenderModule extends AbstractModule {
@Override
protected void configure() {
bind(MessageSender.class).to(EmailBasedMessageSender.class);
FactoryModuleBuilder factoryModuleBuilder = new FactoryModuleBuilder();
install(factoryModuleBuilder.build(MessageFactory.class));
}
}
Run Code Online (Sandbox Code Playgroud)
用法:
@Inject MessageFactory messageFactory;
void test(Recipient recipient){
Message message = messageFactory.buildMessage("hey there");
message.send(recipient);
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
3668 次 |
最近记录: |