在前面的“在 Eclipse 中定义类依赖”中,通过 Eclipse 创建的一个对象可以用 annotations 来描述他的类依赖。
在为一个 Eclipse 创建的对象依赖注入时,Eclipse 框架基于指定的 key 来查询适当的对象,查询从与应用程序模型对象关联的本地上下文开始,如果这个 key 无效,Eclipse 继续查询父上下文,这个过程一直继续,直到主上下文。
后面的章节,你讲学到 Eclipse 上下文不是注入的对象的唯一可能来源。后面的其他例子涵盖 OSGi 服务,Preferences,事件以及定制对象。
对于应用程序模型中引用的类,Eclipse 框架在需要的时候建立相应的对象,这样的对象可以通过依赖注入访问它对应的模型对象。
例如,在 Part 的实现中,你可以通过:@Inject MPart part;
访问 Part 的模型信息。
Eclipse 框架中上下文中建立几个对象,它们是:
上下文可以通过应用程序代码以及框架进行修改,Eclipse 框架自动的跟踪它创建的对象的依赖,它可以更新它们,参考"基于 key/value 修改动态依赖注入"。
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 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 框架本身没有用到,本书的作者也没有找到一个合适的使用情况。