簡體   English   中英

休息服務的應用程序類生命周期是什么?

[英]What is that Application class lifecycle of a rest service?

每個休息服務都是從擴展該應用程序類並定義應用程序路徑開始的嗎? 該應用程序類本身的生命周期是多少? 下面是一個例子:

import javax.ws.rs.core.Application;
@javax.ws.rs.ApplicationPath("resources")
public class ApplicationConfig extends Application {}

這是一個servlet嗎? 它永遠活着嗎? 我該如何理解這門課? 是cdi豆嗎? 服務器是否在每個請求上創建這個類?

什么是Application

Application是 JAX-RS 提供的一個與部署無關的抽象類,用於配置和注冊 JAX-RS 應用程序的組件,它還用於為應用程序提供額外的元數據。

Application是可以使用@Context注釋注入的類型之一。 有關更多詳細信息,請參閱此答案

Application子類

Application子類可以實現諸如getClasses()getSingletons()getProperties()來配置和注冊組件和屬性。

Application子類可以用@ApplicationPath注釋,定義 JAX-RS 資源類(用@Path注釋的類)的基本 URI。 Application子類在 Web 應用程序啟動時實例化一次,並由 JAX-RS 運行時管理。

最簡單的實現可能如下:

@ApplicationPath("api")
public SampleApplication extends Application {

}

在上面的示例中,沒有注冊資源類或提供者,因此 JAX-RS 運行時將掃描 JAX-RS 組件的類路徑並自動注冊它們。

但是,根據Jakub Podlesak 的這篇文章,不鼓勵在生產環境中使用這種方法:

上面的例子效果很好。 啟動時,應用程序只掃描實際的類路徑,並將在那里找到的每個 JAX-RS 組件類添加到實際的運行時配置中。 是不是很棒? 坦率地說,這種配置可以正常工作。 直到有人更改系統配置(系統類路徑)或應用程序的打包方式(然后可以從應用程序類路徑中添加/刪除新的第 3 方組件)。 這些更改可能超出您的控制,如果其中之一發生,您的應用程序配置可能會中斷。 因此,在生產環境中使用這種配置是不明智的。

Jersey 是 JAX-RS 參考實現,提供了ResourceConfig類。 Application相比, ResourceConfig提供了高級功能來簡化 JAX-RS 組件的注冊,例如掃描提供的類路徑或一組包名稱中的根資源和提供程序類等。更多詳細信息,請參閱Jersey 文檔.

使用多個Application子類

還值得一提的是,您並不受限於每個 Web 應用程序的單個Application子類。 同一個 WAR 可以有多個Application子類。 有關更多詳細信息,請查看Adam Bien 的這篇文章

要在一個 WAR 中部署多個具有不同 URI 的 JAX-RS 應用程序,您必須為每個這樣的應用程序創建一個javax.ws.rs.core.Application子類(或為此使用web.xml )。 顯然,Java EE 中普遍存在的配置約定(或異常配置)不再起作用:您必須通過覆蓋方法getClassesgetSingletons來顯式配置每個子類中的資源:

 @Path("first") public class FirstResource { @GET public String first() { return "first"; } }
 @ApplicationPath("one") public class JAXRSConfigurationOne extends Application { @Override public Set<Class<?>> getClasses() { Set<Class<?>> resources = new HashSet<>(); resources.add(FirstResource.class); return resources; } }
 @Path("second") public class SecondResource { @GET public String first() { return "second"; } }
 @ApplicationPath("two") public class JAXRSConfigurationTwo extends Application { @Override public Set<Class<?>> getClasses() { Set<Class<?>> resources = new HashSet<>(); resources.add(SecondResource.class); return resources; } }

兩個 JAX-RS 應用程序都可以通過不同的 URI 訪問: http://localhost:8080/multiple-roots/one/firsthttp://localhost:8080/multiple-roots/two/second

如果不存在Application子類怎么辦?

如果不存在Application子類,則需要 JAX-RS 實現添加 servlet 並將其名稱設置為javax.ws.rs.Application並自動發現必須與應用程序一起打包的所有資源類和提供者。

有關更多詳細信息,請查看JAX-RS 2.1 規范的第 2 章。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM