1

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);
    }
}

}

注:これを行う方法を知りたいのですが、この未解決の質問もあります。これは、プロバイダーと同じことを行うためのさらに優れた方法です。

しかし残念ながら、私もそれを機能させることができません。

注:どのインジェクションコードも使用しますか。私は次のコードを使用して注入しています(そしてProcessorFactoryも試しました)。

@Inject
private Provider<ProcessorSetup> processors;

より明確にするために編集

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

私が最終的にある時点でインジェクターを取り外す方法を理解したように。

ありがとう、ディーン

4

2 に答える 2

2

Guiceにプロバイダーを使用してのインスタンスを作成させようとしていますProcessorか?その場合は、構成を次のように変更する必要があります。

bind(Processor.class).toProvider(ProcessorFactory.class);

また、それを使用しThreadLocalて結果のインスタンスを構成しているようです。アシストインジェクトを検討しましたか?

于 2013-02-12T16:22:34.123 に答える
1

私の新しいenttiyはGuiceを通過してクライアントに返されますが、何にも接続されることはありません。作成するエンティティにも@Injectがあるため、これは悪臭を放ちます

を使用してクラスを作成するため、これは予想どおりですclazz.newInstance()。Guiceにそのメンバーを注入させたい場合は、に電話する必要がありますinjector.injectMemebers(newInstance)。これにより、すべてのフィールドとメソッドが挿入されますが、コンストラクターの挿入は明らかに行われません。

また、パラメーターを渡すためにThreadLocalsをAssitedInjectに置き換えるか、プロバイダーの代わりにカスタムファクトリを作成することを2番目に提案します。

于 2013-02-15T16:20:23.063 に答える