1. 程式人生 > >Java EE—最輕量級的企業框架?

Java EE—最輕量級的企業框架?

確保高效發展程序的建議

很久以前,J2EE,特別是應用程式伺服器被認為過於臃腫和“重量級”。對於開發人員來說,使用此技術開發應用程式會非常繁瑣且令人沮喪。但是,由於 J2EE 框架的名稱已更改為Java EE,因此該假設不再適用。 Java EE 與其他企業框架相比區別在哪以及框架輕量級的標準是什麼?

在選擇技術時,需要考慮的最重要方面之一是開發人員在開發過程中的生產力。工程師應該花費盡可能多的時間來實現用例和創收功能,因為這將使公司朝著目標前進。

所選擇的技術和方法應該最大限度地縮短開發人員的時間。具體哪些時間呢:等待構建,測試和部署; 配置應用; 實施與業務用例無關的管道; 並配置構建環境和外部依賴項。 但是大多數可用技術都沒有這樣做。

1.為什麼標準?

與其他框架相比,Java EE 的最大優勢之一是使用的API的標準化。標準聽起來可能很無聊而且不夠創新 - 從本質上講,這是真的,因為Java規範請求(JSR)已經成為行業內過去已經過充分證明的結果。 但使用這些標準有幾個優點。

2.整合規範

Java EE中的特定API - 例如上下文和依賴注入(CDI),JAX-RS,JSON 處理(JSR 353)和 Bean驗證 - 可以很好地協同工作,並且可以無縫地相互組合。 最重要的是,CDI 被用作應用程式元件之間的“粘合劑”。 該規範包含諸如“如果容器支援規範 A 和 B,那麼 A 必須與 B 無縫整合並良好地工作。”

例如,JAX-RS 支援 JSONP 型別,例如JsonObject

用作請求或響應實體,它支援呼叫Bean 校驗功能 - 如果驗證失敗,則包括正確的HTTP狀態程式碼(參見清單1)。

@Path("duke") 
public class DukeResource {           
    @GET          
    public JsonObject getDuke() {                   
        return Json.createObjectBuilder().add("name", "Duke").build();         
    }     
    @POST         
    public void create(@Valid @NotPlayedYet Game game) {    
                // game object has been validated at this point         
    }
}

清單1. JAX-RS的JSONP和Bean Validation整合

使用 JSONP 型別意味著內容型別將是 application / json,並且如果驗證失敗,將傳送HTTP狀態程式碼 400 Bad Request。 這無需編寫任何配置程式碼就能使一切都完成。

另一個例子是 CDI 使開發人員能夠通過 @Inject 將任何 bean 和使用者定義的物件注入 Java EE託管元件。 請參閱清單2,瞭解一個 bean 驗證 Validator,它直接使用另一個 CDI 託管bean。

public class GameNotPlayedValidator implements ConstraintValidator<NotPlayedYet, Game> {          
    @Inject          
    GameHistory history;          
    public void initialize(NotPlayedYet constraint) {                 
        // no initialization needed         
    }      

    public boolean isValid(Game game, ConstraintValidatorContext context) {                   
        return !history.exists(game);        
    }
}

清單2. bean 驗證的 CDI 整合

整合是規範的一個主要方面,可以提供直接的開發人員體驗。開發人員可以依賴應用程式伺服器進行整合和配置工作,從而可以專注於應用程式的業務邏輯。

3.按配置約定驅動開發

由於 Java EE 的配置約定驅動方法,大多數實際應用程式不需要大量配置。 繁瑣的 XML 描述符的日子結束了。 對於簡單的 Java EE 應用程式,您不需要單個 XML 檔案。

由於宣告性註釋,一個簡單的帶註釋的普通舊 Java 物件(POJO)處理 HTTP 請求(@Path),或分別作為 Enterprise JavaBeans(EJB)bean(@ Stateless) - 包括事務,監視或攔截器。過去,這些方法已在各種框架中得到很好的證明,並已在 Java EE 中進行了標準化。

如果需要,XML 描述符仍可用於部署時配置,但是配置約定有助於最大限度地提高開發人員的工作效率。

4.外部依賴

少數實際企業專案在部署工件中沒有任何額外依賴項的情況下工作。 但這些依賴關係的理由主要是由技術驅動 - 例如包括日誌記錄或實體對映框架或 Apache Commons 或 Google Guava 等常用庫 - 而不是用例。

