我试图让guice调用我的工厂方法来创建实例,然后通过检查它的注释来填充它。我知道我以前做过这个,但我无法弄清楚如何绑定以下代码....
我的绑定代码
binder.bind(ProcessorFactory.class).asEagerSingleton();
我绑定的代码(我希望Guice在创建时填充SplineProcessor和InvertProcessor及其绑定。
public class ProcessorFactory implements Provider<Processor>{
public static final ThreadLocal<String> threadLocal = new ThreadLocal<String>();
private Map<String, Class<?>> nameToClazz = new HashMap<String, Class<?>>();
public ProcessorFactory() {
nameToClazz.put("splineV1Beta", SplineProcessor.class);
nameToClazz.put("invertV1Beta", InvertProcessor.class);
}
@Override
public Processor get() {
String moduleName = threadLocal.get();
if(moduleName == null)
throw new IllegalArgumentException("Please call ProcessorFactory.threadLocal.set(moduleName)");
Class<?> clazz = nameToClazz.get(moduleName);
if(clazz == null)
return null;
try {
Object newInstance = clazz.newInstance();
return (Processor) newInstance;
} catch (InstantiationException e) {
throw new RuntimeException(e);
} catch (IllegalAccessException e) {
throw new RuntimeException(e);
} finally {
threadLocal.set(null);
}
}
}
注意:我仍然想知道如何做到这一点虽然我也有这个开放的问题,这是做同样事情的更好方法guice multibinder with Providers
但不幸的是,我也无法让它发挥作用。
注意:我也使用什么注入代码。我正在使用以下代码注入(并尝试使用ProcessorFactory)。
@Inject
private Provider<ProcessorSetup> processors;
编辑更多CLARIY
在bean中我有以下
@Inject
private Provider<ProcessorSetup> processors;
当我调用processors.get()时,它会进入guice然后guice正确调用ProcessorFactory.get()并逐步执行该代码,我的新enttiy通过Guice返回给客户端但是从不连接到任何东西。这很糟糕,因为我们在我们创建的那些实体中也有@Inject。我知道大约2年前,我有关于这些帖子的另一个项目
因为我确实知道如何最终在一个点上移除注射器。
感谢, 迪安
答案 0 :(得分:2)
您是否试图让Guice使用您的提供商来创建Processor
的实例?如果是这样,那么您应该将配置更改为:
bind(Processor.class).toProvider(ProcessorFactory.class);
看起来您正在使用ThreadLocal
来配置生成的实例。您考虑过Assisted Inject吗?
答案 1 :(得分:1)
我的新enttiy通过Guice返回客户端,但从未连接到任何东西。这很糟糕,因为我们在我们创建的实体中也有@Inject
这是预期的,因为您使用clazz.newInstance()
创建了类。如果您希望Guice注入其成员,您需要致电injector.injectMemebers(newInstance)
。
这将注入所有字段和方法,但显然不是构造函数注入。
我还提出了第二个condit建议,用AssitedInject替换ThreadLocals以进行参数传递,或者只是创建一个自定义工厂而不是Provider。