java - 吉斯 : How to customize the bindings of a third-party Module?

标签 java guice

假设我有一个 ThirPartyModule 第三方模块,它绑定(bind)了许多组件,然后我可以在我的应用程序中使用它们:

Injector guice = Guice.createInjector(new MyAppModule(), new ThirPartyModule());

如果我想修改该模块中某些绑定(bind)使用的实现类,最好的方法是什么?

例如,假设 ThirPartyModule 执行该绑定(bind):

bind(WidgetInterface.class).to(DefaultWidgeImpl.class).in(Scopes.SINGLETON);

并且我希望能够将 DefaultWidgeImpl 类更改为 MyWidgetImpl 类。我知道我可以使用一个覆盖模块,然后简单地重新绑定(bind) WidgetInterface 键。但是,如果 ThirPartyModule 使用相同的 Widget 实现绑定(bind)很多事物会怎样呢?我可能不想重新绑定(bind)它们!

因此,我试图找到最好的解决方案,以便能够指定要使用的实现类,而无需重新绑定(bind)依赖于它的所有组件。

我猜 ThirPartyModule 可以首先为实现类创建一个 getter 方法:

bind(WidgetInterface.class).to(getWidgetImpClass()).in(Scopes.SINGLETON);

protected Class<? extends WidgetInterface> getWidgetImpClass() {
    return DefaultWidgeImpl.class;
}

然后应用程序可以重写 getWidgetImpClass() 方法:

Injector guice = Guice.createInjector(new MyAppModule(), new ThirPartyModule() {
    @Override
    protected Class<? extends WidgetInterface> getWidgetImpClass() {
        return MyWidgetImpl.class;
    }   
});

我还考虑将实现类传递给模块的构造函数:

Injector guice = Guice.createInjector(new MyAppModule(), new ThirPartyModule(MyWidgetImpl.class));

我想知道是否有公认的模式来定制此类第三方模块?假设我可以要求以特定方式编写模块(如果这有助于自定义模块)。

最佳答案

我会这样做:

public class ThirdPartyModule extends AbstractModule {
    @Override
    protected void configure() {
        // CoolWidget --
        //              \
        //               > WidgetInterface -> DefaultWidgetImpl
        //              /
        // AwesomeWidget

        OptionalBinder.newOptionalBinder(binder(), WidgetInterface.class)
                .setDefault()
                .to(DefaultWidgetImpl.class);

        bind(CoolWidget.class).to(WidgetInterface.class);
        bind(AwesomeWidget.class).to(WidgetInterface.class);
        // etc.
    }
}

public class MyAppModule extends AbstractModule {
    @Override
    protected void configure() {
        OptionalBinder.newOptionalBinder(binder(), WidgetInterface.class)
                .setBinding()
                .to(CustomWidgetImpl.class);
    }
}

通过使所有绑定(bind)间接通过 WidgetInterface 键,您只需覆盖该一个绑定(bind)即可。

关于java - 吉斯 : How to customize the bindings of a third-party Module?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40996738/

相关文章:

java - 从 mysql 网站检索时未选择数据库

java - 在java中创建一个字符串列表,其中每个字符串都是元组列表(作为值)的键

java - Google Guice Web 应用程序中的 HttpSessionListener

java - 未在 App Engine 上调用 Servlet 过滤器

Hadoop 作业 : Error injecting constructor, JAXBException

java - 使用 roboguice 注入(inject)泛型

java - Java 中的 OpenCv : DescriptorExtractor is deprecated. 我该用什么代替?

c# - 对于良好的编码实践,如果我们已经在方法 1 中验证并且方法 1 将该数据传递给方法 2,我们是否仍然需要在方法 2 中再次验证数据?

java - 是什么导致一个类的变量受到另一类的影响?

Scala - 当依赖类也使用相同的泛型类型时,使用 guice 注入(inject)泛型类型