Eclipse4 RCP 指南

用 Annotation 定义行为

API 定义

如果你在应用程序中使用框架,你需要约定你的应用程序如何与框架交互,例如,如果一个 Java 对象负责处理一个工具条按钮点击,框架需要知道调用这个对象的哪个方法。

对于这种用途,每个框架定义一个应用程序编程接口(API),API 定义了你如何在你的代码中与框架交互,API 也定义了框架传教或控制的对象。通常对于这种用途,框架用继承或 annotation 。

通过继承的 API 定义

定义 API 的“传统”方法是通过继承,这个方案需求你的类扩展或实现框架类和接口,Eclipse 3.x 平台 API 用这种方案。

框架定义了,例如,一个抽象的类,定义了要实现的方法,在工具条按钮例子中,方法可能叫做execute(),框架知道在按钮点击时这个方法必须被调用。

通过继承的 API 定义是一个定义 API 的简单方案,但是它也紧紧的耦合类与框架,例如,离开框架去测试类是很困难大,它也让扩展或更新框架变的困难,因为更新可能会影响客户端,这是为什么 Eclipse 4.x 不再采用这种方案的原因。

通过 Annotation 的 API 定义

Eclipse 4.x 平台 API 基于 annotations,也就是说,annotations 用来标注在特定的点调用哪个方法,这些 annotations 是叫做行为 annotations.

下表列出了对于 Part 有效的行为 annotations.

Annotation 描述
@PostConstruct 在类构造以及字段和方法注入执行之后调用。
@PreDestroy 类销毁之前调用,可以用了清理资源
@Focus 在 Part 获得焦点时调用
@Persist Eclipse 框架在 Part 上触发 Save 请求时调用
@PersistState 在模型对象 dispose 之前调用,这样 Part 有机会去保存它的实例状态,这个方法在 @PreDestroy 方法之前调用。

@PostConstruct, @PreDestroy annotations 包含这 javax.annotation 包中。 @Persist, @PersistState, 以及@Focusorg.eclipse.e4.ui.di 包的一部分。

Eclipse 为 commands 以及应用程序生命周期定义了附加的行为 annotations,在相应的章节中描述。

行为 annotations 隐含方法依赖注入

行为 annotations 隐含框架需要为方法提供指定的参数,也就是说,框架也执行方法依赖注入。如果你也加入了 @Inject annotation,方法将被调用 2 次,第一次是在依赖注入阶段,第二次是行为 annotation,这通常不是想要的结果,所以是一个错误。

用 @PostConstruct 方法来建立用户接口

推荐在 @PostConstruct annotation 的方法中构造 Part 的用户接口,也可以在构造器中构造用户接口,但是不推荐这么做,因为在这个点字段和方法注入还没有完成。

在 @PostConstruct 方法中建立用户接口需求 @Inject 方法明白用户接口还没有建立。

为什么 @PostConstruct 方法没有被调用?

Java 7 和 Eclipse 平台都输出了 @PostConstruct annotation,在你的 Eclipse 应用程序中,你需要告诉框架应该使用 Eclipse 平台的那个。

在你的 @PostConstruct 方法没有调用的情况下,确保你在 MANIFEST.MF 文件中定义了到 org.eclipse.core.runtime的依赖。参考 http://wiki.eclipse.org/Eclipse4/RCP/FAQ 获得详细信息。

注意,org.eclipse.core.runtime 输出正确版本的 javax.annotation,如果你在 MANIFEST.MF 文件中依赖了org.eclipse.core.runtime,就不需要额外的包了,如果,为了某些原因,你不希望依赖org.eclipse.core.runtime,你可以定义一个包依赖javax.annotation包,并且设置版本为 1.0.0。