[英]Constructor Injection using 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)时,请务必添加绑定注释。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.