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实现,并且可能要进行单元测试这种发送能力,我想应当注入MessageSenderMessagesend()方法。但我该怎么做?

所有吉斯的例子我见过和我的理解似乎做注射在构造函数:

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); 
} 

Assisted Injection Wiki