使用Guice构造函数注入

我有一些使用工厂的示例代码。 我想通过删除工厂来清理代码并使用Guice代替。 我试图这样做,但我遇到了一个小障碍。 我对Guice很新,所以我希望有人可以帮助我。

现有客户端代码(使用工厂):

public class MailClient { public static void main(String[] args) { MailConfig config = MailConfigFactory.get(); config.setHost("smtp.gmail.com"); Mail mail = MailFactory.get(config); mail.send(); } } 

我试图使用Guice进行重构:

 //Replaces existing factories public class MailModule extends AbstractModule { @Override protected void configure() { bind(Mail.class) .to(MailImpl.class); bind(MailConfig.class) .to(MailConfigImpl.class); } } public class MailImpl implements Mail { private final MailConfig config; @Inject public MailImpl(MailConfig config) { this.config = config; } public void send() { ... } } public class MailClient { public static void main(String[] args) { MailModule mailModule = new MailModule(); Injector injector = Guice.createInjector(mailModule); MailConfig config = injector.getInstance(MailConfig.class); config.setHost("smtp.gmail.com"); Mail mail = //?? mail.send(); } } 

如何在我修改过的MailImpl使用对象config构造一个MailImpl实例? 我应该以这种方式使用Guice吗?

看看AssistedInject 。 它似乎解决了这个问题。

2种解决方案是可能的:1)将配置绑定为guice对象,包括其主机参数。 然后只是注入Mail,在你的main方法中你忽略了邮件有进一步依赖的事实。

2)必须为每个发送(收件人?)单独配置邮件。 然后你别无选择,但使用MailFactory自己创建它。

您可以在MailModule中执行以下操作:

 public class MailModule extends AbstractModule { @Override protected void configure() { ... // other bindings } @Provides MailConfig getMailConfig( ... ) { MailConfig config = new MailConfig( ... ); config.setHost("smtp.gmail.com"); config; } } 

如果你想要一个单独的MailConfig,将@Singleton注释添加到getMailConfig(),Bob是你的叔叔。

请注意,必须绑定getMailConfig的参数。 绑定常用类型(如String)时,请务必添加绑定注释。