glm*_*ndr 4 dependency-injection guice
这个例子来自一本关于依赖注入的书.
在页87,有这个例子.
public class NewsletterManager {
private final List<Recipient> recipients;
private final DelivererFactory factory; // The book notes this as injected
public NewsletterManager(List<Recipient> rs, DelivererFactory factory) {
this.recipients = rs;
this.factory = factory;
}
public void send(Newsletter letter) {
for (Recipient recipient : recipients) {
Deliverer d = factory.forLetter(letter);
d.deliverTo(recipient);
}
}
}
Run Code Online (Sandbox Code Playgroud)
我理解代码的意图,但我不明白的是如何实现或配置我的代码Module,以便我可以创建这个类的实例.
似乎DelivererFactory注入了.这些例子没有说明如何,但让我们承认它是通过构造函数注入.在这种情况下,如何传递List<Recipient>特定于NewsletterManager我想要的实例的实例?如何使用Guice NewsletterManager通过模块配置DelivererFactory和特定List<Recipient>实例实例化我?
我没有得到的是如何同时在构造函数的签名中自动注入对象和特定于实例的对象.在那种情况下,我不知道如何得到一个NewsletterManager只有我的实例List<Recipient>.我必须依靠工厂吗?在那种情况下,DelivererFactory注射的用途是什么,因为我也必须在我的工厂注射它...
我希望我的问题足够清楚......
你是对的,这种注射只能通过工厂来解决.
如果你有Foo(A a, B b)A被注入并且B在运行时被传递,你将需要一个Factory FooFactory.createFoo(B b),它在内部保存对A的引用.
幸运的是,Guice有@Assisted Injection的概念.您将必须提供工厂的界面,但可以将实施的"魔力"留给Guice.
它有很好的文档记录:https://github.com/google/guice/wiki/AssistedInject
您需要额外依赖com.google.inject.extensions»guice-assisted-inject