Ich möchte das immer in größerem Maßstab mit unserem App + Build-System versuchen, aber höhere Prioritäten drängen es immer weiter zurück. Es scheint eine nette Möglichkeit zu sein, Guice-Module zu laden und vermeidet die übliche Beschwerde über "hart codierte Konfiguration". Die einzelnen Konfigurationseigenschaften ändern sich selten von selbst, aber Sie haben fast immer eine Reihe von Profilen, normalerweise für verschiedene Umgebungen (Debug, Produktion usw.).Hat jemand ServiceLoader zusammen mit Guice verwendet?
Mit ServiceLoader können Sie eine Liste aller Implementierungen abrufen, die als Service für einen bestimmten Typ definiert sind. Putting diese zusammen mit Guice, Sie am Ende mit:
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);
}
}
}
Anwendungsbeispiel (als dynamische Servlet-loader in einem guice-Servlet-Projekt):
import com.google.inject.servlet.ServletModule;
public class ServletLoader extends GuiceServletContextListener {
@Override
protected final Injector getInjector() {
return Guice.createInjector(ModuleLoader.of(ServletModule.class);
}
}
Die Leistungen (als Module verpackt) wären in separaten JAR-Dateien verpackt. Innerhalb jeder Sie die Klasse definieren würde (n) in der Meta-Daten:
Within servlets.jar: META-INF/services/com.google.inject.Module
com.example.webapps.MyServletModuleA
com.example.webapps.MyServletModuleB
Da wir Maven verwenden, denken wir, dies wäre ideal, da wir in verschiedenen Ausführungen zur Laufzeit über Profil Abhängigkeiten ziehen konnte. Benutzt jemand Guice so?
Wenn nicht, können Sie dieses Beispiel verwenden und sehen, wie es für Sie funktioniert. (ServiceLoader wird nur in JDK6 + unterstützt)
Können Sie helfen? Ich versuche etwas Ähnliches zu machen, habe aber ein Problem mit ServiceLoader? http://stackoverflow.com/questions/28983997/java-cant-get-a-working-serviceloader – tommed