Java EE 6簡化開發總結:注解支持與Profile
原創【51CTO精選譯文】在51CTO之前的一系列Java EE 6的文章中,已經介紹了諸如CDI和Bean驗證等新技術,以及Web分片,Facelets,無接口視圖,以及標準API等支持,通過這些特性可以更容易地開發企業或Web應用程序。此外,Java EE 6平臺許多地方的安全性也得到了極大的增強,特別是注解現在可以用在更多類型的Java EE組件中了,用于依賴性注入的注解現在也標準化了,使可注入類具有更好的跨框架遷移特性。
注解支持更多類型的Java EE組件
Java EE 5引入了最簡單的基于注解的編程模型,在新版本中得到了擴展,可以支持更多類型的Java EE組件,如Servlet和JSF組件。例如,在Web應用程序中再也不用部署描述符定義Servlet了,你需要做的就是使用@WebServlet注解標記一個類,如:
- @WebServlet(name="CalculatorServlet", urlPatterns={"/calc", "/getVal"})
- public class CalculatorServlet extends HttpServlet{
- public void doGet(HttpServletRequest req, HttpServletResponse res) {
- ...
- }
- ...
- }
@WebServlet注解是Servlet 3.0提供的注解之一,下面是Servlet 3.0中提供的其它注解:
@WebFilter:在Web應用程序中定義Servlet過濾器;
@WebInitParam:指定所有必須傳給Servlet或Servlet過濾器的init參數;
@WebListener:注解一個監聽器,在特定Web應用程序上下文中獲得各種不同操作事件;
@MultipartConfig:在一個Servlet上指定時,表示Servlet的MIME類型是multipart/*。
JSF 2.0中注解支持的一個好處是簡化了配置托管Bean的方法,不再需要在JSF配置文件faces-config.xml中通過配置注冊一個托管Bean,現在你只需要使用@ManagedBean注解標記托管Bean,并使用RequestScope注解設置其范圍即可,如:
- import javax.faces.bean.ManagedBean;
- import javax.faces.bean.RequestScoped;
- @ManagedBean(name="userBean")
- @RequestScoped
- public class UserBean {
- private String name;
- public String getName() {
- return name;
- }
- public void setName(String name) {
- this.name = name;
- }
- public UserBean() {}
- }
JSF 2.0還提供了其它一些注解,如:
@ManagedProperty:將Bean的屬性標記為托管屬性;
@ResourceDependency:聲明組件將要使用的資源;
@ListenFor:允許組件將特定事件作為一個監聽器訂閱到組件;
@FacesConverter:將類注冊為一個Converter,也就是說,這個類可以執行Object到String,和String到Object的轉換;
@FacesValidator:將類注冊為一個Validator,也就是說,這個類可以執行驗證。
#t#如果你想讓一個注解得到處理,無論是Servlet 3.0注解還是JSF 2.0注解,你需要將使用這些注解標記的類放到Web應用程序的WEB-INF/classes目錄下,也可以將這些類打包到一個jar文件,然后放到程序的WEB-INF/lib目錄下。
在Web分片的例子中,我們在web.xml文件中使用<metadata-complete>元素通知Web容器是否要尋找注解,如果你將<metadata-complete>設為false,或者在文件中不指定<metadata-complete>元素,那么在部署期間,容器必須掃描注解和Web分片,為Web應用程序構建有效的元數據。如果將<metadata-complete>設為true,將由部署描述符為Web應用程序提供所有的配置信息。在這個例子中,Web容器不會搜索注解和Web分片。
隨著對注解和新方法ServletContext的支持,web.xml對Servlet 3.0來說顯得可有可無,也就是說,在應用程序war文件中不再需要包括一個web.xml文件。
#p#
標準化的依賴注入注解
依賴注入是開發企業Java應用程序的一種流行技術,在依賴注入中,也叫做反轉控制,一個組件指定它依賴的資源,一個注入器通常是一個容器,它為組件提供資源,雖然依賴注入有多種實現方式,但許多開發人員習慣使用注解來實現它。依賴注入在Java開發框架中得到了廣泛使用,如Spring和Guice。遺憾的是,之前還沒有基于注解構建依賴注入的標準方法,特別需要注意的是,Sping框架采用的基于注解的依賴注入方法與Guice采用的方法不一樣。
隨著Java EE 6的發布,這個問題得到了解決,隨Java EE 6發布的JSR 330:Java依賴注入改變了這種境況,這個規范的目標是為依賴注入提供一個標準的,可擴展的API。
API由一套用在可注入類上的注解組成,這些注解包括:
@Inject:標識可注入的構造器,方法和字段;
@Qualifier:標識合法的注解,合法的是強類型鍵,它可以幫助區分相同類型的對象不同使用方法。例如,@Red Car和@Blue Car可以理解為相同類型的不同實例,在這個例子中,@Red和@Blue是合法的;
@Scope:標識注解范圍;
@Singleton:標識注入器只實例化一次的類型。
例如,下面的類Stopwatch使用@Inject注解在TimeSource類上注入一個依賴;
- class Stopwatch {
- final TimeSource timeSource;
- @Inject Stopwatch(TimeSource TimeSource) {
- this.TimeSource = TimeSource;
- }
- void start() { ... }
- long stop() { ... }
- }
依賴注入可以通過其它注入進行擴展,例如,假設你想創建一個StopwatchWidget類,它在Stopwatch類上有一個依賴,那么你可以象下面這樣定義這個類:
- class StopwatchWidget {
- @Inject StopwatchWidget(Stopwatch sw) { ... }
- ...
- }
#t#在響應中,注入器發現一個TimeSource對象,使用TimeSource對象構造一個Stopwatch對象,然后再使用Stopwatch對象構造一個StopwatchWidget對象。
JSR 330制定的標準化注解使可注入類可以跨框架遷移,你不用再為特定廠商的注解忙碌了。
注意在JSR 330上構建的CDI和向依賴注入增加的新功能,包括自動發現,可注入類的配置,在運行時定義新的可注入類的API,幫助與第三方框架集成。(51CTO編輯注:針對Java EE 6當中的JSR 330依賴注入,JCP成員們當中是存在一些爭議的,具體可參考這篇JSR 330通過時各方爭議的總結文章)
#p#
Profile(配置文件)和裁剪
Java EE 6引入了Profile的概念,它減小了Java EE平臺的大小,Profiles是Java EE平臺的配置,一個Profile可能包括Java EE平臺技術的一個子集,其它技術則通過JCP取得,但JCP并不是Java EE平臺的一部分。例如,假設有一個電話系統的Profile,這個Profile可能包括了Java EE Web層技術,如Servlet和JSP,EJB企業組件模塊和持久化JPA,它也可能包含面向電話的技術,如JSR 289:SIP Servlet 1.1,雖然這個規范已經經歷了JCP過程,但還不是Java EE平臺的一部分。
Profile是由JCP社區進程定義的。此外,Java EE 6規范為在Java EE Profiles中引用Java EE平臺技術定義了規則,Java EE 6也強調了一個原則,那就是創建一個Profile得有充分的理由,規范是這樣描述的“創建一個Profile的決定應該考慮它潛在的缺點,特別是分片和開發人員混淆方面,通常,只有當開發人員都支持,并且都理解了應用程序可以因此而得到哪些好處時,才需要創建一個Profile”。
Profile有意獨立于Java EE 6平臺發展,Profile是通過Java規范請求(Java Specification Request,JSR)提交的,但是按它自己的節奏發布的,它與Java EE平臺的版本并沒有保持完整的一致性,也就是說諸如前面虛構的電話系統Profile可以按其行業發展情況自由發展,不與Java EE平臺或其它Profile綁定,但需要注意,最好定期讓Profile與平臺同步,特別是平臺的一個主要版本發布時應該同步。目標是維持一個公共的編程模型,簡化開發人員跨整個Java EE 6產品家族的學習過程。(51CTO編輯注:在Java EE 6最終通過的投票上,JCP成員仍存有爭議,其中之一就是針對Profile這個概念。比如說,SpringSource的Rod Johnson認為Profile的引入過于倉促,帶入了很多未經證實的技術。)
Web Profile
Java EE 6定義的第一個Profile叫做Web Profile,它提供了一個Java EE平臺的子集,其設計目的主要是用于Web開發,Web Profile只包括大部分開發人員需要的那些技術。
下表列出了完整的Java EE 6平臺技術,Web Profile使用的技術全部打上勾了。
Java EE平臺技術
|
Web Profile
|
Web應用程序技術
|
|
JSR 315: Java Servlet 3.0
|
✓
|
JSR 314: JavaServer Faces (JSF) 2.0
|
✓
|
JSR 245: JavaServer Pages 2.2 and Expression Language (EL) 1.2
|
✓
|
JSR 52: A Standard Tag Library for JavaServer Pages 1.2
|
✓
|
JSR-45: Debugging Support for Other Languages 1.0
|
✓
|
企業應用程序技術
|
|
JSR 299: Contexts and Dependency Injection for the Java EE Platform 1.0
|
✓
|
JSR 330: Dependency Injection for Java
|
✓
|
JSR 318: Enterprise JavaBeans 3.1
|
✓
|
JSR 317: Java Persistence API 2.0
|
✓(EJB Lite)
|
JSR 250: Common Annotations for the Java Platform 1.1
|
✓
|
JSR 907: Java Transaction API (JTA) 1.1
|
✓
|
JSR 303: Bean Validation 1.0
|
✓
|
JSR 322: Java EE Connector Architecture 1.6
|
|
JSR 914: Java Message Service (JMS) API 1.1
|
|
JSR 919: JavaMail 1.4
|
|
Web Service技術
|
|
JSR 311: JAX-RS: The Java API for RESTful Web Services 1.1
|
|
JSR 109: Implementing Enterprise Web Services 1.3
|
|
JSR 224: Java API for XML-Based Web Services (JAX-WS) 2.2
|
|
JSR 222: Java Architecture for XML Binding (JAXB) 2.2
|
|
JSR 181: Web Services Metadata for the Java Platform
|
|
JSR 101: Java APIs for XML based RPC 1.1
|
|
JSR 67: Java APIs for XML Messaging 1.3
|
|
JSR 93: Java API for XML Registries 1.0 (JAXR) 1.0
|
|
管理和安全技術
|
|
JSR 196: Java Authentication Service Provider Interface for Containers 1.0
|
|
JSR 115: Java Authorization Contract for Containers 1.3
|
|
JSR 88: Java EE Application Deployment 1.2
|
|
JSR 77: J2EE Management 1.1
|
注意,Web Profile包括一個Servlet容器和所有傳統的展示技術,如JSP,JSF和JSP的標準Tag庫,EJB 3.1輕量級版是一個組件模型,也包括持久化JPA和事務管理JTA,還有Web分片,你可以使用傳統的框架或庫(如JAX-RS)輕松地擴展Web Profile。
裁減(Pruning)
Java EE 6平臺中引入的另一個可以減小平臺大小的技術是裁減,裁減一種技術意味著這種技術在下一個平臺版本中,它可能成為一個可選組件,而不是一個必備組件,最終由社區進行決策。裁減可以減小Java EE平臺產品的大小,因為Java EE應用程序廠商可能會在其實現中包括被裁減的技術,也可能排除被裁減的技術,如果包括被裁減計劃的話,必須要提供兼容能力,保證現有應用程序可以繼續運行。
#t#下面這些技術都是即將被裁減的候選者:
◆JSR 101:基于XML的RPC Java API
◆JSR 93: XML注冊1.0 Java API (JAXR)
◆EJB實體Bean(定義為JSR 153:EJB 2.0或更早版本的一部分)
◆JSR 88: Java EE應用程序部署
小結
隨著對Profile的支持,大量新技術如JAX-RS,增強的擴展性功能,如Web分片和平臺級的注解,Java EE 6讓Java EE平臺更加靈活,更加強大,對于開發人員而言更加友好。連Hibernate之父Gavin King也推薦開發者們升級到Java EE 6,你為什么不下載Java EE 6 SDK,嘗試一個Java EE 6平臺下的實現呢?
原文:Further Ease of Development 作者:Ed Ort