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成为创建新的复杂实现的唯一方法,那么这一点尤其有效