如何让guice使用我的工厂来创建新实例

时间:2013-02-12 15:58:26

标签: guice

我试图让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年前,我有关于这些帖子的另一个项目

https://groups.google.com/forum/?fromgroups=#!searchin/google-guice/dean/google-guice/BZn2cnSeX64/MCRgFPjoHH4J

因为我确实知道如何最终在一个点上移除注射器。

感谢, 迪安

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。