Eclipse4 RCP 指南

依赖注入与注解

在 Eclipse 中定义类依赖

Eclipse 编程模型支持符合 Java 规范请求 330(JSR330)的构造器、方法以及字段注入。Eclipse 还定义了附加的 annotations 用作依赖注入,大部分重要的 annotations 在下一节描述,其它更特殊的 annotations 在相应的章节描述。

Eclipse 依赖框架确保 key 以及注入对象的类型是正确的,例如,如果你希望对 xyz key 使用 Todo 类型,就像下面的字段声明那样,框架将只有在找到一个可指派的类型时才会注入对象。

@Inject @Named("xyz") Todo todo;

在 Eclipse 中 annotations 定义类依赖

下表给出了基于 JSR330 以及 Eclipse 独有的依赖注入相关的 annotations。

Annotation 描述
@javax.inject.Inject 在 JSR330 中定义,可以添加到字段、构造器、方法上。Eclipse 框架尝试注入相应的对象到字段或实例的参数。
@javax.inject.Named 在 JSR330 中定义,为应该被注入的对象定义 key。通常,全资格类名用作 key。默认值的几个 keys 是在 IServiceContants 接口中定义为常数。
@Optional Eclipse 特殊的 annotation,标示一个注入值是可选的。如果对于给定的 key 没有有效的对象,框架不会抛出一个异常。
具体的行为依赖 @Optional 放在什么地方。下面的描述基于 key,如果 key 不能被解决,下面情况将发生:
1. 对于参数,将注入一个null值;
2. 对于方法,方法调用被跳过;
3. 对于字段,值不会注入;
注意null是一个上下文可接受的值,并且 key 从上下文删除时不同。例如,如果下面是调用了context.set(SOMEKEY, null),所有监听SOMEKEY的将被注入 null。
@GroupUpdates Eclipse 特殊的 annotation,指示为这个 @Inject 更新应该批处理。如果你在Eclipse 上下文中改变了这样的对象, 更新是通过IEclipseContext对象的processWaiting()方法来触发的。这个 annotation 的主要用途是为平台提供性能优化,应该很少在 RCP 应用程序中使用。

注意 Eclipse 平台支持其他特殊用途的 annotations,例如,为接受事件(通过事件服务器发送)或在preferences上工作。对于所有定义在 Eclipse 平台的标准 annotations 的摘要参考 ???。

Eclipse 在哪个对象上执行依赖注入?

Eclipse 运行时通过应用程序模型引用的 Java 类来创建对象。在这个实例化过程中,Eclipse 运行时扫描类定义中的 annotations,基于这个 annotations,Eclipse框架执行注入。

Eclipse 不会在你的代码中通过 new 操作符创建的对象上自动执行依赖注入。

基于 key/value 改变的动态依赖注入

Eclipse 框架追踪哪个对象依赖到哪个 key 和值,如果 key 指向的值改变了,Eclipse 框架重新注入新的值,这意味着应用程序可以不用安装(以及删除)监听器。

例如,你可以通过 @Inject 定义你希望得到当前选择的对象,如果选择改变了,Eclipse 框架将注入新的值。

重新注入只会在标注了 @Inject 的方法和字段上工作,它不会在标记了 @PostConstruct 的构造器和方法的参数上工作,因为这些方法只会执行一次,这将在后面的”Eclipse 上下文生命周期“中解释。

注意这不是说 Eclipse 跟踪 key 指向的值的字段,例如,如果 mykey1 指向一个 Todo 对象,然后 mykey1 指向一个新对象,这将触发重新注入到所有相关类依赖的对象,但是如果字段内部的字段改变了,它不会触发重新注入。