通常的依赖注入方式是在代码中只依赖接口,由容器在运行时选择合适的实现类的对象来进行注入。如果接口只有一个实现类,则不需要额外的声明。如果接口有不 同的实现,则需要使用限定符(qualifier)来声明具体使用的实现,否则容器无法做出正确的选择。CDI的一个特点是限定符不是普通的字符串,而是 类型安全的注解。 通过Qualifier元注解可以创建新的限定符注解。如下面的代码创建了一个新的限定符注解InMemory。 @Qualifier @Retention(RUNTIME) @Target({TYPE}) public @interface InMemory {}该注解可以添加在OrderDao接口的实现上。 @InMemory public class InMemoryOrderDao implements OrderDao { } 如果在测试时,希望使用简单的基于内存的存储实现,可以使用InMemory注解来声明。这样容器在注入时会使用InMemoryOrderDao类的对象。 @Named @RequestScoped public class OrderProcessor { @Inject @InMemory private OrderDao orderDao; } 使用类型安全的注解类型可以避免使用字符串时会出现的问题。在使用字符串来区分时,可能由于字符串内容的细微错误而造成难以发现的问题。 Google Dart语言 Google的开发人员似乎热衷于开发新的编程语言,而且每一次新的语言都很造成比较大的影响。前不久,Google的开发人员发布了新的编程语言Dart。Dart语言的目标是创建结构化的Web应用。在使用方式上类似Node.js和GWT,即在服务器端和客户端采用相同的编程语言。在Node.js中,都是使用的JavaScript;在GWT中则是以Java为主;而Dart则更像是升级版的GWT,只是用了一种设计更好的语言来替代Java。在服务器端,Dart运行在虚拟机(DartVM)之上;而在浏览器端,则转换成JavaScript来执行。 在语法上,Dart像是Scala和JavaScript的一个结合体。Dart中有类和接口的概念,同时类型声明是可选的。在Dart中,变量的类型 声明是可选的。这么设计的出发点是让开发人员可以根据开发的不同阶段以及应用的类型来选择合适的类型声明策略。在初期的原型开发阶段或是开发小型应用时, 使用动态类型是一个不错的选择;而对于复杂的模块化的大型应用来说,采用静态类型则是一个更好的做法。Dart并不对类型声明的选择做出限制。 下面的Dart代码示例展示了可选类型和类继承的基本用法。 class Animal { var legs; Animal(this.legs); //简化的构造方法 tellMyLegs() { print(this.legs); } } class Dog extends Animal { Dog() : super(4); } main() { var dog = new Dog(); dog.tellMyLegs(); //输出4 } 值得一提的是Dart的并发编程模型。Dart程序在运行时总是单线程的,这点类似JavaScript。并发性是通过类似Actor的隔离体 (isolate)来完成的。每个隔离体是一个并发运行的单元,有自己的内存和执行逻辑。隔离体之间通过消息传递来进行通讯。Dart中的隔离体与 HTML5中的Web Worker非常相似。 Dart的目标并不是替代JavaScript或Java,而是面向移动平台。在Dart中,除了核心库之外,还有一个DOM API的库,可以对DOM进行操作。 Dart语言由于刚发布不久,很多东西还处于比较初级的阶段。不过相关的资源都是开放源代码的。感兴趣的人可以关注下面的链接:Dart语言官方网站、 Google Code上的Dart源代码和DartForce网站。最简单的做法是下载Linux和Windows平台(不支持Windows XP)上的Dart虚拟机,并写一些Dart代码来进行试验。 |