萬盛學電腦網

 萬盛學電腦網 >> 腳本專題 >> javascript >> Java那些事兒 - JavaOne 2011、CDI和Google Dart語言

Java那些事兒 - JavaOne 2011、CDI和Google Dart語言

對於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代碼來進行試驗。

copyright © 萬盛學電腦網 all rights reserved