我在类中有一个字段,用于存储注入到类中的对象的映射。如何填充这个字段?
此字段主要用于查找,因此有资格成为静态最终变量(对吗?)?
示例:
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;
}
}
谢谢。
答案 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一起工作很好。