Java EE 7 - 尤其是與 Java 8 一起使用時 - 具有足夠的功能來覆蓋大多數用例而沒有任何其他依賴性。開箱即用的內容大部分都可以用最少量的程式碼來實現,例如,通過 CDI 提供商的可注入配置,通過攔截器的斷路器(檢視 Adam Bien 的開源庫),或通過複雜的收集操作 Java 8 lambda 表示式和流。

當然,你可以爭辯說不要在這裡重新發明輪子。 但實際上,為了節省一些自編寫的程式碼行,將兆位元組的外部依賴項包含在部署工件中並沒有多大意義。

經驗表明,最大的問題不是直接引入的依賴,而是傳遞的依賴。傳遞的依賴經常與應用程式伺服器上已有的庫版本衝突,並導致具有挑戰性的衝突。在一天的工作時間內,開發人員要花費更多時間來管理這些衝突,而不是聚焦在將小功能實現到專案中所需的時間。這主要適用於具有技術驅動而非用例驅動的依賴關係的情況。

有關簡單的 Java EE 7 專案Maven專案物件模型(POM)的檔案啟發,請參閱清單 3,該文件受Adam Bien的啟發 Java EE 7 Essentials Archetype.

<project xmlns="http://maven.apache.org/POM/4.0.0"         
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"         
     xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">     
 <modelVersion>4.0.0</modelVersion>     
 <groupId>com.sebastian-daschner</groupId>     
 <artifactId>game-of-duke</artifactId>     
 <version>1.0-SNAPSHOT</version>     
 <packaging>war</packaging>      

 <dependencies>         
     <dependency>             
          <groupId>javax</groupId>             
          <artifactId>javaee-api</artifactId>             
          <version>7.0</version>             
          <scope>provided</scope>         
     </dependency>     
 </dependencies>      

 <build>         
     <finalName>game-of-duke</finalName>     
 </build>      

 <properties>         
     <maven.compiler.source>1.8</maven.compiler.source>         
     <maven.compiler.target>1.8</maven.compiler.target>         
     <failOnMissingWebXml>false</failOnMissingWebXml>         
     <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>     
     </properties> 
</project>

清單3. Java EE 7 Maven POM 檔案

當然,有時應用程式確實需要整合對於實現軟體目標至關重要的庫。但是,這些依賴關係需要通過業務需求來證明。一般來說,它很有意義,可以節省時間和精力來最小化外部生產庫。

對於測試依賴關係,這是一個不同的故事,因為庫,例如JUnit,Mockito或者在某些情況下,Arquillian - 是至關重要的。 但同樣,關注測試依賴項列表也是有意義的。

5.精簡部署 Artifacts

由於應用程式伺服器知道Java EE API,因此該API不必包含在部署 artifact 中。 只包含業務邏輯 - 只需最少的膠水程式碼和交叉關注點。

因此,這些千位元組大小的工件可以使構建時間非常短,因為構建過程不需要複製很多東西。這可以在每個構建上產生幾秒鐘的差異。 如果總結開發人員和持續整合(CI)伺服器所花費的所有額外時間,那就會產生很大的不同。專案建設的頻率越高 - 對於持續交付(CD)情景尤其如此 - 影響越大。

除了較短的構建時間外,小型部署 artifacts 還可確保較短的釋出和部署時間。 由於實現已經包含在執行時中,所以在所有情況下,移動部件花費的時間都是最小的。

6.Docker的理想框架

這正是Java EE成為Docker等容器技術的完美框架的原因。Docker 映象基於圖層,構建影象時,基本影象已包含作業系統,Java執行時和應用程式。因此,在每個構建中新增的唯一內容是部署工件的最後一個千位元組薄層。與胖WAR或獨立JAR方法相比,這節省了時間和儲存 - 不僅在每個構建上,而且在影象版本化或釋出版本時 。

無論在哪個階段,擁有精簡的部署 artifacts 都可以實現非常快速和高效的部署管道。

7.現代應用伺服器

J2EE 應用程式伺服器是重量級軟體在啟動和部署時間,安裝大小和資源佔用空間方面的體現。 但是在 Java EE 的新世界中,這已不再適用。

所有現代Java EE 7應用程式伺服器(如WildFly,Payara,WebSphere Liberty,Profile和TomEE)都可在幾秒鐘內啟動和部署。由於內部,全面的模組化,他們只能載入所需的元件並儘快部署精簡的應用程式 artifacts。

現在的安裝尺寸和佔地面積非常合理。 應用程式伺服器不會消耗比簡單的 servlet 容器更多的東西,但它具有完整的 Java EE 功能。 有趣的是,現在執行的瀏覽器例項消耗更多記憶體。

話雖如此,每個伺服器只部署一個應用程式是可能的,也可以是合理的 - 無論是在容器中還是在內部。 通過“每個容器每個應用程式伺服器一個應用程式”方法,您可以為現代微服務架構提供高效且靈活的解決方案。

8.打包

在打包過程中,不應該繼續使用EAR檔案了。將整個應用程式部署在獨立的專門的伺服器上,要求我們在那個環境中必須可以訪問所有的元件方法,這樣做可以節省更多的構建和部署時間。除此之外,這還避免了EAR檔案傾向於導致的類載入層次結構問題。

在大多數雲和微服務部署中,使用獨立的JAR包。 它們包含應用程式和執行時實現。 在Java EE領域,這種方法可以使用特定於供應商的工具鏈來實現,例如 WildFly Swarm,Payara Micro 或TomEE Embedded。

但是,由於上述原因,我強烈建議儘可能將業務邏輯與執行時分開。 這意味著將應用程式打包在僅包含應用程式程式碼的WAR檔案中。

在我看來,如果由於公司“政治”問題而不是技術原因而無法控制安裝或操作流程,則獨立 JAR 檔案是一種有用的解決方法。 然後運送部署工件中所需的所有內容並且只需要 JRE 時可以解決相當多的非技術問題。

9.關於高效研發程序的建議

企業專案最有效的解決方案之一如下:

  • 僅在提供 API 時使用 Java EE 7 和 Java 8
  • 構建一個千位元組大小的 WAR 檔案,其中僅包含業務邏輯和最小管道(例如 JAX-RS 資源或JPA)
  • 構建 Docker 映象 - 僅將 WAR 檔案新增到包含已配置的應用程式伺服器的基礎映象
  • 通過使用容器部署應用程式的 CD 管道進行傳送

10.結論

“重量級 Java EE”的日子肯定結束了。 Java EE 中包含的 API 提供了高效且愉快的開發人員體驗以及標準內的無縫整合。 特別是,將應用程式程式碼與執行時分離的方法可實現快速,高效的開發過程。

通過由多個供應商發起的新MicroProfile計劃,將來可能會進一步縮小Java EE所需的元件。

參考資料

  • Java EE 7 Essentials Archetype
  • 部落格文章: "Stop saying 'heavyweight'"
  • Java EE circuit breaker implementation

原文:https://community.oracle.com/docs/DOC-1008823

作者:Sebastian Daschner

