javascript
jersey spring_实施Jersey 2 Spring集成
jersey spring
Jersey是Oracle提供的出色的Java JAX-RS規范參考實現。 去年,當我們開始為大容量網站構建RESTful后端Web服務時,我們選擇使用JAX-RS API作為我們的REST框架和Spring框架來進行依賴項注入。 澤西島是我們選擇的JAX-RS實現。
項目啟動時,JAX-RS API 2.0規范尚未發布,Jersey 2.0也未發布。 由于我們沒有發現JAX-RS 1.1的任何根本缺陷,并且因為存在針對Jersey 1.1的穩定的Spring集成模塊,所以我們決定使用經過實踐檢驗的版本,而不是采用前沿技術。
盡管如此,我還是想知道采用較新版本會獲得什么,所以我開始在空閑時間查看JAX-RS 2 API并使用Jersey 2進行原型制作。我注意到Jersey 2缺乏與Spring框架集成的功能,適用于以前的版本。 進一步研究該問題,我發現舊的Spring集成模塊無法直接移植到Jersey2。原因是Jersey 1建立在自定義內部依賴注入框架上,而Jersey 2已切換到HK2進行依賴注入。 ( HK2是在GlassFish中使用的有趣的,輕量級的依賴注入框架。)
我實現Jersey-Spring集成的最初目標非常簡單:
將在應用程序上下文XML中聲明的Spring bean注入JAX-RS資源類(使用@Autowired批注或XML配置)
因此,我認為我需要更深入地研究,并開始研究Jersey源代碼。 我很高興地注意到,澤西島的開發正在以開放和平易近人的方式進行。 源代碼托管在GitHub上并經常更新。 經過一段時間的挖掘,Jersey Spring集成的高級設計開始形成。 在第一個可運行的原型制作之前,進行了大量的實驗和多次迭代。 那時,作為一個樂觀主義者,我希望我快完成了,并聯系了球衣用戶的郵件列表以獲取有關設計和實現的反饋。 反饋:添加更多用例,提供示例代碼,實現測試自動化,簽署Oracle貢獻者協議(從澤西軟件產品的角度來看,反饋當然是非常合理的)。 因此,雖然還沒有完全回到繪圖板上,但是到了這一點,我意識到最后一英里要比我期望的要長得多。
最終,Jersey-Spring集成最終合并到Jersey v2.2版本的Jersey 2代碼庫中。 集成API基于注釋,并支持以下功能:
- 將Spring bean注入到Jersey管理的JAX-RS資源類中(使用org.springframework.beans.factory.annotation.Autowired或javax.inject.Inject)。 @Qualifier和@Named批注可用于進一步限定注入的實例。
- 允許JAX-RS資源類實例生命周期由Spring而不是Jersey管理(org.springframework.stereotype.Component)
- 支持不同的Spring bean注入范圍:單例,請求,原型。 Bean作用域在applicationContext.xml中聲明。
實施
可以在主Jersey源存儲庫中找到Jersey-Spring集成的源代碼: https : //github.com/jersey/jersey/tree/2.5.1/ext/spring3/src/main/java/org/glassfish/球衣/服務器/Spring
Jersey-Spring集成包含以下實現類:
org.glassfish.jersey.server.spring.SpringComponentProvider
此ComponentProvider實現已向Jersey SPI擴展機制注冊,并負責引導Jersey 2 Spring集成。 它使Jersey跳過了Spring組件的JAX-RS生命周期管理。 否則,Jersey會將這些類綁定到具有Jersey默認范圍的HK2 ServiceLocator,而無需遵守為Spring組件聲明的范圍。 此類還初始化HK2彈簧橋,并向HK2 ServiceLocator注冊Spring @Autowired注釋處理程序。 當在servlet上下文之外運行時,將自定義org.springframework.web.context.request.RequestScope實現配置為實現Bean的請求范圍。
org.glassfish.jersey.server.spring.AutowiredInjectResolver
HK2注入解析器,該注入器注入使用Spring框架@Autowired批注聲明的依賴項。 HK2調用此解析器,并要求它解析使用@Autowired注釋的依賴項。
org.glassfish.jersey.server.spring.SpringLifecycleListener
處理容器生命周期事件。 重新加載時刷新Spring上下文,并在關閉時將其關閉。
org.glassfish.jersey.server.spring.SpringWebApplicationInitializer
一個便利類,可以幫助用戶避免在web.xml中配置Spring ContextLoaderListener和RequestContextListener。 或者,用戶可以在Web應用程序web.xml中配置它們。
除了實際的實現代碼外,該集成還包括示例和測試 ,這對于使開發人員入門非常有幫助。
JAX-RS規范定義了自己的依賴項注入API。 另外,Jersey支持不受JAX-RS規范要求的JSR 330樣式注入。 Jersey-Spring集成增加了對Spring樣式注入的支持。 JAX-RS注入和Spring集成都提供了一種將對象綁定到注冊表中的機制,以便以后可以查找和注入對象。 如果使用的是完整的Java EE應用程序服務器(例如Glassfish),則還可以選擇通過CDI API綁定對象。 在非Java EE環境中,可以通過嵌入容器實現(例如Weld)來使用CDI。 另一個綁定方法是使用Jersey特定的API。 測試代碼包括一個JAX-RS應用程序類,該類演示了如何完成此工作。
修改球衣Spring
如果您想在Jersey-Spring上工作,則需要檢查并構建Jersey 2代碼庫。 該過程相當容易并且有據可查: https : //jersey.java.net/documentation/2.5.1/how-to-build.html
您只需要克隆存儲庫并構建源即可。 構建系統基于Maven。 您還可以使用其Maven插件輕松地將代碼庫導入所選的IDE(與IDEA 12,Eclipse 4.3和NetBeans 8.0 beta進行了嘗試)。 但是,我注意到,某些集成測試在Maven 3.0中失敗了,我不得不升級到3.1,但是除此之外,沒有任何問題。
構建Jersey 2之后,您可以修改Spring集成模塊,并僅構建更改的模塊以節省時間。
測驗
Jersey-Spring集成測試已使用Jersey測試框架構建 ,并且在maven-failsafe-plugin的控制下運行。 集成測試由實際的測試代碼和測試執行的JAX-RS后端Webapp組成。 使用jetty-maven-plugin將后端部署到外部Jetty servlet容器中。 Jersey-Spring測試可以與其余測試分開執行。 集成測試可在以下單獨的Maven子模塊中找到: https : //github.com/jersey/jersey/tree/2.5.1/tests/integration/spring3
除了演示Jersey-Spring的基本功能外,測試還顯示了如何使用不同的Spring bean范圍:單例,請求,原型。 測試還展示了使用JAX-RS應用程序類在不同范圍內在容器中注冊您自己的依賴項。
結論
我認為JAX-RS 2.0 API提供了一種在Java中實現RESTful接口的好方法。 Jersey JAX-RS參考實現的開發正在以公開透明的方式進行。 澤西島還有大量活躍的用戶社區。
正如小弗雷德里克·布魯克斯(Frederick Brooks,Jr.)所說:“所有程序員都是樂觀主義者”。 通常很容易低估將代碼與相對較大和復雜的代碼庫集成所需的工作量,尤其是當您需要在多個不同框架(在本例中為Jersey,HK2和Spring框架)之間進行調解時。 另外,盡管Jersey擁有相當不錯的用戶文檔,但我錯過了有關設計和實現的高級體系結構文檔。 為了確定正確的集成點,需要進行大量的探索。 幸運的是,Jersey構建系統非常易于使用,并且僅允許構建選定的零件,這使得實驗和變更-構建-測試周期相對較快。
Jersey和Spring框架都提供了豐富的功能集,您可以通過多種方式一起使用它們。 當前形式的Jersey-Spring集成涵蓋了兩者之間的幾個基本集成方案。 如果發現不支持您的特定方案,請加入jersey-users郵件列表進行討論。 您還可以檢出代碼,實施更改并通過在GitHub上提交拉取請求來貢獻它們。
翻譯自: https://www.javacodegeeks.com/2014/02/implementing-jersey-2-spring-integration.html
jersey spring
總結
以上是生活随笔為你收集整理的jersey spring_实施Jersey 2 Spring集成的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 普吉岛在哪个国家的领土(普吉岛属于哪个国
- 下一篇: 电脑机箱风扇怎么装?电脑机箱风扇安装教程