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

时间:2016-12-19 21:27:29

标签: java dependency-injection guice

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

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

示例:

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. 地图构造可以在静态块中完成吗?这种方法难看吗?
  2. 首先发生什么 - 依赖注入或静态代码块?
  3. 什么是最好的方法,以便这个类也可以测试。
  4. 谢谢。

1 个答案:

答案 0 :(得分:1)

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

以下是定义地图绑定的模块的外观:

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
@Named("MyBindings")
private Map<String, Object> cache;

如果您真的担心这种非静态特性,可以将地图包装在单件组件绑定中。

A1:是的,它可以。不一定非必要。

A2:静态代码块。

A3:不是静态块:-)多绑定器是可接受的IMO。 Guice,JUnit和Mockito一起工作很好。