Eclipse4 RCP 指南

对依赖注入有效的对象

依赖注入如何选择对象?

在前面的“在 Eclipse 中定义类依赖”中,通过 Eclipse 创建的一个对象可以用 annotations 来描述他的类依赖。

在为一个 Eclipse 创建的对象依赖注入时,Eclipse 框架基于指定的 key 来查询适当的对象,查询从与应用程序模型对象关联的本地上下文开始,如果这个 key 无效,Eclipse 继续查询父上下文,这个过程一直继续,直到主上下文。

后面的章节,你讲学到 Eclipse 上下文不是注入的对象的唯一可能来源。后面的其他例子涵盖 OSGi 服务,Preferences,事件以及定制对象。

如何访问模型对象?

对于应用程序模型中引用的类,Eclipse 框架在需要的时候建立相应的对象,这样的对象可以通过依赖注入访问它对应的模型对象。

例如,在 Part 的实现中,你可以通过:@Inject MPart part;访问 Part 的模型信息。

Eclipse 上下文中默认的项

Eclipse 框架中上下文中建立几个对象,它们是:

  • 模型对象 - 包含应用程序模型的数据;
  • services - 通过 Eclipse 平台或通过 OSGi 服务注册定义的软件组件;
  • 几个其他明确添加到上下文中的对象;

上下文可以通过应用程序代码以及框架进行修改,Eclipse 框架自动的跟踪它创建的对象的依赖,它可以更新它们,参考"基于 key/value 修改动态依赖注入"。

访问活动 Part 或 Shell 的限定词

Eclipse 平台将当前选择的 Part 和活动的 shell 放在应用程序对象的 IEclipseContext 中,keys 是在 IServiceConstants 结构中定义。

例如,下面的方法将允许你在其他 Part 中跟踪当前活动的 Part。

// tracks the active part
@Inject
@Optional
public void receiveActivePart(@Named(IServiceConstants.ACTIVE_PART) MPart activePart) {
  if (activePart != null) {
    System.out.println("Active part changed "
        + activePart.getLabel());
  }
}

要跟踪活动的 shell,用 IServiceConstants.ACTIVE_SHELL key.

// tracks the active shell
@Inject
@Optional
public void receiveActiveShell(@Named(IServiceConstants.ACTIVE_SHELL) Shell shell) {
  if (shell != null) {
    System.out.println("Active shell (Window) changed");
  }
}

注意 Eclipse 用 handlers 来定义可以通过菜单或工具条触发的 actions。对于一个 handler 实现类,不需要用这些限定词,因为 handler 在应用程序活动的上下文中执行。

用 @Active 跟踪一个子上下文

@Active annotation 允许你跟踪子上下文中的值,Eclipse 框架跟踪 IEclipseContext 层次中当前活动的分支,例如,如果用户选择了一个 Part,那么在 IEclipseContext 层次中,从根到 Part 的 IEclipseContext 路径是当前活动分支。

用 @Active annotation,你可以跟踪当前活动分支中的子元素的值,当活动分支改变了,那么 key 引用的值被重新注入到使用 @Active annotation 的对象。

下面的片段演示这个 annotation 的用法:

public class MyOwnClass {
  @Inject
  void setChildValue(@Optional @Named("key_of_child_value") @Active String value) {
    this.childValue = value;
  }
}

注意,@Active annotation 当前在 Eclipse 框架本身没有用到,本书的作者也没有找到一个合适的使用情况。