我在一个类中有一个字段,用于存储注入(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;
}
}
- map 构建可以在静态 block 中完成吗?这个方法丑吗?
- 首先发生什么 - 依赖注入(inject)或静态代码块?
- 使该类也可测试的最佳方法是什么。
谢谢。
最佳答案
如果你想使用依赖注入(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/