Eclipse RCP教程 – 15 – 依赖注入和Eclipse

15.1 在Eclipse里面定义类依赖

根据Java Specification Request 330(JSR330),Eclipse中的编程模型支持构造器、方法和字段的注入。为了达到依赖注入的目的,Eclipse还定义了其它注解。最重要的一些注解会在下一节里介绍,其它更多的特殊注解也会在相关章节中介绍。

Eclipse依赖框架确保被注入对象的key和type都是正确的。例如,如下所示,如果你想要为xyz这个key指定一个Todo类型的对象,字段声明框架将只会在找到该类型的对象时进行注入。

@Inject @Named(“xyz”) Todo todo;

15.2 在Eclipse中定义类依赖的注解

下表给出了与依赖注入有关的注解,既包含基于JSR330的注解,也有Eclipse中特殊的注解。

表5 依赖注入的基本注解

注解 描述
@javax.inject.Inject 由JSR330定义,可以添加到字段,构造函数或方法中。 Eclipse框架尝试将相应的对象注入到实例的字段或参数中。
@javax.inject.Named

 

由JSR330定义,定义要注入的值的键。 默认情况下,使用完全限定类名作为关键字。 几个默认值的键被定义为IServiceConstants接口中的常量。
@Optional

 

 

Eclipse特定的注解,将注入的值标记为可选。 如果给定的键(和类型)无法确定有效的对象,框架不会抛出异常。

具体行为取决于放置@Optional的位置。 以下描述是基于键的。 如果该键无法引入,将发生以下情况:

对于参数:将注入空值;

对于方法:方法调用将被跳过;

对于字段:值将不会被注入。

 

请注意,在上下文中可以将值设置为null,这与从上下文中删除该key是不同的。 例如,如果以下代码被调用:context.set(SOMEKEY,null),则任何监听SOMEKEY的人都将注入null。

@GroupUpdates

 

Eclipse特定注解,表示此@Inject的更新应该批量执行。 如果在Eclipse上下文中更改这些对象,则更新将由IEclipseContext对象的processWaiting()方法触发。 该注解旨在由平台用于性能优化,并且在RCP应用程序中应该很少会用到。

Eclipse平台支持附加的注解来满足特殊需求,例如,为了接收事件(通过事件服务发送的事件)或者为了与首选项(Preference)协同工作。Eclipse平台中定义的所有标准注解的摘要信息,请参见本文的第17章“Using annotations to define behavior”。

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

被应用程序模型(Application model)引用的Java类由Eclipse运行时来创建对象。在这个实例化过程中,Eclipse运行时会扫描注解的类定义。Eclipse框架会基于这些注解执行注入。

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

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

Eclipse框架会跟踪对象与key和type的依赖关系。如果某个key指向的值发生改变,Eclipse框架会重新给依赖相应类型的对象中注入该新值。这就意味着应用程序无需注册(或者移除)监听器。

例如,你可以通过@Inject注解来定义需要进行注入的内容,它会与当前选择的对象绑定。如果该对象发生了改变,Eclipse框架将会注入改变后的新值。

这个重新注入动作只会作用于被@Inject注解标记了的方法和属性,对于标记了@PostConstruct注解的构造器和方法,重新注入动作不会作用于注入到其中的参数,因为这些方法只会被执行一次。

注意:这并不意味着Eclipse会跟踪某个key指向的值对应的字段。例如,如果mykey1这个key指向的值为一个Todo对象,然后该key又指向了一个新的对象,则所有具有相关类依赖的对象,都会触发该值的重新注入。但是如果Todo对象中的某个属性发生了改变,则并不会触发重新注入。

打赏一下
支付宝
微信
除非注明,博客文章均为原创,转载请标明文章地址
本文地址: http://www.javafxchina.net/blog/2017/06/eclipse-rcp-15/
百度已收录