Eclipse 编程模型支持符合 Java 规范请求 330(JSR330)的构造器、方法以及字段注入。Eclipse 还定义了附加的 annotations 用作依赖注入,大部分重要的 annotations 在下一节描述,其它更特殊的 annotations 在相应的章节描述。
Eclipse 依赖框架确保 key 以及注入对象的类型是正确的,例如,如果你希望对 xyz
key 使用 Todo 类型,就像下面的字段声明那样,框架将只有在找到一个可指派的类型时才会注入对象。
@Inject @Named("xyz") Todo todo;
下表给出了基于 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 运行时通过应用程序模型引用的 Java 类来创建对象。在这个实例化过程中,Eclipse 运行时扫描类定义中的 annotations,基于这个 annotations,Eclipse框架执行注入。
Eclipse 不会在你的代码中通过 new 操作符创建的对象上自动执行依赖注入。
Eclipse 框架追踪哪个对象依赖到哪个 key 和值,如果 key 指向的值改变了,Eclipse 框架重新注入新的值,这意味着应用程序可以不用安装(以及删除)监听器。
例如,你可以通过 @Inject 定义你希望得到当前选择的对象,如果选择改变了,Eclipse 框架将注入新的值。
重新注入只会在标注了 @Inject 的方法和字段上工作,它不会在标记了 @PostConstruct 的构造器和方法的参数上工作,因为这些方法只会执行一次,这将在后面的”Eclipse 上下文生命周期“中解释。
注意这不是说 Eclipse 跟踪 key 指向的值的字段,例如,如果 mykey1 指向一个 Todo 对象,然后 mykey1 指向一个新对象,这将触发重新注入到所有相关类依赖的对象,但是如果字段内部的字段改变了,它不会触发重新注入。