天天看點

jax-rs注解工作原理介紹

基于設計原則:

· 系統中的每一個對象或是資源都可以通過一個唯一的

· 以遵循

若要在伺服器上建立資源,應該使用 POST 方法;

若要檢索某個資源,應該使用

若要更改資源狀态或對其進行更新,應該使用

若要删除某個資源,應該使用

URI 所通路的每個資源都可以使用不同的形式加以表示(比如 XML 或者 JSON),具體的表現形式取決于通路資源的用戶端,用戶端與服務提供者使用一種内容協商的機制(請求頭與 MIME 類型)來選擇合适的資料格式,最小化彼此之間的資料耦合。

@GET,@PUT,@POST,@DELETE,标注方法是用的HTTP請求的類型.您可以使用它們來綁定根資源或子資源内的 Java 方法與 HTTP 請求方法。HTTP GET 請求被映射到由 @GET 注釋的方法;HTTP POST 請求被映射到由 @POST 注釋的方法

@Produces,标注傳回的MIME媒體類型

@Consumes,标注可接受請求的MIME媒體類型

@PathParam,@QueryParam,@HeaderParam,@CookieParam,@MatrixParam,@FormParam,分别标注方法的參數來自于HTTP請求的不同位置,

@PathParam來自于URL的路徑,

@QueryParam來自于URL的查詢參數,

@HeaderParam來自于HTTP請求的頭資訊,

@CookieParam來自于HTTP請求的Cookie。

@Path("/account/") 
   @POST 
   @Consumes("application/json") 
   public Response createAccount(Account account) { 
       ...... 
   }      

如果使用

而我們bos項目中的

// 如果使用者沒有綁定手機,那就執行綁定操作
@Path("/customer/updatetype/{telephone}")
@GET
public void updateType(@PathParam("telephone") String telephone);      

這個方法隻是在程式中對它進行了調用, 這裡使用了get的方式

各種請求方式的差別請檢視:http 幾種請求方法的差别.doc

通過檢視源碼發現,

所有的請求方式都變成了同一個字元串

Annotations僅僅是中繼資料,和業務邏輯無關。了解起來有點困難,但就是這樣。如果Annotations不包含業務邏輯,那麼必須有人來實作這些邏輯。中繼資料的使用者來做這個事情。Annotations僅僅提供它定義的屬性(類/方法/包/域)的資訊。Annotations的使用者(同樣是一些代碼)來讀取這些資訊并實作必要的邏輯。

當我們使用Java的标注Annotations(例如@Override)時,JVM就是一個使用者,它在位元組碼層面工作。

J2SE5.0版本在 java.lang.annotation提供了四種元注解,專門注解其他的注解:

@Documented –注解是否将包含在JavaDoc中

@Retention –什麼時候使用該注解

@Target? –注解用于什麼地方

@Inherited – 是否允許子類繼承該注解

@Documented–一個簡單的Annotations标記注解,表示是否将注解資訊添加在java文檔中。

@Retention– 定義該注解的生命周期。

RetentionPolicy.SOURCE – 在編譯階段丢棄。這些注解在編譯結束之後就不再有任何意義,是以它們不會寫入位元組碼。@Override, @SuppressWarnings都屬于這類注解。

RetentionPolicy.CLASS – 在類加載的時候丢棄。在位元組碼檔案的進行中有用。注解預設使用這種方式。

RetentionPolicy.RUNTIME– 始終不會丢棄,運作期也保留該注解,是以可以使用反射機制讀取該注解的資訊。我們自定義的注解通常使用這種方式。

@Target – 表示該注解用于什麼地方。如果不明确指出,該注解可以放在任何地方。以下是一些可用的參數。需要說明的是:屬性的注解是相容的,如果你想給7個屬性都添加注解,僅僅排除一個屬性,那麼你需要在定義target包含所有的屬性。