Java Guice:辅助注射和提供者
假设我有一个如下的类:Java Guice:辅助注射和提供者,java,guice,assisted-inject,Java,Guice,Assisted Inject,假设我有一个如下的类: public class ComplicatedImpl implements Complicated { @Inject public ComplicatedImpl(Integer normal, @Assisted String assisted); public void addListener(Listener listener); } 现在,我有一个复杂的工厂如下: public interface ComplicatedFacto
public class ComplicatedImpl implements Complicated {
@Inject
public ComplicatedImpl(Integer normal, @Assisted String assisted);
public void addListener(Listener listener);
}
现在,我有一个复杂的工厂
如下:
public interface ComplicatedFactory {
public Complicated build(String assisted);
}
在使用FactoryModuleBuilder
时,是否可以绑定一个复杂的Factory
,以便在调用build()
时,我们执行与
ComplicatedImpl impl = new ComplicatedImpl(normal, assisted);
impl.addListener(listener);
return impl;
与直接返回新的dimpl
的正常情况相反
我一直在尝试将
复杂的dimpl
绑定到某种形式的提供者
,但似乎我会在这方面兜圈子……我认为这在Guice中是不可能的;除了将显式构造函数参数与依赖项混合之外,几乎没有其他作用。幸运的是,编写手动工厂相对容易:
public class ListeningComplicatedFactory {
@Inject Provider<Integer> normalProvider;
public Complicated createComplicated(String assisted, Listener listener) {
ComplicatedImpl impl = new ComplicatedImpl(normalProvider.get(), assisted);
// If ComplicatedImpl uses member injection, inject an Injector and call
// injector.injectMembers(impl) to call @Inject-annotated methods/fields.
impl.addListener(listener);
return impl;
}
}
公共类ListingComplexindFactory{
@注入提供者和正常提供者;
公共复杂CreateCompled(字符串辅助,侦听器){
compleximpl impl=new compleximpl(normalProvider.get(),assisted);
//如果DIMPL使用成员注入,则注入一个注入器并调用
//injector.injectMembers(impl)调用@Inject注释的方法/字段。
impl.addListener(监听器);
返回impl;
}
}
如果您愿意将addListener
放在complexed
接口上,您还可以选择编写一个包装器,该包装器将注入complexedFactory,创建新实例,并立即调用addListener
。如果在中绑定ComplexDfactory,然后只公开新的ComplexDwrapPerFactory,使ComplexDwrapPerFactory成为创建新的复杂实现的唯一方法,那么这一点尤其有效