通过自定义注释切换GWT.create(XXX.class)

时间:2014-11-14 11:38:16

标签: gwt binding annotations

我希望你能很好地编码。所以...我正在重构我工作的GWT应用程序的客户端,我想知道一些事情。几天后我回答了一个答案,我决定问你的观点......

标题非常明白,但是,有一段我想做的事情。

我想改变这样的东西

public AnnotatedObject annotated = GWT.create(AnnotatedObject.class);

通过类似的东西

@CreativeAnnotation
public AnnotatedObject;

我不得不说,在我的xxx.gwt.xml中,我做过类似的事情:

<replace-with class="package.AnnotationObject2">
    <when-type-is class="package.AnnotationObject" />
</replace-with>

正如你所看到的,我的deffered替换类是AnnotationObject2,目前,我在上面的那些之间加了一行,我有:

<replace-with class="package.AnnotationObject1">
    <when-type-is class="package.AnnotationObject" />
    <when-property-is name="type" value="object1" />
</replace-with>

<replace-with class="package.AnnotationObject2">
    <when-type-is class="package.AnnotationObject" />
    <when-property-is name="type" value="object2" />
</replace-with>

我不太喜欢使用我的xxx.html的元数据,所以我喜欢的结果就是这个:

@CreativeAnnotation(type = "object2")
public AnnotatedObject;

那么,你认为GWT可以做到这一点(我不得不说我使用GWT 2.5,以及我的客户需求的原因)?如果是的话,你可以帮助我吗?

提前致谢。

编辑:我的意思是,我知道GIN ......只是想知道如何从头开始。

2 个答案:

答案 0 :(得分:4)

您可以通过使用GIN的依赖注入来实现此目的。 GIN自动使用GWT.create()创建一个必须注入的对象。 例如:

class MyView  {
    interface MyUiBinder extends UiBinder<Widget, MyView> {
    }

    @Inject
    MyView(MyUiBinder uiBinder) {
        initWidget(uiBinder.createAndBindUi(this));
    }
}

通过依赖注入,您还可以指定要在GIN模块中实例化的接口实现:

public class MyModule extends AbstractGinModule {
 protected void configure() {
   bind(AnnotationObject.class).annotatedWith(Names.named("object1").to(AnnotationObject1.class);
   bind(AnnotationObject.class).annotatedWith(Names.named("object2").to(AnnotationObject2.class);
 }
}

然后在你的代码中:

public class MyClass {

  @Inject
  public MyClass(@Named("object1") AnnotationObject annotationObject) {
    ...
  }
}

您也可以使用自定义绑定注释而不是命名注释。

答案 1 :(得分:1)

如果您不想使用GIN,您可以编写自己的生成器 - 对于类似这样的事情,这将是非常简单的。