私は注入したい二つのクラス、持っている:私は試してみて、他の場所でそれらを使用する場合、私は別の動作を取得CDI w.r.t.で特別な機能ですか? @Inject vs BeanManager.getBeans(Function.class)?
@ApplicationScoped
public class BeanThing {
public String apply(String s) {
return "bt(" + s + ")";
}
}
と
@ApplicationScoped
public class ClassFunction implements Function<String, String> {
@Override
public String apply(String s) {
return "cf(" + s + ")";
}
}
を:
Set<Bean<?>> functions = beanManager.getBeans(Function.class);
for (Bean<?> untyped : functions) {
Bean<Function<String, String>> typed = (Bean<Function<String, String>>) untyped;
Function<String, String> function = beanManager.getContext(typed.getScope()).get(typed, beanManager.createCreationalContext(typed));
System.err.println(function.apply("beanManager"));
}
Set<Bean<?>> beanThings = beanManager.getBeans(BeanThing.class);
for (Bean<?> untyped : beanThings) {
Bean<BeanThing> typed = (Bean<BeanThing>) untyped;
BeanThing beanThing = beanManager.getContext(typed.getScope()).get(typed, beanManager.createCreationalContext(typed));
System.err.println(beanThing.apply("beanManager"));
}
System.err.println(injectedFunction.apply("injected"));
System.err.println(beanThing.apply("injected"));
System.err.println("injectedFunction is a function: " + (injectedFunction instanceof Function));
私の出力があります:
bt(beanManager)
cf(injected)
bt(injected)
injectedFunction is a function: true
これは私が期待しているよりも1行少ないです。
誰かがここで何が起こっているのか説明できますか?
ソリューション、正しい道の下に私をオフに設定するためのSiliarusに感謝:
Set<Bean<?>> functions = beanManager.getBeans(new ParameterizedType() {
@Override
public Type[] getActualTypeArguments() {
return new Type[]{new WildcardType() {...}, new WildcardType() {...};
}
@Override
public Type getRawType() {
return Function.class;
}
});
お返事ありがとうございます。 BeanManagerの他の修飾子について知りたいので、私はBeanManagerに依頼しています。これは、関連する型が最終的に専用クラスではなくラムダを返すプロデューサになると推測していると確信しています。 Beanマネージャーに機能,?>を依頼する方法はまだわかりませんか? –
BMにいくつかの有用なタイプ情報を与えることで、それは問題ありませんでした。私は、引数型として2つのワイルドカード型を使用して、非常に明示的な、ParametrizedTypeを必要としました。 –
あなたはそれを理解してうれしい! :) – Siliarus