java - 如何在 guice 中使用依赖注入(inject)字段进行静态最终字段初始化?

标签 java dependency-injection guice

我在一个类中有一个字段,用于存储注入(inject)到该类中的对象的映射。如何填充该字段?

这个字段将主要用于查找,因此有资格成为静态最终变量(对吧?)?

示例:

mapOfObjects.put("foo",x);
mapOfObjects.put("bar",y);

示例代码

public class A {
    private ClassX x;
    private ClassY y;

    private final Map<String, Object> mapOfObjects = new HashMap<>();

    public void someMethod() {
        Object obj = mapOfObjects.get("x");
        //do something fancy with obj
    }

    @Inject
    public void setX(ClassX x) {
        this.x = x;
    }

    @Inject
    public void setY(ClassY y) {
        this.y = y;
    }
}
  1. map 构建可以在静态 block 中完成吗?这个方法丑吗?
  2. 首先发生什么 - 依赖注入(inject)或静态代码块?
  3. 使该类也可测试的最佳方法是什么。

谢谢。

最佳答案

如果你想使用依赖注入(inject),你的 map 不是太大或者你的组件不一定是有状态的,那么你可以尝试Guice Multibinidngs和一个非静态字段。您将需要对 com.google.inject.extensions:guice-multibindings 的额外依赖,因为这是对核心 guice 的扩展,支持 map 和 set 绑定(bind)。​​

定义映射绑定(bind)的模块可能如下所示:

class SampleModule extends AbstractModule
{
    @Override
    protected void configure()
    {
        MapBinder<String, Object> templatesBinder = MapBinder.newMapBinder(
                        binder(), 
                        String.class, 
                        Object.class, Names.named("MyBindings"));

        templatesBinder.addBinding("A").toInstance(1);
        templatesBinder.addBinding("B").toInstance("Hi!");
        templatesBinder.addBinding("B").toInstance(Boolean.FALSE);
    }
}

注入(inject) map 的方式如下所示:

@Inject
@Named("MyBindings")
private Map<String, Object> cache;

如果您真的担心它的非静态性质,您可以将 map 包装在单例组件绑定(bind)中。

A1:是的,可以。不一定。

A2:静态代码块。

A3: 不是静态 block :-) 多绑定(bind)器是可接受的 IMO。 Guice、JUnit 和 Mockito 可以很好地协同工作。

关于java - 如何在 guice 中使用依赖注入(inject)字段进行静态最终字段初始化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41231283/

相关文章:

java - 在catch block 中抛出异常没有用吗?

dependency-injection - Caliburn.Micro 和简单注入(inject)器 - InjectProperties 已弃用 - 如何 BuildUp()?

java - 如何测试 Guice 注入(inject)?

java - 使用 Builder 模式为客户端库注入(inject) Guice

java - Java获取MQ队列统计信息

Java Spring SQL如何将3个表组合/连接成一个

c# - 无法加载文件或程序集 Microsoft.Extensions.DependencyInjection.Abstractions, Version=5.0.0.0

c# - 获取ninject的具体实例

java - 如何使用 Google Guice 绑定(bind)不同的接口(interface)?

java - 变量声明中的函数调用