您好,登錄后才能下訂單哦!
這篇文章主要介紹“Java EE框架的介紹”,在日常操作中,相信很多人在Java EE框架的介紹問(wèn)題上存在疑惑,小編查閱了各式資料,整理出簡(jiǎn)單好用的操作方法,希望對(duì)大家解答”Java EE框架的介紹”的疑惑有所幫助!接下來(lái),請(qǐng)跟著小編一起來(lái)學(xué)習(xí)吧!
確保高效發(fā)展進(jìn)程的建議
很久以前,J2EE,特別是應(yīng)用程序服務(wù)器被認(rèn)為過(guò)于臃腫和“重量級(jí)”。對(duì)于開(kāi)發(fā)人員來(lái)說(shuō),使用此技術(shù)開(kāi)發(fā)應(yīng)用程序會(huì)非常繁瑣且令人沮喪。但是,由于 J2EE 框架的名稱(chēng)已更改為Java EE,因此該假設(shè)不再適用。 Java EE 與其他企業(yè)框架相比區(qū)別在哪以及框架輕量級(jí)的標(biāo)準(zhǔn)是什么?
在選擇技術(shù)時(shí),需要考慮的最重要方面之一是開(kāi)發(fā)人員在開(kāi)發(fā)過(guò)程中的生產(chǎn)力。工程師應(yīng)該花費(fèi)盡可能多的時(shí)間來(lái)實(shí)現(xiàn)用例和創(chuàng)收功能,因?yàn)檫@將使公司朝著目標(biāo)前進(jìn)。
所選擇的技術(shù)和方法應(yīng)該最大限度地縮短開(kāi)發(fā)人員的時(shí)間。具體哪些時(shí)間呢:等待構(gòu)建,測(cè)試和部署; 配置應(yīng)用; 實(shí)施與業(yè)務(wù)用例無(wú)關(guān)的管道; 并配置構(gòu)建環(huán)境和外部依賴(lài)項(xiàng)。 但是大多數(shù)可用技術(shù)都沒(méi)有這樣做。
與其他框架相比,Java EE 的最大優(yōu)勢(shì)之一是使用的API的標(biāo)準(zhǔn)化。標(biāo)準(zhǔn)聽(tīng)起來(lái)可能很無(wú)聊而且不夠創(chuàng)新 - 從本質(zhì)上講,這是真的,因?yàn)镴ava規(guī)范請(qǐng)求(JSR)已經(jīng)成為行業(yè)內(nèi)過(guò)去已經(jīng)過(guò)充分證明的結(jié)果。 但使用這些標(biāo)準(zhǔn)有幾個(gè)優(yōu)點(diǎn)。
Java EE中的特定API - 例如上下文和依賴(lài)注入(CDI),JAX-RS,JSON 處理(JSR 353)和 Bean驗(yàn)證 - 可以很好地協(xié)同工作,并且可以無(wú)縫地相互組合。 最重要的是,CDI 被用作應(yīng)用程序組件之間的“粘合劑”。 該規(guī)范包含諸如*“如果容器支持規(guī)范 A 和 B,那么 A 必須與 B 無(wú)縫集成并良好地工作。”*
例如,JAX-RS 支持 JSONP 類(lèi)型,例如JsonObject
用作請(qǐng)求或響應(yīng)實(shí)體,它支持調(diào)用Bean 校驗(yàn)功能 - 如果驗(yàn)證失敗,則包括正確的HTTP狀態(tài)代碼(參見(jiàn)清單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 類(lèi)型意味著內(nèi)容類(lèi)型將是 application / json
,并且如果驗(yàn)證失敗,將發(fā)送HTTP狀態(tài)代碼 400 Bad Request
。 這無(wú)需編寫(xiě)任何配置代碼就能使一切都完成。
另一個(gè)例子是 CDI 使開(kāi)發(fā)人員能夠通過(guò) @Inject
將任何 bean 和用戶(hù)定義的對(duì)象注入 Java EE托管組件。 請(qǐng)參閱清單2,了解一個(gè) bean 驗(yàn)證 Validator
,它直接使用另一個(gè) 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 驗(yàn)證的 CDI 集成
集成是規(guī)范的一個(gè)主要方面,可以提供直接的開(kāi)發(fā)人員體驗(yàn)。開(kāi)發(fā)人員可以依賴(lài)應(yīng)用程序服務(wù)器進(jìn)行集成和配置工作,從而可以專(zhuān)注于應(yīng)用程序的業(yè)務(wù)邏輯。
由于 Java EE 的配置約定驅(qū)動(dòng)方法,大多數(shù)實(shí)際應(yīng)用程序不需要大量配置。 繁瑣的 XML 描述符的日子結(jié)束了。 對(duì)于簡(jiǎn)單的 Java EE 應(yīng)用程序,您不需要單個(gè) XML 文件。
由于聲明性注釋?zhuān)粋€(gè)簡(jiǎn)單的帶注釋的普通舊 Java 對(duì)象(POJO)處理 HTTP 請(qǐng)求(@Path
),或分別作為 Enterprise JavaBeans(EJB)bean(@ Stateless
) - 包括事務(wù),監(jiān)視或攔截器。過(guò)去,這些方法已在各種框架中得到很好的證明,并已在 Java EE 中進(jìn)行了標(biāo)準(zhǔn)化。
如果需要,XML 描述符仍可用于部署時(shí)配置,但是配置約定有助于最大限度地提高開(kāi)發(fā)人員的工作效率。
少數(shù)實(shí)際企業(yè)項(xiàng)目在部署工件中沒(méi)有任何額外依賴(lài)項(xiàng)的情況下工作。 但這些依賴(lài)關(guān)系的理由主要是由技術(shù)驅(qū)動(dòng) - 例如包括日志記錄或?qū)嶓w映射框架或 Apache Commons 或 Google Guava 等常用庫(kù) - 而不是用例。
Java EE 7 - 尤其是與 Java 8 一起使用時(shí) - 具有足夠的功能來(lái)覆蓋大多數(shù)用例而沒(méi)有任何其他依賴(lài)性。開(kāi)箱即用的內(nèi)容大部分都可以用最少量的代碼來(lái)實(shí)現(xiàn),例如,通過(guò) CDI 提供商的可注入配置,通過(guò)攔截器的斷路器(查看 Adam Bien 的開(kāi)源庫(kù)),或通過(guò)復(fù)雜的收集操作 Java 8 lambda 表達(dá)式和流。
當(dāng)然,你可以爭(zhēng)辯說(shuō)不要在這里重新發(fā)明輪子。 但實(shí)際上,為了節(jié)省一些自編寫(xiě)的代碼行,將兆字節(jié)的外部依賴(lài)項(xiàng)包含在部署工件中并沒(méi)有多大意義。
經(jīng)驗(yàn)表明,最大的問(wèn)題不是直接引入的依賴(lài),而是傳遞的依賴(lài)。傳遞的依賴(lài)經(jīng)常與應(yīng)用程序服務(wù)器上已有的庫(kù)版本沖突,并導(dǎo)致具有挑戰(zhàn)性的沖突。在一天的工作時(shí)間內(nèi),開(kāi)發(fā)人員要花費(fèi)更多時(shí)間來(lái)管理這些沖突,而不是聚焦在將小功能實(shí)現(xiàn)到項(xiàng)目中所需的時(shí)間。這主要適用于具有技術(shù)驅(qū)動(dòng)而非用例驅(qū)動(dòng)的依賴(lài)關(guān)系的情況。
有關(guān)簡(jiǎn)單的 Java EE 7 項(xiàng)目Maven項(xiàng)目對(duì)象模型(POM)的文件啟發(fā),請(qǐng)參閱清單 3,該文檔受Adam Bien的啟發(fā) 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 文件
當(dāng)然,有時(shí)應(yīng)用程序確實(shí)需要集成對(duì)于實(shí)現(xiàn)軟件目標(biāo)至關(guān)重要的庫(kù)。但是,這些依賴(lài)關(guān)系需要通過(guò)業(yè)務(wù)需求來(lái)證明。一般來(lái)說(shuō),它很有意義,可以節(jié)省時(shí)間和精力來(lái)最小化外部生產(chǎn)庫(kù)。
對(duì)于測(cè)試依賴(lài)關(guān)系,這是一個(gè)不同的故事,因?yàn)閹?kù),例如JUnit,Mockito或者在某些情況下,Arquillian - 是至關(guān)重要的。 但同樣,關(guān)注測(cè)試依賴(lài)項(xiàng)列表也是有意義的。
由于應(yīng)用程序服務(wù)器知道Java EE API,因此該API不必包含在部署 artifact 中。 只包含業(yè)務(wù)邏輯 - 只需最少的膠水代碼和交叉關(guān)注點(diǎn)。
因此,這些千字節(jié)大小的工件可以使構(gòu)建時(shí)間非常短,因?yàn)闃?gòu)建過(guò)程不需要復(fù)制很多東西。這可以在每個(gè)構(gòu)建上產(chǎn)生幾秒鐘的差異。 如果總結(jié)開(kāi)發(fā)人員和持續(xù)集成(CI)服務(wù)器所花費(fèi)的所有額外時(shí)間,那就會(huì)產(chǎn)生很大的不同。項(xiàng)目建設(shè)的頻率越高 - 對(duì)于持續(xù)交付(CD)情景尤其如此 - 影響越大。
除了較短的構(gòu)建時(shí)間外,小型部署 artifacts 還可確保較短的發(fā)布和部署時(shí)間。 由于實(shí)現(xiàn)已經(jīng)包含在運(yùn)行時(shí)中,所以在所有情況下,移動(dòng)部件花費(fèi)的時(shí)間都是最小的。
這正是Java EE成為Docker等容器技術(shù)的完美框架的原因。Docker 鏡像基于圖層,構(gòu)建圖像時(shí),基本圖像已包含操作系統(tǒng),Java運(yùn)行時(shí)和應(yīng)用程序。因此,在每個(gè)構(gòu)建中添加的唯一內(nèi)容是部署工件的最后一個(gè)千字節(jié)薄層。與胖WAR或獨(dú)立JAR方法相比,這節(jié)省了時(shí)間和存儲(chǔ) - 不僅在每個(gè)構(gòu)建上,而且在圖像版本化或發(fā)布版本時(shí) 。
無(wú)論在哪個(gè)階段,擁有精簡(jiǎn)的部署 artifacts 都可以實(shí)現(xiàn)非??焖俸透咝У牟渴鸸艿?。
J2EE 應(yīng)用程序服務(wù)器是重量級(jí)軟件在啟動(dòng)和部署時(shí)間,安裝大小和資源占用空間方面的體現(xiàn)。 但是在 Java EE 的新世界中,這已不再適用。
所有現(xiàn)代Java EE 7應(yīng)用程序服務(wù)器(如WildFly,Payara,WebSphere Liberty,Profile和TomEE)都可在幾秒鐘內(nèi)啟動(dòng)和部署。由于內(nèi)部,全面的模塊化,他們只能加載所需的組件并盡快部署精簡(jiǎn)的應(yīng)用程序 artifacts。
現(xiàn)在的安裝尺寸和占地面積非常合理。 應(yīng)用程序服務(wù)器不會(huì)消耗比簡(jiǎn)單的 servlet 容器更多的東西,但它具有完整的 Java EE 功能。 有趣的是,現(xiàn)在運(yùn)行的瀏覽器實(shí)例消耗更多內(nèi)存。
話雖如此,每個(gè)服務(wù)器只部署一個(gè)應(yīng)用程序是可能的,也可以是合理的 - 無(wú)論是在容器中還是在內(nèi)部。 通過(guò)“每個(gè)容器每個(gè)應(yīng)用程序服務(wù)器一個(gè)應(yīng)用程序”方法,您可以為現(xiàn)代微服務(wù)架構(gòu)提供高效且靈活的解決方案。
在打包過(guò)程中,不應(yīng)該繼續(xù)使用EAR文件了。將整個(gè)應(yīng)用程序部署在獨(dú)立的專(zhuān)門(mén)的服務(wù)器上,要求我們?cè)谀莻€(gè)環(huán)境中必須可以訪問(wèn)所有的組件方法,這樣做可以節(jié)省更多的構(gòu)建和部署時(shí)間。除此之外,這還避免了EAR文件傾向于導(dǎo)致的類(lèi)加載層次結(jié)構(gòu)問(wèn)題。
在大多數(shù)云和微服務(wù)部署中,使用獨(dú)立的JAR包。 它們包含應(yīng)用程序和運(yùn)行時(shí)實(shí)現(xiàn)。 在Java EE領(lǐng)域,這種方法可以使用特定于供應(yīng)商的工具鏈來(lái)實(shí)現(xiàn),例如 WildFly Swarm,Payara Micro 或TomEE Embedded。
但是,由于上述原因,我強(qiáng)烈建議盡可能將業(yè)務(wù)邏輯與運(yùn)行時(shí)分開(kāi)。 這意味著將應(yīng)用程序打包在僅包含應(yīng)用程序代碼的WAR文件中。
在我看來(lái),如果由于公司“政治”問(wèn)題而不是技術(shù)原因而無(wú)法控制安裝或操作流程,則獨(dú)立 JAR 文件是一種有用的解決方法。 然后運(yùn)送部署工件中所需的所有內(nèi)容并且只需要 JRE 時(shí)可以解決相當(dāng)多的非技術(shù)問(wèn)題。
企業(yè)項(xiàng)目最有效的解決方案之一如下:
僅在提供 API 時(shí)使用 Java EE 7 和 Java 8
構(gòu)建一個(gè)千字節(jié)大小的 WAR 文件,其中僅包含業(yè)務(wù)邏輯和最小管道(例如 JAX-RS 資源或JPA)
構(gòu)建 Docker 鏡像 - 僅將 WAR 文件添加到包含已配置的應(yīng)用程序服務(wù)器的基礎(chǔ)鏡像
通過(guò)使用容器部署應(yīng)用程序的 CD 管道進(jìn)行傳送
“重量級(jí) Java EE”的日子肯定結(jié)束了。 Java EE 中包含的 API 提供了高效且愉快的開(kāi)發(fā)人員體驗(yàn)以及標(biāo)準(zhǔn)內(nèi)的無(wú)縫集成。 特別是,將應(yīng)用程序代碼與運(yùn)行時(shí)分離的方法可實(shí)現(xiàn)快速,高效的開(kāi)發(fā)過(guò)程。
通過(guò)由多個(gè)供應(yīng)商發(fā)起的新MicroProfile計(jì)劃,將來(lái)可能會(huì)進(jìn)一步縮小Java EE所需的組件。
到此,關(guān)于“Java EE框架的介紹”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實(shí)踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識(shí),請(qǐng)繼續(xù)關(guān)注億速云網(wǎng)站,小編會(huì)繼續(xù)努力為大家?guī)?lái)更多實(shí)用的文章!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。