2017-09-04 12 views
0

私は注入したい二つのクラス、持っている:私は試してみて、他の場所でそれらを使用する場合、私は別の動作を取得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; 
     } 
    }); 

答えて

0

私はあなたが欠落している正しく何あなたのサンプルを取得した場合、最初の行である - BeanManagerを経て得られたFunctionからの出力。

私の推測では、Set<Bean<?>> functionsは空です。その理由は、genericsです。 Functionは一般的なタイプであり、BeanManagerのメソッドはそれほど良くありません。 CDI仕様では、Typesafe resolution for parameterized typesがかなり好意的に定義されています。

簡潔に言えば、タイプFunction<String, String>のBeanはFunction.classの生のものに割り当てられず、BeanManagerメソッドに渡されます。

パラメタリゼーションタイプをオンザフライでインスタンス化する場合は、Instance<T>を使用することができます。TypeLiteralの使用をサポートしています。これは、生のタイプだけでなく、実際のパラメータ

+0

お返事ありがとうございます。 BeanManagerの他の修飾子について知りたいので、私はBeanManagerに依頼しています。これは、関連する型が最終的に専用クラスではなくラムダを返すプロデューサになると推測していると確信しています。 Beanマネージャーに機能を依頼する方法はまだわかりませんか? –

+0

BMにいくつかの有用なタイプ情報を与えることで、それは問題ありませんでした。私は、引数型として2つのワイルドカード型を使用して、非常に明示的な、ParametrizedTypeを必要としました。 –

+0

あなたはそれを理解してうれしい! :) – Siliarus

関連する問題