私は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 +でのみサポートされています)
助けてもらえますか?私はServiceLoaderで何か似たようなことをしようとしていますが、noobieの問題はありますか? http://stackoverflow.com/questions/28983997/java-cant-get-a-working-serviceloader – tommed