Java GUI使用不同的提供程序实例化不同的类
我有两项活动Java GUI使用不同的提供程序实例化不同的类,java,dependency-injection,guice,Java,Dependency Injection,Guice,我有两项活动 public class GetActivity { ChildClass childclass; @Inject public GetActivity(ChildClass childClass) { this.childClass = childclass; } String id = childClass.get(id); .... } public class SaveActivity {
public class GetActivity
{
ChildClass childclass;
@Inject
public GetActivity(ChildClass childClass)
{
this.childClass = childclass;
}
String id = childClass.get(id);
....
}
public class SaveActivity
{
ChildClass childclass;
@Inject
public SaveActivity(ChildClass childClass)
{
this.childClass = childclass;
}
childClass.save(id);
....
}
ChildClass是具有以下方法的接口
public interface ChildClass
{
String get(id);
void save(id);
}
其实施方式如下:
public class ChildClassImpl implements ChildClass
{
String storage;
public ChildClassImpl(String storage)
{
this.storage =storage;
}
String get(Id)
{
someOtherObject.get(id, storage);
}
void save(id)
{
someOtherObject.save(id, storage);
}
}
我编写了将返回ChildClass方法的提供者
public class ChildClassProvider1 implements Provider<ChildClass>
{
@Override
public ChildClass get()
{
ChildClass childClass = new ChildClass("hello");
}
}
public class ChildClassProvider2 implements Provider<ChildClass>
{
@Override
public ChildClass get()
{
ChildClass childClass = new ChildClass("secondHello");
}
}
公共类ChildClassProvider1实现提供程序
{
@凌驾
公共子类get()
{
ChildClass ChildClass=新的ChildClass(“你好”);
}
}
公共类ChildClassProvider2实现提供程序
{
@凌驾
公共子类get()
{
ChildClass ChildClass=新的ChildClass(“secondHello”);
}
}
我想确保GetActivity和SaveActivity是使用提供程序ChildClassProvider1初始化的,但是其他类应该使用ChildClassProvider2。如何使用guice实现这一点?有几个选项,具体取决于您希望将此需求嵌入代码的难度 首先,通过模块中提供的方法:
class YourModule extends AbstractModule {
@Override protected void configure() {
bind(ChildClass.class).toProvider(ChildClassProvider1.class);
}
@Provides SaveAction saveAction(ChildClassProvider2 provider) {
return new SaveAction(provider.get());
}
}
其次,通过绑定注释
或者,提供绑定注释:
@BindingAnnotation @Retention(RUNTIME)
@interface YourAnnotation {}
然后:
第二个选项是“更硬地烘焙”,因为您必须在代码中添加绑定注释;但是它不那么脆弱(在这个意义上,您不必显式地调用构造函数),并且感觉“更加guice-y”
第一种选择是保持它的松散性,如果您希望在某些情况下能够以不同的方式进行配置。我不理解您的第一种方法,您可以详细说明一下。
// Ctor of SaveActivity.
@Inject
public SaveActivity(@YourAnnotation ChildClass childClass) { ... }
// In your module:
bind(ChildClass.class).annotatedWith(YourAnnotation.class)
.toProvider(ChildClassProvider2.class);