GWT延迟绑定和依赖注入

时间:2013-08-24 03:27:52

标签: java gwt dependency-injection

假设我有类似的东西

接口

Interface IsInterface {}

实施类

public ConcreteClassA implements IsInterface {

 InjectorA a, InjectorB c, InjectorC c;

 @Inject
 ConcreteClassA(InjectorA a, InjectorB b, InjectorC c) {
   this.a = a;
   this.b = b;
   .....
 }

}

public ConcreteClassB implements IsInterface {

 InjectorA a, InjectorB B, InjectorC C;

 @Inject
 ConcreteClassB(InjectorA a, InjectorB b, InjectorC c) {
   this.a = a;
   this.b = b;
   .....
 }

}

..然后我决定在我的GWT module.gwt.xml

中使用GWT延迟绑定
//Pseudo XML Configuration
if (type is IsInterface) 
   if toggle == A then use ConcreteClass A else use ConcreteClassB

现在,当我尝试运行它时。它不起作用,因为GWT期望我的Concrete Class A和B有默认的0构造函数。所以,我在我的具体课上尝试了以下内容

 @Inject
 InjectorA a; 
 @Inject
 InjectorB b;
 @Inject
 InjectorC c;

 ConcreteClassA() {

 }

绕过0构造函数错误但是当我尝试使用a,b或c时它给了我NullPointerException。使它工作的一种方法是删除@Inject并像这样使用GWT.create()

 InjectorA a, InjectorB b, InjectorC c;

 ConcreteClassA() {
   this.a = GWT.create(InjectorA.class);
   .....
   .....
 }

这会起作用,但是如果我的InjectorA,InjectorB和InjectorC没有0构造函数并且在很大程度上依赖于@inject。我不想通过所有类来创建0构造函数并用GWT.create()替换@inject。必须有更好的方法来做到这一点。我在这里错过了什么吗?

1 个答案:

答案 0 :(得分:0)

找到了解决方案

interface IsInterface {
 @Inject
 void init(InjectorA a, InjectorB b, ...);
}

public ConcreteClassA implements IsInterface {

 InjectorA a, InjectorB c, InjectorC c;
 ConcreteClassA() {}
 @Override
 public void init(InjectorA a, InjectorB b, ..) {
  this.a = a;
  this.b = b;
  ....
 }

}