¿Alguien ha usado ServiceLoader junto con Guice?

Sigo queriendo probar esto a mayor escala con nuestro sistema de compilación + aplicación, pero las prioridades más altas siguen empujándolo a un segundo plano. Parece una buena manera de cargar módulos Guice y evita la queja común sobre la "configuración codificada". Las propiedades de configuración individuales rara vez cambian por sí mismas, pero casi siempre tendrá un conjunto de perfiles, generalmente para diferentes entornos (depuración, producción, etc.).

ServiceLoader le permite obtener una lista de todas las implementaciones definidas como un servicio para un tipo dado. Al poner esto junto con Guice, terminas con:

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);
        }
    }
}

Ejemplo de uso (como un cargador de servlets dinámico en un proyecto de servlet guice):

import com.google.inject.servlet.ServletModule;

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

Los servicios (empaquetados como módulos) se empaquetarían en archivos jar separados. Dentro de cada uno definiría la (s) clase (s) en los metadatos:

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

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

Dado que usamos Maven, creemos que esto sería ideal, ya que podríamos implementar diferentes implementaciones en tiempo de ejecución a través de dependencias de perfil. ¿Alguien está usando Guice así?

Si no, no dudes en usar este ejemplo y ver cómo te funciona. (ServiceLoader solo es compatible con JDK6 +)

Respuestas a la pregunta(6)

Su respuesta a la pregunta