java - 有人将 ServiceLoader 与 Guice 一起使用过吗?

标签 java dependency-injection guice

我一直想通过我们的应用程序 + 构建系统在更大规模上进行尝试,但更高的优先级一直将其推到次要位置。这似乎是一种加载 Guice 模块的好方法,并且避免了对“硬编码配置”的常见提示。个别配置属性很少会自行更改,但您几乎总是会有一组配置文件,通常用于不同的环境(调试、生产等)。

ServiceLoader 允许您提取定义为给定类型的服务的所有实现的列表。将其与 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-servlet 项目中的动态 servlet 加载器):

import com.google.inject.servlet.ServletModule;

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

服务(打包为模块)将打包在单独的 jar 文件中。在每个类中,您将在元数据中定义类:

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

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

由于我们使用 Maven,我们认为这将是理想的,因为我们可以通过配置文件依赖项在运行时引入不同的实现。有人像这样使用 Guice 吗?

如果没有,请随意使用此示例并查看它如何为您工作。 (只有JDK6+才支持ServiceLoader)

最佳答案

我们在工作中几乎就是这样做的。由于一些内部限制,我们目前停留在 Java 5 中,因此我们使用 Service Provider 的方式有所不同(因为像您提到的那样,直到 Java 6 才可以访问 ServiceLocator),但它的工作原理基本相同。

我记得在某处读到过,这是 Guice 开发人员推荐的首选方式之一,尽管他们希望保持这种方式的灵 active 。

关于java - 有人将 ServiceLoader 与 Guice 一起使用过吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/902639/

相关文章:

java - Chromedriver 新更新后,单击方法在 Salesforce 网页上不起作用。用同样的方法如何处理?

java - 如何强制缓存所有 HTTP 响应?

java - HashMap只存储最后N个元素

c# - 在 DI 注入(inject)容器中注册受约束的 MediatR 管道行为

java - Maven 在构建我们自己的 custom.jar 时发布和使用第三方运行时 jar

java - 用 guice 覆盖 Jersey 资源

android - Roboguice 在 JUnit 测试中不工作

java - System.LoadLibrary() 找不到库

c# - 深层对象图中的动态依赖关系——我做错了什么?

具有 Guice 注入(inject)字段和非注入(inject)字段的 Java 构造函数