如果你在应用程序中使用框架,你需要约定你的应用程序如何与框架交互,例如,如果一个 Java 对象负责处理一个工具条按钮点击,框架需要知道调用这个对象的哪个方法。
对于这种用途,每个框架定义一个应用程序编程接口(API),API 定义了你如何在你的代码中与框架交互,API 也定义了框架传教或控制的对象。通常对于这种用途,框架用继承或 annotation 。
定义 API 的“传统”方法是通过继承,这个方案需求你的类扩展或实现框架类和接口,Eclipse 3.x 平台 API 用这种方案。
框架定义了,例如,一个抽象的类,定义了要实现的方法,在工具条按钮例子中,方法可能叫做execute()
,框架知道在按钮点击时这个方法必须被调用。
通过继承的 API 定义是一个定义 API 的简单方案,但是它也紧紧的耦合类与框架,例如,离开框架去测试类是很困难大,它也让扩展或更新框架变的困难,因为更新可能会影响客户端,这是为什么 Eclipse 4.x 不再采用这种方案的原因。
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
, 以及@Focus
是 org.eclipse.e4.ui.di
包的一部分。
Eclipse 为 commands 以及应用程序生命周期定义了附加的行为 annotations,在相应的章节中描述。
行为 annotations 隐含框架需要为方法提供指定的参数,也就是说,框架也执行方法依赖注入。如果你也加入了 @Inject annotation,方法将被调用 2 次,第一次是在依赖注入阶段,第二次是行为 annotation,这通常不是想要的结果,所以是一个错误。
推荐在 @PostConstruct annotation 的方法中构造 Part 的用户接口,也可以在构造器中构造用户接口,但是不推荐这么做,因为在这个点字段和方法注入还没有完成。
在 @PostConstruct 方法中建立用户接口需求 @Inject 方法明白用户接口还没有建立。
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。