問題タブ [hk2]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
dependency-injection - 依存性注入のコンテキストで「具体化」とは正確には何を意味しますか
さまざまな DI フレームワークに関する本を何冊か読んだことがありますが、「具体化」または「具体化」(過去形) という用語が飛び交っていますが、それが実際にコード的に何を意味するのかをしっかりと把握することはできません。
ウィキペディアの定義は次のように述べています
(抽象的なものを)より具体的または現実的にする。
また、(関数型の?) プログラミングのコンテキストで「具体化」と「具体化」が意味するものは何ですか?も読みました。、これはプログラミングのコンテキストで上記の定義を確認します。
しかし、これが (DI のコンテキストで) コードにどのように適用されるかを頭の中で理解することはできません。質問の理由は、いくつかの HK2 ソース コードを見てスタック トレースをデバッグしようとしていて、 などの変数/メソッドや などのreified
スニペットが表示されるためif (!reified)
です。
したがって、何かが具体化されていない場合と具体化される時期/方法のコード例と、上記の定義が DI のコンテキストでどのように適用されるかについてのより良い説明を取得したいと思います。
注:質問にはhk2およびcdiというタグが付けられていますが、この用語が厳密に Java DI に結び付けられているとは思わないため、この質問は DI に詳しい人なら誰でも答えることができると思います。Ninject (C# フレームワーク) に関する本でこの用語が使用されているのを見たことがあります。
java - リクエストごとに注入されない per-lookup-injectable を持つ ContainerRequestFilter
スタンドアロンの Grizzly Web サーバーで Jersey 2 を使用しています。HK2 は CDI に使用されます。@PerLookup
-scope を jersey に注入したサービスを取得したいと思いContainerRequestFilter
ます。
サービス:
フィルター:
私の問題はこれです:
- フィルタは(起動時に)一度インスタンス化されます
- サービスは 1 回注入されます (フィルターの起動時)
- そこから下流のすべてがシングルトンスコープで効果的に起こっています
質問: リクエストごとにサービスを挿入するにはどうすればよいですか?
アップデート
使用する提案されたアプローチ@Inject javax.inject.Provider<SessionManager> sessionManagerProvider
は私には論理的に意味がありますが、 sessionManagerProvider.get()
null を返します。
hk2 serviceLocator は、inhabitant-generator によって設定されます。それは報告します:
また、明示的なバインディングを追加すると、次のようにも見つかります。
2回目の更新
私は 2 つのサービス ロケーターを使用しています。ジャージーが作成するもの。それらはBridgingInjectionResolverを介して結合されます。
Jerseyのサービスロケータに明示的なバインディングを追加すると、@peeskiletの応答が機能します。バインディングを他のサービス ロケーターに追加すると、上記の結果になります ( sessionManagerProvider.get()
null を返します)。
java - インターフェイス タイプと InjectionResolver を備えた HK2 ファクトリ
私の使用例では、DAO の実装をインスタンス化できるカスタム アノテーションを開発する必要があります。
だから私はインターフェースを持っています:
およびリソース構成の実装:
私は工場の実装にこだわっています:
そしてもちろん、ここにIDAOの実装があります:
私が取得したい結果は次のとおりです。
実際の実装を提供する方法で、ファクトリをインジェクション リゾルバーに接続する方法はありますか? hk2 はこれを行う手段を提供していますか?
編集済みIDAO インターフェースの複数の実装を持つことができます...たとえば、次の場合:
私は次のような2番目の実装を取得できるはずです:
parent - HK2 InstantiationService ネストされた注入
CDI エンジンとして hk2 を使用しています。以下のコードのように、2 つの入れ子になった注入があります。
Factory クラスは次のとおりです。
私は両方の工場を次のようにバインドしました: bindFactory(SonFactory.class).to(Son.class).in(RequestScoped.class) bindFactory(GrandSonFactory.class).to(GrandSon.class).in(RequestScoped.class)
ここで、InstantionService.getInstantiationData() を使用して、GrandSon クラス内の呼び出し元の親から記述子データを取得したいだけです。特に、被注入者の親を検査する呼び出し元の Root クラスまで戻る必要があります。Son クラスの factory.provide メソッドからデータを取得できますが、grandSon クラスから有効な getInstantiationdata() を取得できません。コードのどこが間違っていますか?
dependency-injection - HK2 カスタム アノテーション アノテーションはコンストラクターでは許可されていません
HK2 インジェクション フレームワークを使用して、クラス内にカスタム オブジェクトをインジェクトするためのカスタム アノテーションを開発しました。
オブジェクトにクラス変数として注釈を付けると、すべて正常に機能します。
ここで、オブジェクトをコンストラクターパラメーターとして挿入する必要があります。つまり、次のようになります。
私のインジェクションリゾルバーでは、次をオーバーライドしました:
true を返すために。
問題は、プロジェクトをビルドしようとすると、次のエラーが表示されることです。
私は何が欠けていますか?
java - 埋め込まれたグリズリー ジャージー アプリケーションのメイン メソッドで HK2 を使用してオブジェクトを挿入する方法
Jersey を使用して REST マイクロ サービスを設計しているときに、catch 22 の問題が発生しました。デプロイの複雑さを軽減するために、グリズリー サーバーが組み込まれたアプリケーションを作成しようとしています。したがって、グリズリー サーバーを作成するメイン メソッドがあります。サーバーのブートストラップ手順の前にオブジェクトを注入する必要があります。
私のメインは次のようになります。
ServiceLocator
アプリ オブジェクトを挿入できるように、シングルトン インスタンスを取得するにはどうすればよいですか?
私は試した:
ただし、すべてを 2 回バインドする必要がありますAbstractBinder
(既に で実行しているためResourceConfig
)。