2009-05-23 12 views
13

私はapp + buildシステムでこれをもっと大きなスケールで試してみたいと思っていますが、より高い優先順位はそれをバックバーナーに押し付け続けています。これはGuiceモジュールを読み込むための良い方法のようであり、 "ハードコーディングされた設定"に関する共通の苦情を避けるものです。個々の設定プロパティはほとんど変わっていませんが、ほとんどの場合、通常は異なる環境(デバッグ、プロダクションなど)のプロファイルがあります。Guiceと一緒にServiceLoaderを使用した人はいますか?

ServiceLoaderを使用すると、特定のタイプのサービスとして定義されているすべての実装のリストを取得できます。

import com.google.inject.servlet.ServletModule; 

public class ServletLoader extends GuiceServletContextListener { 
    @Override 
    protected final Injector getInjector() { 
     return Guice.createInjector(ModuleLoader.of(ServletModule.class); 
    } 
} 

サービス(モジュールとしてパッケージ化)のようになります。(Guiceのサーブレットプロジェクトの動的サーブレット・ローダとして)

import java.util.ServiceLoader; 

import com.google.inject.AbstractModule; 
import com.google.inject.Module; 

public class ModuleLoader<M extends Module> extends AbstractModule { 

    private final Class<M> type; 

    public ModuleLoader(Class<M> type) { 
     this.type = type; 
    } 

    public static <M extends Module> ModuleLoader<M> of(Class<M> type) { 
     return new ModuleLoader<M>(type); 
    } 

    @Override 
    protected void configure() { 
     ServiceLoader<M> modules = ServiceLoader.load(type); 
     for (Module module : modules) { 
      install(module); 
     } 
    } 
} 

使用例:Guiceのと一緒にこれを置く、あなたが終わります別のjarファイルにパッケージ化されています。それぞれ1以内にあなたがメタデータ内のクラス(複数可)を定義したい:私たちはMavenを使っているので

Within servlets.jar: META-INF/services/com.google.inject.Module 

com.example.webapps.MyServletModuleA 
com.example.webapps.MyServletModuleB 

を、私たちは、プロファイルの依存関係を経由して、実行時に異なる実装に引っ張る可能性があるので、これは理想的だと思います。 Guiceを使っている人は誰ですか?

この例を使用して、それがどのように機能するかを自由に感じてください。 (ServiceLoaderはJDK6 +でのみサポートされています)

+0

助けてもらえますか?私はServiceLoaderで何か似たようなことをしようとしていますが、noobieの問題はありますか? http://stackoverflow.com/questions/28983997/java-cant-get-a-working-serviceloader – tommed

答えて

3

私はこれを私の仕事でほぼ正確にやっています。私たちは現在、いくつかの内部的な制限のためにjava 5に執着しているので、Service Providerを使用して少し違った方法で扱います(上記のjava 6まではServiceLocatorにアクセスできないためです)。

これはGuiceの開発者が推奨する方法の1つでしたが、柔軟性のためにこれを開いたままにしておきたいと思いました。

1

私は恐れていたので、私はそれを使用しませんでした。同じインターフェースを2回バインドすることは不可能であるため、モジュールを極端に小さくしなければなりません。私の問題は、別のjarのインタフェース/クラス/列挙型/何を使用したいのか、そのJarファイルがサービス/ファイルを定義したのかということです。なぜなら、JARファイルの内容をモジュール。

私の懸念がはっきりしていることを願っています。

0

"同じインターフェイスを2度バインドすることが不可能なためです。"

これは間違いです。 GuiceのMultibinderには、同じインタフェースの異なる実装で動作する方法があり、おそらく異なるモジュールにバインドされています。

Mark Renouf(彼のModuleLoaderは実際より優れています)よりも実際の読み込み方法が少し異なりましたが、私のブログ記事ではこのアプローチが適用できる環境(プラグイン)ポイントは次のようになります。

Guice 2.0 Multibinder + Java ServiceLoader = Plugin mechanism

関連する問題