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年前に、これらの投稿に関連する別のプロジェクトに取り組んでいたことを知っています
私が最終的にある時点でインジェクターを取り外す方法を理解したように。
ありがとう、ディーン