譯者:[KeepGoingPawn](https://blog.csdn.net/hengji666

9月福利,關注公眾號

後臺回覆:004,領取8月翻譯集錦!

往期福利回覆:001,002, 003即可領取!

相關推薦

Java EE最輕量級企業框架?

確保高效發展程序的建議 很久以前,J2EE,特別是應用程式伺服器被認為過於臃腫和“重量級”。對於開發人員來說,使用此技術開發應用程式會非常繁瑣且令人沮喪。但是,由於 J2EE 框架的名稱已更改為Java EE,因此該假設不再適用。 Java EE 與其他企業框架相比區別在哪以及框架輕量級的標準是什麼? 在選擇

Java EE網際網路輕量級框架整合開發》 讀書筆記

備註:匯入隨書程式碼 剛開始看這本書,第一件事就是把程式碼匯入到eclipse中。 隨書程式碼的目錄結構為: 每一章就是一個工程,比如Chapter2, 如下: 將程式碼匯入到eclipse 分兩個步驟: (1)開啟工程,點選“File”->“Open Project fro

Java EE網際網路輕量級框架整合開發》Spring基礎筆記

Spring IOC容器的初始化和依賴注入 Spring IOC容器初始化有兩個步驟,先定義,然後初始化和依賴注入 Bean的定義分為3步: 1.Resource定位,這步是IOC容器根據開發者的配置,進行資源定位,定位有通過XML和註解兩種方式。 2.BeanDefinition的載入

Java EE網際網路輕量級框架整合開發》Mybatis筆記

1.MyBatis的核心元件 SqlSessionFactoryBuilder(構造器):它會根據配置或者程式碼來生成SqlSessionFactory,採用的是分步構建的Builder模式 SqlSessionFactory(工廠介面):依靠他來生成SqlSession,使用的是工廠模

Java EE網際網路輕量級框架整合開發》入門與技術基礎

1.Hibernate和Mybatis的區別 Hibernate不需要編寫大量的SQL,就可以完全對映,同時提供了日誌、快取、級聯(級聯比Mybatis強大)等特性,此外還體用HQL對POJO進行操作,致命缺陷是由於無須SQL,當多表進行關聯超過3個時,通過Hibernate的級聯會造成太多的效能的

Java EE網際網路輕量級框架整合開發》讀書筆記

2017年12月13日前言其實一直在IT相關領域幹了這麼久,讀了這本書的前言才明白網際網路系統和傳統的管理系統的區別:移動網際網路的新要求:----高併發----高響應----資料一致性----技術複雜

Java EE開發四大常用框架

javaee spring hibernate struts 我們對Java EE的框架有過很多介紹, 本文將對Java EE中常用的四個框架做一下系統的歸納,希望大家喜歡。 StrutsStruts是一個基於Sun Java EE平臺的MVC框架,主要是采用Servlet和JSP技術來實現的

java ee框架

不同 軟件 相關 劃分 數據庫 sys 使用 正是 現在 軟件152唐偉 JAVAEE使用多層的分布式應用模型,應用邏輯按功能劃分為組件,各個應用組件根據他們所在的層分布在不同的機器上。 事實上,sun設計 JAVAEE的初衷正是為了解決兩層模式(client/server

Java EE 架構設計——基於okhttp3 的網絡框架設計

知識 tap 使用 pass web asc 封裝 useragent 占用 轉載請註明出處:http://blog.csdn.net/smartbetter/article/details/77893903 本篇文章帶大家設計一套滿意業務需求、代碼健壯高效(高內聚低耦

JAVA EE期末項目-企業論壇系統

更新 img height 模塊 用戶 後臺管理 java ee 還需 信息 企業論壇系統 一項目成員及分工 我(計科二班陸迪)和我的小夥伴(計科二班鄭淑丹)設計了一個企業論壇系統。 我的工作:理解分析代碼,編寫文檔。 二、項目需求分析 對於一個論壇系統來說,需要提供前臺展

Java EE入門教程系列第一章Java EE的概述(二)——Java EE技術框架和開發工具

1.3Java EE的技術框架 從技術的角度劃分,完整的Java EE分成了4個部分:元件技術、服務技術、通訊技術和架構技術。 下面給出的是一個適合初學者的體系結構簡化圖,暫時接觸不到的部分統一用“支援技術”表示,我們暫時只專注於與應用級開發相關的技術即可。 1.元件技術 這是

java ee SSM框架連線資料庫四個配置檔案之二: mybatis-config.xml檔案配置

<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD

Java EE 框架技術讀書筆記

一些術語或者關鍵字 MyBatis MyBatis 作為持久層框架,支援定製化 SQL、儲存過程以及高階對映。MyBatis 避免了幾乎所有的 JDBC 程式碼和手動設定引數以獲取結果集。MyBatis 可以使用簡單的 XML 或註解來配置和對映原生資訊,將介面和 Java 的 POJOs(

【JavaEE】經典JAVA EE企業應用實戰-讀書筆記1

今天開始閱讀李剛的書《經典JAVA EE企業應用實戰 基於WebLogic JBoss的JSF+EJB3+JPA整合開發》這本書, 並記錄下讀書筆記,以方便以後參考。 Java EE應用大致可分為如下幾層: 1,Domain Object(領域物件)層:此層由系列的POJ

Java EE開發四大常用框架

Struts     Struts是一個基於Sun Java EE平臺的MVC框架,主要是採用Servlet和JSP技術來實現的。     Struts框架可分為以下四個主要部分,其中三個就和MVC模式緊密相關:     1、模型 (Model),本質上來說在Struts中Model是一個Action

Spring+MyBatis 企業應用實戰讀書筆記之一Java EE應用

Java EE 應用的基礎知識 Jave EE 應用的模型和相關元件 Java EE 應用的結構和優勢 輕量級 Java EE 應用的相關技術 1.1 Java EE 應用概述 1.1.1 Java EE 應用的分層模式 Domain Object(領域物件)層 DAO(

Java EE常用框架的個人看法

Java EE常用框架,就我目前而言用過的有:spring、struts、hibernate以及spring mvc、mybaties等框架,當然還有所在公司自主開發的框架,做企業應用的其實本質還是上

java-mybaits-00102-mybatis框架原理

需求變化 java hiberna 麻煩 開發 rep ati 如果能 遍歷 1、mybatis是什麽?   mybatis是一個持久層的框架,是apache下的頂級項目。是一個不完全的ORM框架。   mybatis托管到goolecode下,再後來托管到github

Java EE

src ack java obj 硬件 企業 edi 分布式 evel 【什麽是Java EE】 suite of specifications for APIs, a distributed computing architecture, and definitions