写点什么

Java 那些事儿 - JavaOne 2011、CDI 和 Google Dart 语言

  • 2011-11-10
  • 本文字数:3631 字

    阅读完需:约 12 分钟

对于 Java 社区来说,9 月和 10 月间最重要的事件是一年一度的 JavaOne 大会的召开。 JavaOne 2011 的主题是“推动 Java 向前发展(Moving Java Forward)”。从这个主题可以看出,Oracle 正试图以领导者的身份带领 Java 社区来共同推动 Java 的发展。Java SE 7 的发布,是这个过程中的一个重要里程碑。相对于上一次 JavaOne 会议来说,JavaOne 2011 在社区中的评价比较不错,被认为是一次成功的会议。Oracle 也更加重视社区在推动Java 发展中的作用。遗憾的是,由于Google 和Oracle 之间的专利诉讼,来自Google 的开发者再一次缺席了JavaOne 大会。

在JavaOne 2011 上,Oracle 发布了一些新的技术和项目,也公布了一些重要项目的发展规划。

Java SE 8

根据社区的反馈,Java SE 8 的发布时间从 2012 年底推迟到了 2013 年夏,距离 Java SE 7 的发布差不多正好 2 年的时间。在 Java SE 8 中会包含的内容包括:

  • Jigsaw 项目:为 Java 平台和 Java 应用提供模块化系统的支持。
  • Lambda 项目:为 Java 语言增加闭包的支持。为 Java 集合 API 提供批量并行操作 API,如 filter/map/reduce。
  • JRockit 虚拟机中的部分特性整合到 HotSpot 虚拟机中,提供一个统一的虚拟机实现。
  • 集成 JavaFX 3.0。在 JavaOne 2011 上 JavaFX 2.0 正式发布,并会在 JDK 7u2 中集成 JavaFX 2.0 的安装。Java SE 8 中则会直接集成 JavaFX 3.0。
  • 虚拟机上可以直接使用的新的 JavaScript 引擎,以及更好的 JavaScript 和 Java 互操作性。新的 JavaScript 引擎称为 Nashorn ,是一个基于 JSR 292 的实现。
  • 在移动设备上,增加对多点触摸、摄像头、地理位置信息、罗盘和重力加速器的支持
  • 对 Java 安全、日期 / 时间、网络、国际化和可访问性 API 的更新。

Java EE 7

Java EE 7 的目标是把 Java EE 技术与目前炙手可热的云计算相结合,把 Java EE 平台本身变成一个服务(Platform as a Service,PaaS),同时提供弹性计算(Elastic computing)和多租户(Multi-tenancy)的支持。相对于目前已有的云计算技术,Java EE 7 的最大优势在于标准化和开放性。Java EE 7 的内容包括:

  • 提供平台即服务的支持,包括服务定义和服务提供,以及在 API 中支持多租户。
  • 增强 Web Profile 的能力,增加对 JAX RS 2.0 的支持。
  • 进一步简化开发,包括新的 JMS 2.0,更多的依赖注入的使用,以及更多的服务元数据和优化配置方式等。

Java ME 7

在 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 5 中添加了对依赖注入的有限支持。通过注解可以往容器管理的对象中注入资源的对应对象。Java EE 6 中把依赖注入的概念更进一步,即引入了 JSR 299 (Contexts and Dependency Injection for the Java EE platform) 规范,简称 CDI。CDI 规范吸收了来自 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
@RequestScoped
public 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
@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 代码来进行试验。


感谢张凯峰对本文的审校。

给InfoQ 中文站投稿或者参与内容翻译工作,请邮件至 editors@cn.infoq.com 。也欢迎大家加入到 InfoQ 中文站用户讨论组中与我们的编辑和其他读者朋友交流。

2011-11-10 00:006523

评论

发布
暂无评论
发现更多内容

2021低代码平台推荐,每一个都具有10年行业开发经验!

J2PaaS低代码平台

低代码 低代码开发 低代码开发平台 地代码平台

情报信息分析研判系统搭建,情指勤一体化平台建设开发

电微13828808271

全球IT服务将增1.3万亿美元,联想持续布局智慧服务能力

科技大数据

把酒言欢话聊天,基于Vue3.0+Tornado6.1+Redis发布订阅(pubsub)模式打造异步非阻塞(aioredis)实时(websocket)通信聊天系统

刘悦的技术博客

tornado 实时通信 Vue 3 web socket redis'

从Hadoop框架讨论大数据生态

编程江湖

大数据 hadoop

如何跟踪log4j漏洞原理及发现绕WAF的tips

H

网络安全 漏洞

如何在 GitHub 上高效阅读源码?

AlwaysBeta

GitHub 源码 源码分析 源码阅读 源码解析

CameraX ImageAnalysis

Changing Lin

12月日更

干货分享!边云融合的时序时空数据库实践详解

百度开发者中心

物联网 时序数据库

优酷 Android 构建速度优化实践

阿里巴巴终端技术

android App Gradle 移动开发 客户端

致敬全新的未来!创业邦100未来独角兽峰会暨2021创业邦年会成功举办

创业邦

🏆【Alibaba中间件技术系列】「RocketMQ技术专题」RocketMQ消息发送的全部流程和落盘原理分析

码界西柚

RocketMQ 消息队列 Apache RocketMQ 12月日更

安全漏洞之任意文件上传漏洞分析

网络安全学海

黑客 网络安全 信息安全 渗透测试 安全漏洞

[架构实战营] 模块七作业

张祥

架构实战营

智慧社区小程序搭建,智慧平安社区解决方案

电微13828808271

“有创业者的地方,创业邦一直都在” 创业邦100未来独角兽峰会暨2021创业邦年会圆满落幕

创业邦

视频通信中的码率控制算法

拍乐云Pano

音视频 RTC 视频编码 码率控制

如何开始移动网站测试

FunTester

测试 web测试 FunTester 移动端测试 响应式网页

区块链数字收藏品平台开发,数字藏品交易平台搭建

电微13828808271

语音信号处理 4:汉语中语音的分类及韵律特性

轻口味

28天写作 12月日更

由IDC余热回收创新技术实践引出的跨界合作探讨

安第斯智能云

算力 碳中和 节能 跨界合作

飞桨EasyDL桌面版正式发布 本地数据、本地网络、本地算力也能高效建模

科技热闻

【等保小知识】等保一级需要测评吗?

行云管家

网络安全 等保 等级保护 等保一级

一站式云安全保障,就用行云管家!完美保障!

行云管家

云计算 云安全 企业上云 云资源 云管理

「Oracle」数据库字符集编码修改

恒生LIGHT云社区

数据库 oracle

波卡生态的去中心化存储Crust Network | Hoo虎符研究院

区块链前沿News

波卡生态挖矿 Hoo虎符 虎符交易所 虎符研究院 去中心化存储

CRM系统如何帮助企业改变销售周期

低代码小观

程序员 销售管理 销售 CRM CRM系统

重点人员管控系统开发搭建,指挥调度平台建设方案

电微13828808271

恒源云(GPUSHARE)_[文本分类] 文本数据增强1(论文笔记)

恒源云

深度学习 语音识别

微服务架构 | 如何利用日志链路追踪程序执行的慢SQL?

李尚智

性能分析 微服务治理 慢SQL 链路分析

Log4j2 Zero Day 漏洞 Apache Flink 应对指南

Apache Flink

大数据 flink log4j2

Java那些事儿 - JavaOne 2011、CDI和Google Dart语言_Java_成富_InfoQ精选文章