2017-02-21 10 views
1

私は最近、7年後にJavaで作業を開始しました.Netを間違えてしまったのですが、C#が大好きです。Guiceを使用してすべての `サービス 'を自動的にバインドします

私はWindsorとSimpleInjector(私は完全に愛しています)とJavaでGuiceを使用したいと思っています。

私が取り組んでいるプロジェクトは、IOCを使用しないレガシープロジェクトです。つまり、それはJersey Project(非機能HK2 IOC)です。

私の質問では、C#ではすべてのインターフェイスと具体的な実装をアプリケーション起動時にリフレクションを使用して実行時に登録しました。

私はGuiceのドキュメントを読んだので、そうする例は見つからず、JITバインディングは実際には理解されていません。

これは可能ですか?それはベストプラクティスですか?

どれ例または方向は非常に参考になる

これはよりJavaやGuiceの中で行うことが少し難しいです、あなたに

+0

機能していないHk2をどうやって意味しますか? Hk2はかなり機能的です... Hk2には、@ServiceとServiceLocatorのポピュレータを使用した自動サービス登録のための堅牢なフレームワークがあります。 – jwells131313

+0

@ jwells131313私の意図では、私たちのシステムのHK2は動作していません。 – guyl

答えて

3

ありがとう(私は手動ですべてのバインディングを書くことは右のコースであるとは思いません)他のプラットフォームでは:Javaクラスローダーは、クラスパス上のすべてのクラスまたは実装を列挙するよりも、finding classes by their package/name with fallbacks用に設計されています。所定の条件(例:ReflectionsまたはGoogle Guava)で後者を実行するライブラリソリューションがいくつか存在しますが、現在のClassLoaderおよびその親を通して利用可能なすべてのクラスを反復することは理論的には無限で、URLClassLoaderおよび同様のネットワークベースのクラスローダー。

これは、Guiceを使用しているかどうかに関係なく、アプリケーションに公開するためにインターフェイスと実装を明示的にリストするのが一般的であり、しばしば必要となります。

参照:Guice SPIを通じてあなたはより多くを持っているかもしれませんが

は結果的に、 "MyStartableServiceを実装するすべての到達可能なクラスを起動する" のようなタスクを達成することは困難です私はGuiceからリクエストされたすべてのMyStartableServiceを返します。また、JavaのSPI framework(Javaの場合はServiceLoader)を使用して適切なサービスのシャードまたは分散リストを作成し、モジュール内のbindを呼び出してGuiceに提供することもできます。 (OlivierはコメントにAutoServiceを適切に示唆しているため、ServiceLoaderの電源となるメタデータファイルを簡単に生成できます)。

+1

もしあなたがSPIフレームワークのやり方で行くなら、Googleの[AutoService](https://github.com/google/auto/tree/master/service)を試してみてください。これは人生を節約するものです。 javaファイルの場合、小さなアノテーションを追加するだけで、すべてが自動的に行われます。 –

+0

詳細な回答ありがとうございました 私は次に行動する方法を理解しようとします – guyl

関連する問題