Je continue à vouloir essayer ceci à plus grande échelle avec notre système de construction app +, mais des priorités plus élevées continuent de le pousser au second plan. Cela semble être un bon moyen de charger les modules de Guice et d'éviter les plaintes fréquentes concernant la "configuration codée en dur". Les propriétés de configuration individuelles changent rarement d'elles-mêmes, mais vous aurez presque toujours un ensemble de profils, généralement pour des environnements différents (Debug, Production, etc.). ServiceLoader vous permet d'extraire une liste de toutes les implémentations définies en tant que service pour un type donné. Mettre cela avec Guice, vous vous retrouvez avec:Est-ce que quelqu'un a utilisé ServiceLoader avec 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);
}
}
}
Exemple d'utilisation (comme chargeur de servlet dynamique dans un projet Guice-servlet):
import com.google.inject.servlet.ServletModule;
public class ServletLoader extends GuiceServletContextListener {
@Override
protected final Injector getInjector() {
return Guice.createInjector(ModuleLoader.of(ServletModule.class);
}
}
Les services (emballés sous forme de modules) seraient emballé dans des fichiers de pot séparés. Au sein de chacun que vous souhaitez définir la classe (s) dans la méta-données:
Within servlets.jar: META-INF/services/com.google.inject.Module
com.example.webapps.MyServletModuleA
com.example.webapps.MyServletModuleB
Depuis que nous utilisons Maven, nous pensons que ce serait idéal que nous pourrions tirer dans différentes implémentations à l'exécution via des dépendances de profil. Est-ce que quelqu'un utilise Guice comme ça? Si ce n'est pas le cas, n'hésitez pas à utiliser cet exemple et voyez comment cela fonctionne pour vous. (ServiceLoader n'est pris en charge que dans JDK6 +)
Pouvez-vous aider? J'essaye de faire quelque chose de semblable mais ayant un problème noobie avec ServiceLoader? http://stackoverflow.com/questions/28983997/java-cant-get-a-working-serviceloader – tommed