自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

Java EE 6簡(jiǎn)化開發(fā)總結(jié):注解支持與Profile

原創(chuàng)
開發(fā) 后端
Java EE的最新版本,Java EE 6同時(shí)強(qiáng)調(diào)了簡(jiǎn)單性和易用性,進(jìn)一步簡(jiǎn)化了平臺(tái),擴(kuò)展了可用性。在簡(jiǎn)化開發(fā)這方面,Java EE 6讓更多類型的Java EE組件可以用注解來控制,并引入了Profile的概念。本文對(duì)這方面進(jìn)行了介紹,并對(duì)Java EE 6平臺(tái)進(jìn)行了總結(jié)。

【51CTO精選譯文】在51CTO之前的一系列Java EE 6的文章中,已經(jīng)介紹了諸如CDIBean驗(yàn)證等新技術(shù),以及Web分片,Facelets,無接口視圖,以及標(biāo)準(zhǔn)API等支持,通過這些特性可以更容易地開發(fā)企業(yè)或Web應(yīng)用程序。此外,Java EE 6平臺(tái)許多地方的安全性也得到了極大的增強(qiáng),特別是注解現(xiàn)在可以用在更多類型的Java EE組件中了,用于依賴性注入的注解現(xiàn)在也標(biāo)準(zhǔn)化了,使可注入類具有更好的跨框架遷移特性。

注解支持更多類型的Java EE組件

Java EE 5引入了最簡(jiǎn)單的基于注解的編程模型,在新版本中得到了擴(kuò)展,可以支持更多類型的Java EE組件,如Servlet和JSF組件。例如,在Web應(yīng)用程序中再也不用部署描述符定義Servlet了,你需要做的就是使用@WebServlet注解標(biāo)記一個(gè)類,如:

  1. @WebServlet(name="CalculatorServlet", urlPatterns={"/calc""/getVal"})  
  2.    public class CalculatorServlet extends HttpServlet{  
  3.       public void doGet(HttpServletRequest req, HttpServletResponse res) {  
  4.       ...  
  5.       }  
  6.  
  7.       ...  
  8.    }  
  9.  

@WebServlet注解是Servlet 3.0提供的注解之一,下面是Servlet 3.0中提供的其它注解:

@WebFilter:在Web應(yīng)用程序中定義Servlet過濾器;

@WebInitParam:指定所有必須傳給Servlet或Servlet過濾器的init參數(shù);

@WebListener:注解一個(gè)監(jiān)聽器,在特定Web應(yīng)用程序上下文中獲得各種不同操作事件;

