Eclipse RCP教程 – 16 – Eclipse上下文(Eclipse context)

16.1. 什么是Eclipse context?

在一个Eclipse应用程序启动时,Eclipse运行时创建了一个基于IEclipseContext接口的对象。该对象被称为Context或Eclipse context。

Context与Map数据结构非常类似,在Context中可以通过key来存取对象。Key是一个String并且在很多情况下完整类名被用作key值。对应的value(与对应的key对应)可以被注入到其它对象中。不过与Map不同的是,Eclipse context是层级结构并且可以根据被请求的key来动态计算value。

对于特定的模型对象(参考《将模型元素连接到类和资源》)会创建一个本地Context(Local Context)。该Context与一个应用程序模型对象(Application model object)相关联。

基于应用程序模型结构,不同的Context对象连接构成了一种分层树型结构。在此层次结构的最高层是应用上下文(Application Context)。

Context分层的样例如下图所示:

20170530_001

对象可以被放到Context层级的不同层次上。这使得相同的key可以指向层级中的不同对象。

例如,可以通过一个类似@Inject Composite parent这样的字段声明来表示一个依赖Composite对象的part。由于part有多个不同的local context,它们可以接收到不同的Composite对象。

16.2. 哪个模型元素(Model Elements)带有local context?

目前如下模型元素实现了MContext接口并且因此带有自己的Context:

● MApplication

● MWindow

● MPerspective

● MPart

● MPopupMenu

16.3. Eclipse context的生命周期

Eclipse框架在启动过程中基于应用程序模型创建了Context层级结构。在默认情况下,它将特定对象根据预定义的Key值放置到Context中。例如:控制Eclipse框架功能的服务。

模型对象和基于class URI属性的对象由Eclipse平台创建。对于每个带有自定义Context的模型元素,Eclipse框架会决定哪些对象可以在模型对象的Local Context中访问。如果需要的话,它还会创建由模型元素的Class URI属性所引用的Java对象。例如用于确定一个Part对于用户来说是否可见。

 20170326_010 渲染器框架(Renderer Framework)用于创建与UI相关的模型元素的Local Context。此框架允许你定义负责设置模型对象的UI实现的类。对应的类被称为该模型元素的渲染器(Renderer)。例如,ContributedPartRenderer 类是part模型元素的默认Renderer。它为每个part都创建了一个Composite并且将此Composite放到了part的Local Context之中。

在Eclipse Context层级被初次创建之后,框架或应用代码可以改变存储在Context之中的键值对(key-value pairs)。在这种情况下,那些使用Eclipse平台功能(例如使用Eclipse依赖注入框架)所创建的对象将会被更新为新的Value值。

在Context中的对象会被持久化到内存之中(瞬态,transient),换言之应用停止时将会销毁对应的Context。

16.4. 依赖注入如何选择对象?

如《Eclipse中的哪些对象可以使用依赖注入?》一文所述,由Eclipse创建的对象可以使用注解来描述它的类依赖。

在由Eclipse所创建的对象的依赖注入过程中,Eclipse框架会根据指定的key值搜索适合的对象。首先搜索与应用模型对象相关联的Local Context。如果对应的key值没有找到,则会继续搜索父context。持续此过程直到main Context被搜索完毕。

20170530_002

在后面的章节中你将会了解到,并不仅仅只有Eclipse Context中的对象是可以被用于依赖注入。后面还会有样例介绍注入OSGi服务、参数(Preferences)、事件(Events)以及自定义对象。对于依赖注入的调用者来说,这个搜索过程(一般)是透明的。

16.5. 如何访问模型对象(model objects)

在应用模型中的类引用中,Eclipse框架在需要时会创建对应的对象。这些对象可以通过依赖注入访问与之对应的模型对象。

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

16.6. Eclipse context中的默认入口(Default entries)

Eclipse框架在Context中创建了一些对象,包括:

● 模型对象(model objects)——包括了应用程序模型(application model)的数据 。

● 服务——由Eclipse平台或OSGi服务注册表定义的软件组件。

● 其它被明确添加到Context之中的对象。

Context可以被应用程序代码或框架修改。由于Eclipse框架会自动追踪其创建的对象的依赖,因此它可以更新这些对象,正如《基于key/value变化的动态依赖注入》一文所述。

16.7.访问活动的part或shell的限定符(Qualifiers)

Eclipse平台会将当前所选择的part以及当前活动的shell存放到应用程序对象(application object)的IEclipseContext 之中。相关的key在IServiceConstants 接口中进行了定义。

例如,下面的方法允许你跟踪在另外一个part中的当前活动part。

使用IServiceConstants.ACTIVE_SHELL key值来跟踪活动的shell。

 

 20170326_010 Eclipse使用Handler来定义通过菜单或工具栏入口触发的动作(Action)。对于一个Handler实现类来说,它没有必要使用这些限定符,因为Handler是在应用程序的活动Context的内部执行。

16.8. 使用@Active 来跟踪子Context

注解 @Active 允许你跟踪子Context中的值。Eclipse框架保持对IEclipseContext 的层级结构中的当前活动分支进行跟踪。例如,如果用户选择了一个part,在IEclipseContext层级结构中的路径是从根节点到对应part的IEclipseContext ,这个是当前活动分支。

此注解的用途可以通过如下代码片段来展示。

 20170326_010 注解@Active当前并未在Eclipse框架本身内部使用,本文的作者尚未找到非常好的关于此注解的用例。
打赏一下
支付宝
微信
除非注明,博客文章均为原创,转载请标明文章地址
本文地址: http://www.javafxchina.net/blog/2017/05/eclipse-rcp-16/
百度已收录