java - 我如何重写此代码片段,以便我不手动/显式调用注入(inject)器?

标签 java guice anti-patterns

在阅读了 Google Guice 的许多代码示例后,我看到很多代码如下所示:

public class MyModule implements Module {
    public void configure(Binder binder) {
        binder.bind(Service.class).to(ServiceImpl.class);
    }
}

public class Widget {
    private Injector injector = Guice.createInjector(new MyModule());

    public void doSomething() {
        Service service = injector.getInstance(Service.class);
        service.run();
    }
}

据我了解,显式调用 IoC 机制的代码(例如 Guice 中的 injector.getInstance(Class<T>) 或 Spring 中的 appContext.getBean(String))确实是 IoC 反模式

在这些示例中,我注意到没有提及 @Inject@ImplementedBy注释,我相信这是 Guice 针对这种反模式的解决方法。

如何重写上面的代码片段,以便我不手动/显式调用注入(inject)器?我希望配置所有内容,以便执行到 doSomething() 时方法,应用程序已经“知道”什么 Service我们将使用的实现...

提前致谢!

最佳答案

通过将 Guice 添加到模块并在需要时使用注释注入(inject)它,让 Guice 了解您的 Widget

您需要将 Service 添加到其构造函数中:

public class Widget {

    private final Service service;

    @Inject
    public Widget(Service service) {
        this.service = service;
    }
}

关于java - 我如何重写此代码片段,以便我不手动/显式调用注入(inject)器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8853044/

相关文章:

java - 根据构造函数参数实例化特定的子类型

c# - 编写这样的代码是否有任何反模式名称?

Python函数的参数默认值是从另一个模块导入的

jsp - 在属性文件中放置标签等是否是一种反模式(与 JSP 和 Web 开发相关)

java - 如何将数学工作拆分为工作线程 Java

java - 如何在android中将double转换为string

java - 如何正确构建包含名为 *(星号)的属性的 JSON

需要 Java 正则表达式

java - @Nullable 似乎不适用于 @AssistedInject

java - 更改 Guice 参数配置