对于Java社区来说月和月间最重要的事件是一年一度的JavaOne大会的召开JavaOne 的 主题是“推动Java向前发展(Moving Java Forward)”从这个主题可以看出Oracle正试图以领导者的身份带领Java社区来共同推动Java的发展Java SE 的发布是这个过程中的一个重要里程碑相对于上一次JavaOne会议来说JavaOne 在社区中的评价比较不错被认为是一次成功的会议Oracle也更加重视社区在推动Java发展中的作用遗憾的是由于Google和Oracle之间的专利诉讼来自Google的开发者再一次缺席了JavaOne大会
在JavaOne 上Oracle发布了一些新的技术和项目也公布了一些重要项目的发展规划
Java SE
根据社区的反馈Java SE 的发布时间从年底推迟到了年夏距离Java SE 的发布差不多正好年的时间在Java SE 中会包含的内容包括
- Jigsaw项目为Java平台和Java应用提供模块化系统的支持
- Lambda项目为Java语言增加闭包的支持为Java集合API提供批量并行操作API如filter/map/reduce
- 把JRockit虚拟机中的部分特性整合到HotSpot虚拟机中提供一个统一的虚拟机实现
- 集成JavaFX 在JavaOne 上JavaFX 正式发布并会在JDK u中集成JavaFX 的安装Java SE 中则会直接集成JavaFX
- 虚拟机上可以直接使用的新的JavaScript引擎以及更好的JavaScript和Java互操作性新的JavaScript引擎称为Nashorn是一个基于JSR 的实现
- 在移动设备上增加对多点触摸摄像头地理位置信息罗盘和重力加速器的支持
- 对Java 安全日期/时间网络国际化和可访问性API的更新
Java EE
Java EE 的目标是把Java EE技术与目前炙手可热的云计算相结合把Java EE平台本身变成一个服务(Platform as a ServicePaaS)同时提供弹性计算(Elastic computing)和多租户(Multitenancy)的支持相对于目前已有的云计算技术Java EE 的最大优势在于标准化和开放性Java EE 的内容包括
- 提供平台即服务的支持包括服务定义和服务提供以及在API中支持多租户
- 增强Web Profile的能力增加对JAX RS 的支持
- 进一步简化开发包括新的JMS 更多的依赖注入的使用以及更多的服务元数据和优化配置方式等
Java ME
在Java ME方面发展的重点是与Java SE保持同步当Java SE中有新的更新时尽快的同步到Java ME中这其中包括发布版本的同步Java ME API可以运行在Java SE环境中以及一致的工具接口等另外的一个目标是让Java平台支持所有不同的平台不管是什么样的CPU和内存限制环境最后一个方向是与内容和服 务进行深度集成包括访问运营商提供的服务
CDI
对于依赖注入的概念相信很多开 发人员都不陌生一个组件在运行过程中会依赖其他组件提供的功能传统的做法是由组件本身负责查找所需的依赖对象这种方式会造成组件之间的紧耦合不利 于组件的维护和更新依赖注入的做法则是由组件以声明式的方式表明其依赖关系由框架在运行时把所需的组件的Java对象注入到当前组件中相对于 Java SE来说依赖注入的概念对于Java EE更加适用Java EE中的很多资源和服务都是由容器来负责管理的对于单个应用来说查找由容器负责管理的组件并不是一件容易的事情更好的做法是由应用来声明所需的资源 和服务由容器负责注入到应用中通过这种方式容器也可以更好的对资源和服务进行管理以数据库连接为例传统的做法需要由应用本身加载相关驱动并创建 数据库连接以及在适当的时候进行释放而使用容器管理并注入依赖的做法则减轻了应用开发人员的工作量
Java EE 中添加了对依赖注入的有限支持通过注解可以往容器管理的对象中注入资源的对应对象Java EE 中把依赖注入的概念更进一步即引入了JSR (Contexts and Dependency Injection for the Java EE platform)规范简称CDICDI规范吸收了来自Spring IoC容器JBoss Seam和Google Guice的 最佳实践并与Java EE开发的实际需要相结合正如CDI的字面含义一样CDI中的两个核心功能是上下文信息(context)和依赖注入这两个功能的结合点是Java 中基本的组件模型bean在CDI中bean 定义了应用的状态和逻辑并由容器来进行管理每个被管理的bean都有定义好的绑定到特定上下文的作用域和生命周期当需要注入或访问bean时容器 会从作用域对应的上下文中获取当作用域失效时对应上下文中所有的对象都会被删除CDI中的每个bean都可以作为依赖注入时的目标
CDI中预定义了一些常用的作用域默认的作用域是Dependent表示只对被注入的对象生效作用域ApplicationScoped表示 应用的全局作用域用来创建全局唯一的对象RequestScoped和SessionScoped则与HTTP相关分别表示HTTP请求和HTTP 会话ConversationScoped是由应用自定义生命周期长短的作用域可以用来实现跨多页面的工作流如下面代码中的 OrderProcessor类只存活在HTTP请求中并且依赖OrderDao接口的实现容器会在运行时查找到OrderDao接口的实现对象并 注入到OrderProcessor类的对象中
@Named@RequestScopedpublic class OrderProcessor { @Inject private OrderDao orderDao;}
通常的依赖注入方式是在代码中只依赖接口由容器在运行时选择合适的实现类的对象来进行注入如果接口只有一个实现类则不需要额外的声明如果接 口有不同的实现则需要使用限定符(qualifier)来声明具体使用的实现否则容器无法做出正确的选择CDI的一个特点是限定符不是普通的字符 串而是类型安全的注解
通过Qualifier元注解可以创建新的限定符注解如下面的代码创建了一个新的限定符注解InMemory
@Qualifier@Retention(RUNTIME)@Target({TYPE})public @interface InMemory {}
该注解可以添加在OrderDao接口的实现上
@InMemory public class InMemoryOrderDao implements OrderDao {}
如果在测试时希望使用简单的基于内存的存储实现可以使用InMemory注解来声明这样容器在注入时会使用InMemoryOrderDao类的对象
@Named@RequestScopedpublic class OrderProcessor { @Inject @InMemory private OrderDao orderDao;}
使用类型安全的注解类型可以避免使用字符串时会出现的问题在使用字符串来区分时可能由于字符串内容的细微错误而造成难以发现的问题
Google Dart语言
Google的开发人员似乎热衷于开发新的编程语言而且每一次新的语言都很造成比较大的影响前不久Google的开发人员发布了新的编程语言Dart Dart语言的目标是创建结构化的Web应用在使用方式上类似Nodejs和GWT即在服务器端和客户端采用相同的编程语言在Nodejs中 都是使用的JavaScript在GWT中则是以Java为主而Dart则更像是升级版的GWT只是用了一种设计更好的语言来替代Java在服务 器端Dart运行在虚拟机(DartVM)之上而在浏览器端则转换成JavaScript来执行
在语法上Dart像是Scala和JavaScript的一个结合体Dart中有类和接口的概念同时类型声明是可选的在Dart中变量的 类型声明是可选的这么设计的出发点是让开发人员可以根据开发的不同阶段以及应用的类型来选择合适的类型声明策略在初期的原型开发阶段或是开发小型应用 时使用动态类型是一个不错的选择而对于复杂的模块化的大型应用来说采用静态类型则是一个更好的做法Dart并不对类型声明的选择做出限制
下面的Dart代码示例展示了可选类型和类继承的基本用法
class Animal { var legs; Animal(thislegs); //简化的构造方法 tellMyLegs() { print(thislegs); }}class Dog extends Animal { Dog() : super(); }main() { var dog = new Dog(); dogtellMyLegs(); //输出}
值得一提的是Dart的并发编程模型Dart程序在运行时总是单线程的这点类似JavaScript并发性是通过类似Actor的隔离体(isolate)来完成的每个隔离体是一个并发运行的单元有自己的内存和执行逻辑隔离体之间通过消息传递来进行通讯Dart中的隔离体与HTML中的Web Worker非常相似
Dart的目标并不是替代JavaScript或Java而是面向移动平台在Dart中除了核心库之外还有一个DOM API的库可以对DOM进行操作
Dart语言由于刚发布不久很多东西还处于比较初级的阶段不过相关的资源都是开放源代码的感兴趣的人可以关注下面的链接Dart语言官方网站Google Code上的Dart源代码和DartForce网站最简单的做法是下载Linux和Windows平台(不支持Windows XP)上的Dart虚拟机并写一些Dart代码来进行试验