最近考虑在项目中使用guice,但是在替换一些Design patterns时遇到一些问题,特来这里向大家请教。
Guice的文档实在是太简单了,基本上就是几个简单的对象来回映射,对实际开发基本上没什么用。网上的例子也基本上停留在1+1=2的水平。
下面是我遇到的问题:
1. 如何在运行时态注入同一个对象的不同的实例?
首先一个POJO:
然后使用它:
我的问题是,Foo对象根据属性不同可以生成4中不同的实例,那么如何能够在runtime动态注入不同的实例呢?
另外,使用@Name注释可以绑定不同的实例,但是似乎无法动态绑定,而且如果类属性比较多的话,把每一种可能的实例都绑定起来,岂不是要吐血了。
2. 如何在runtime动态绑定任意对象?
这个例子里,Foo对象需要使用任意类型的对象实例,如何用Guice动态注入?类型为Object的对象实例为无限多,用@Name应该是解决不了问题了。
3. 如何解决传递对象问题?
在API调用过程中,借助方法参数,可以将某一个对象实例在几个对象之间来回传递,而且它也不是singelton,这个被传递的对象不一定是Value Object。如果使用Guice的话如何实现?
4. 如何解决动态扩展的问题?
为了便于理解,我举个简单的例子,MVC模式大家应该都很清楚,假如一个Control对应一个Model的话,用Guice可以完美实现。但是如果一个Control可以控制多个Model,而Model的数量是动态的,也就是说Control需要在runtime创建新的Model,同时还要保存已经存在的Models。针对这种情况,如何使用Guice注入?
5. 如何注入String?
我刚刚开始接触Guice,估计用过Guice的朋友能够马上回答这个问题。先举个例子:
在使用Foo对象时,如何动态注入不同的String值?
其实这个问题和前面的几个问题类似,但是String是一个比较特殊的对象,所以单独拿出来提问。
6. 如何解决类关联的问题。例如:
如何保证使用guice注入后,bar中的foo是创建Bar的那个Foo对象实例?
Guice的文档实在是太简单了,基本上就是几个简单的对象来回映射,对实际开发基本上没什么用。网上的例子也基本上停留在1+1=2的水平。
下面是我遇到的问题:
1. 如何在运行时态注入同一个对象的不同的实例?
首先一个POJO:
public class Foo {
private boolean a;
private boolean b;
@inject
public Foo(boolean a, boolean b) {
this.a = a;
this.b = b;
}
}
然后使用它:
public class FooContainer {
@inject
private Foo foo;
}
我的问题是,Foo对象根据属性不同可以生成4中不同的实例,那么如何能够在runtime动态注入不同的实例呢?
另外,使用@Name注释可以绑定不同的实例,但是似乎无法动态绑定,而且如果类属性比较多的话,把每一种可能的实例都绑定起来,岂不是要吐血了。
2. 如何在runtime动态绑定任意对象?
public class Foo {
@inject
private Object o;
}
这个例子里,Foo对象需要使用任意类型的对象实例,如何用Guice动态注入?类型为Object的对象实例为无限多,用@Name应该是解决不了问题了。
3. 如何解决传递对象问题?
在API调用过程中,借助方法参数,可以将某一个对象实例在几个对象之间来回传递,而且它也不是singelton,这个被传递的对象不一定是Value Object。如果使用Guice的话如何实现?
4. 如何解决动态扩展的问题?
为了便于理解,我举个简单的例子,MVC模式大家应该都很清楚,假如一个Control对应一个Model的话,用Guice可以完美实现。但是如果一个Control可以控制多个Model,而Model的数量是动态的,也就是说Control需要在runtime创建新的Model,同时还要保存已经存在的Models。针对这种情况,如何使用Guice注入?
5. 如何注入String?
我刚刚开始接触Guice,估计用过Guice的朋友能够马上回答这个问题。先举个例子:
public class Foo {
@inject
private String a;
public Foo(String a) {
this.a = a;
}
}
在使用Foo对象时,如何动态注入不同的String值?
其实这个问题和前面的几个问题类似,但是String是一个比较特殊的对象,所以单独拿出来提问。
6. 如何解决类关联的问题。例如:
public class Foo {
private Bar bar;
public Foo() {
bar = new Bar(this);
}
public class Bar {
private Foo foo;
public Bar(Foo foo) {
this.foo = foo;
}
如何保证使用guice注入后,bar中的foo是创建Bar的那个Foo对象实例?