@MultipartConfig:在一個(gè)Servlet上指定時(shí),表示Servlet的MIME類型是multipart/*。

JSF 2.0中注解支持的一個(gè)好處是簡(jiǎn)化了配置托管Bean的方法,不再需要在JSF配置文件faces-config.xml中通過配置注冊(cè)一個(gè)托管Bean,現(xiàn)在你只需要使用@ManagedBean注解標(biāo)記托管Bean,并使用RequestScope注解設(shè)置其范圍即可,如:

  1. import javax.faces.bean.ManagedBean;  
  2.    import javax.faces.bean.RequestScoped;  
  3.  
  4.    @ManagedBean(name="userBean")  
  5.    @RequestScoped 
  6.    public class UserBean {  
  7.  
  8.       private String name;  
  9.  
  10.       public String getName() {  
  11.    return name;  
  12.       }  
  13.       public void setName(String name) {  
  14.    this.name = name;  
  15.       }  
  16.       public UserBean() {}  
  17.    }  
  18.  

JSF 2.0還提供了其它一些注解,如:

@ManagedProperty:將Bean的屬性標(biāo)記為托管屬性;

@ResourceDependency:聲明組件將要使用的資源;

@ListenFor:允許組件將特定事件作為一個(gè)監(jiān)聽器訂閱到組件;

@FacesConverter:將類注冊(cè)為一個(gè)Converter,也就是說,這個(gè)類可以執(zhí)行Object到String,和String到Object的轉(zhuǎn)換;

@FacesValidator:將類注冊(cè)為一個(gè)Validator,也就是說,這個(gè)類可以執(zhí)行驗(yàn)證。

#t#如果你想讓一個(gè)注解得到處理,無論是Servlet 3.0注解還是JSF 2.0注解,你需要將使用這些注解標(biāo)記的類放到Web應(yīng)用程序的WEB-INF/classes目錄下,也可以將這些類打包到一個(gè)jar文件,然后放到程序的WEB-INF/lib目錄下。

Web分片的例子中,我們?cè)趙eb.xml文件中使用<metadata-complete>元素通知Web容器是否要尋找注解,如果你將<metadata-complete>設(shè)為false,或者在文件中不指定<metadata-complete>元素,那么在部署期間,容器必須掃描注解和Web分片,為Web應(yīng)用程序構(gòu)建有效的元數(shù)據(jù)。如果將<metadata-complete>設(shè)為true,將由部署描述符為Web應(yīng)用程序提供所有的配置信息。在這個(gè)例子中,Web容器不會(huì)搜索注解和Web分片。

隨著對(duì)注解和新方法ServletContext的支持,web.xml對(duì)Servlet 3.0來說顯得可有可無,也就是說,在應(yīng)用程序war文件中不再需要包括一個(gè)web.xml文件。

#p#

標(biāo)準(zhǔn)化的依賴注入注解

依賴注入是開發(fā)企業(yè)Java應(yīng)用程序的一種流行技術(shù),在依賴注入中,也叫做反轉(zhuǎn)控制,一個(gè)組件指定它依賴的資源,一個(gè)注入器通常是一個(gè)容器,它為組件提供資源,雖然依賴注入有多種實(shí)現(xiàn)方式,但許多開發(fā)人員習(xí)慣使用注解來實(shí)現(xiàn)它。依賴注入在Java開發(fā)框架中得到了廣泛使用,如Spring和Guice。遺憾的是,之前還沒有基于注解構(gòu)建依賴注入的標(biāo)準(zhǔn)方法,特別需要注意的是,Sping框架采用的基于注解的依賴注入方法與Guice采用的方法不一樣。

隨著Java EE 6的發(fā)布,這個(gè)問題得到了解決,隨Java EE 6發(fā)布的JSR 330:Java依賴注入改變了這種境況,這個(gè)規(guī)范的目標(biāo)是為依賴注入提供一個(gè)標(biāo)準(zhǔn)的,可擴(kuò)展的API。

API由一套用在可注入類上的注解組成,這些注解包括:

@Inject:標(biāo)識(shí)可注入的構(gòu)造器,方法和字段;

@Qualifier:標(biāo)識(shí)合法的注解,合法的是強(qiáng)類型鍵,它可以幫助區(qū)分相同類型的對(duì)象不同使用方法。例如,@Red Car和@Blue Car可以理解為相同類型的不同實(shí)例,在這個(gè)例子中,@Red和@Blue是合法的;

@Scope:標(biāo)識(shí)注解范圍;

@Singleton:標(biāo)識(shí)注入器只實(shí)例化一次的類型。

例如,下面的類Stopwatch使用@Inject注解在TimeSource類上注入一個(gè)依賴;

  1. class Stopwatch {  
  2.       final TimeSource timeSource;  
  3.       @Inject Stopwatch(TimeSource TimeSource) {  
  4.         this.TimeSource = TimeSource;  
  5.       }  
  6.       void start() { ... }  
  7.       long stop() { ... }  
  8.    }  
  9.  

依賴注入可以通過其它注入進(jìn)行擴(kuò)展,例如,假設(shè)你想創(chuàng)建一個(gè)StopwatchWidget類,它在Stopwatch類上有一個(gè)依賴,那么你可以象下面這樣定義這個(gè)類:

  1. class StopwatchWidget {  
  2.       @Inject StopwatchWidget(Stopwatch sw) { ... }  
  3.       ...  
  4.    }  
  5.  

#t#在響應(yīng)中,注入器發(fā)現(xiàn)一個(gè)TimeSource對(duì)象,使用TimeSource對(duì)象構(gòu)造一個(gè)Stopwatch對(duì)象,然后再使用Stopwatch對(duì)象構(gòu)造一個(gè)StopwatchWidget對(duì)象。

JSR 330制定的標(biāo)準(zhǔn)化注解使可注入類可以跨框架遷移,你不用再為特定廠商的注解忙碌了。

注意在JSR 330上構(gòu)建的CDI和向依賴注入增加的新功能,包括自動(dòng)發(fā)現(xiàn),可注入類的配置,在運(yùn)行時(shí)定義新的可注入類的API,幫助與第三方框架集成。(51CTO編輯注:針對(duì)Java EE 6當(dāng)中的JSR 330依賴注入,JCP成員們當(dāng)中是存在一些爭(zhēng)議的,具體可參考這篇JSR 330通過時(shí)各方爭(zhēng)議的總結(jié)文章

#p#

Profile(配置文件)和裁剪

Java EE 6引入了Profile的概念,它減小了Java EE平臺(tái)的大小,Profiles是Java EE平臺(tái)的配置,一個(gè)Profile可能包括Java EE平臺(tái)技術(shù)的一個(gè)子集,其它技術(shù)則通過JCP取得,但JCP并不是Java EE平臺(tái)的一部分。例如,假設(shè)有一個(gè)電話系統(tǒng)的Profile,這個(gè)Profile可能包括了Java EE Web層技術(shù),如Servlet和JSP,EJB企業(yè)組件模塊和持久化JPA,它也可能包含面向電話的技術(shù),如JSR 289:SIP Servlet 1.1,雖然這個(gè)規(guī)范已經(jīng)經(jīng)歷了JCP過程,但還不是Java EE平臺(tái)的一部分。

Profile是由JCP社區(qū)進(jìn)程定義的。此外,Java EE 6規(guī)范為在Java EE Profiles中引用Java EE平臺(tái)技術(shù)定義了規(guī)則,Java EE 6也強(qiáng)調(diào)了一個(gè)原則,那就是創(chuàng)建一個(gè)Profile得有充分的理由,規(guī)范是這樣描述的“創(chuàng)建一個(gè)Profile的決定應(yīng)該考慮它潛在的缺點(diǎn),特別是分片和開發(fā)人員混淆方面,通常,只有當(dāng)開發(fā)人員都支持,并且都理解了應(yīng)用程序可以因此而得到哪些好處時(shí),才需要?jiǎng)?chuàng)建一個(gè)Profile”。

Profile有意獨(dú)立于Java EE 6平臺(tái)發(fā)展,Profile是通過Java規(guī)范請(qǐng)求(Java Specification Request,JSR)提交的,但是按它自己的節(jié)奏發(fā)布的,它與Java EE平臺(tái)的版本并沒有保持完整的一致性,也就是說諸如前面虛構(gòu)的電話系統(tǒng)Profile可以按其行業(yè)發(fā)展情況自由發(fā)展,不與Java EE平臺(tái)或其它Profile綁定,但需要注意,最好定期讓Profile與平臺(tái)同步,特別是平臺(tái)的一個(gè)主要版本發(fā)布時(shí)應(yīng)該同步。目標(biāo)是維持一個(gè)公共的編程模型,簡(jiǎn)化開發(fā)人員跨整個(gè)Java EE 6產(chǎn)品家族的學(xué)習(xí)過程。(51CTO編輯注:在Java EE 6最終通過的投票上,JCP成員仍存有爭(zhēng)議,其中之一就是針對(duì)Profile這個(gè)概念。比如說,SpringSource的Rod Johnson認(rèn)為Profile的引入過于倉(cāng)促,帶入了很多未經(jīng)證實(shí)的技術(shù)。)

Web Profile

Java EE 6定義的第一個(gè)Profile叫做Web Profile,它提供了一個(gè)Java EE平臺(tái)的子集,其設(shè)計(jì)目的主要是用于Web開發(fā),Web Profile只包括大部分開發(fā)人員需要的那些技術(shù)。

下表列出了完整的Java EE 6平臺(tái)技術(shù),Web Profile使用的技術(shù)全部打上勾了。

Java EE平臺(tái)技術(shù)
Web Profile
Web應(yīng)用程序技術(shù)
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
企業(yè)應(yīng)用程序技術(shù)
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技術(shù)
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
管理和安全技術(shù)
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包括一個(gè)Servlet容器和所有傳統(tǒng)的展示技術(shù),如JSP,JSF和JSP的標(biāo)準(zhǔn)Tag庫(kù),EJB 3.1輕量級(jí)版是一個(gè)組件模型,也包括持久化JPA和事務(wù)管理JTA,還有Web分片,你可以使用傳統(tǒng)的框架或庫(kù)(如JAX-RS)輕松地?cái)U(kuò)展Web Profile。

裁減(Pruning)

Java EE 6平臺(tái)中引入的另一個(gè)可以減小平臺(tái)大小的技術(shù)是裁減,裁減一種技術(shù)意味著這種技術(shù)在下一個(gè)平臺(tái)版本中,它可能成為一個(gè)可選組件,而不是一個(gè)必備組件,最終由社區(qū)進(jìn)行決策。裁減可以減小Java EE平臺(tái)產(chǎn)品的大小,因?yàn)镴ava EE應(yīng)用程序廠商可能會(huì)在其實(shí)現(xiàn)中包括被裁減的技術(shù),也可能排除被裁減的技術(shù),如果包括被裁減計(jì)劃的話,必須要提供兼容能力,保證現(xiàn)有應(yīng)用程序可以繼續(xù)運(yùn)行。

#t#下面這些技術(shù)都是即將被裁減的候選者:
◆JSR 101:基于XML的RPC Java API
◆JSR 93: XML注冊(cè)1.0 Java API (JAXR)
◆EJB實(shí)體Bean(定義為JSR 153:EJB 2.0或更早版本的一部分)
◆JSR 88: Java EE應(yīng)用程序部署

小結(jié)

隨著對(duì)Profile的支持,大量新技術(shù)如JAX-RS,增強(qiáng)的擴(kuò)展性功能,如Web分片和平臺(tái)級(jí)的注解,Java EE 6讓Java EE平臺(tái)更加靈活,更加強(qiáng)大,對(duì)于開發(fā)人員而言更加友好。連Hibernate之父Gavin King也推薦開發(fā)者們升級(jí)到Java EE 6,你為什么不下載Java EE 6 SDK,嘗試一個(gè)Java EE 6平臺(tái)下的實(shí)現(xiàn)呢?

原文:Further Ease of Development  作者:Ed Ort

責(zé)任編輯:yangsai 來源: 51CTO.com
相關(guān)推薦

2023-08-11 18:16:08

DevOps開發(fā)

2010-01-18 09:37:39

JSF 2.0Java EE 6

2011-08-12 08:40:39

PaaSOpenShiftJava EE 6

2010-05-27 12:30:52

MySQL工具

2020-11-10 08:54:55

Lombok

2009-10-28 12:39:33

Java EE無框架

2009-10-26 10:05:51

NetBeans 6.

2010-06-02 10:00:25

MySQL工具

2009-06-11 17:54:00

Visual StudDataSet

2009-12-11 11:33:09

NetBeans 6.

2010-05-24 09:47:32

AjaxAjax框架

2011-12-31 15:24:48

JavaJ2EE

2009-12-09 14:31:59

IntelliJ

2010-07-06 10:34:33

RationalJazz需求管理

2010-01-26 09:23:18

Java EE 6

2009-10-20 09:25:17

Java EE 6最終

2010-02-03 09:06:26

Java EE 6

2009-12-15 10:11:10

2011-06-28 13:43:50

Java EE

2011-10-20 10:10:12

OracleJavaJave EE
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)