首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >有没有人和Guice一起使用过ServiceLoader?

有没有人和Guice一起使用过ServiceLoader?
EN

Stack Overflow用户
提问于 2009-05-23 22:27:48
回答 3查看 4.8K关注 0票数 16

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

ServiceLoader允许您获取定义为给定类型的服务的所有实现的列表。将这一点与Guice结合在一起,您将得到:

代码语言:javascript
复制
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加载器):

代码语言:javascript
复制
import com.google.inject.servlet.ServletModule;

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

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

代码语言:javascript
复制
Within servlets.jar: META-INF/services/com.google.inject.Module

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

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

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

EN

回答 3

Stack Overflow用户

发布于 2009-08-08 03:15:32

在我的工作中,我们几乎就是这么做的。由于一些内部限制,我们目前被困在Java5中,所以我们使用服务提供者的方式有点不同(因为直到Java6才能访问ServiceLocator,就像你提到的那样),但它本质上是一样的。

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

票数 3
EN

Stack Overflow用户

发布于 2010-01-16 08:40:18

我已经考虑过这种方式,但我没有使用它,因为我害怕我必须保持我的模块非常小,因为不可能绑定相同的接口两次。我的问题是,如果我想使用来自另一个jar的接口/类/枚举/任何东西,而那个jar定义了一个服务/*文件,我就失败了,因为我不能使用jar的内容,而不将其作为模块加载。

我希望我的担忧是明确的。

票数 1
EN

Stack Overflow用户

发布于 2011-01-28 03:49:21

“因为不可能将同一个接口绑定两次。”

这确实是错误的!使用Guice的Multibinder,可以使用同一接口的不同实现,可能绑定在不同的模块中。

对于实际加载,我得到了一个与Mark Renouf略有不同的解决方案(他的ModuleLoader看起来确实更好),但我的博客文章可能会显示更多关于这种方法适用的环境(插件)和扩展点的内容:

Guice 2.0 Multibinder + Java ServiceLoader = Plugin mechanism

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/902639

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档