Java EE 8的前5个新功能
備受期待的Java Enterprise Edition 8版本擁有兩個(gè)激動(dòng)人心的新API(JSON綁定1.0和Java EE Security 1.0)以及對(duì)當(dāng)前API的改進(jìn)(JAX-RS 2.1,Bean Validation 2.0,JSF 2.3,CDI 2.0,JSON-P) 1.1,JPA 2.2和Servlet 4.0)。 這是近四年來Oracle企業(yè)Java平臺(tái)的第一個(gè)版本,它包含數(shù)百個(gè)新功能,更新的功能和錯(cuò)誤修復(fù)。 那么最好的新功能是什么? 我試圖在這篇博客文章中回答這個(gè)高度主觀的問題。
TL; DR的前5個(gè)新功能
全新的安全性API包含三個(gè)出色的新功能:標(biāo)識(shí)存儲(chǔ)抽象,新的安全性上下文以及新的注釋驅(qū)動(dòng)的身份驗(yàn)證機(jī)制,使web.xml文件聲明過時(shí)。 這就是我今天要談?wù)摰淖詈笠粋€(gè)。
JAX-RS 2.1中新的反應(yīng)式客戶端包含反應(yīng)式編程風(fēng)格,并允許端點(diǎn)結(jié)果的組合。
新的JSON綁定API為JSON序列化和反序列化提供了本機(jī)Java EE解決方案。
CDI 2.0中有趣的新功能允許在Java SE應(yīng)用程序中引導(dǎo)CDI。
Servlet 4.0中的服務(wù)器推送功能使Servlet規(guī)范與HTTP / 2保持一致。
你準(zhǔn)備好了嗎? 因此,讓我們開始吧。
1.新的安全性API
可能,添加到Java EE 8中最重要的一項(xiàng)新功能就是新的安全性API。
此新API的主要?jiǎng)訖C(jī)是簡(jiǎn)化,標(biāo)準(zhǔn)化和現(xiàn)代化跨容器和實(shí)現(xiàn)處理安全性問題的方式。 他們做得很好。
由于三個(gè)新的注釋使web.xml文件聲明變得多余,Web身份驗(yàn)證的配置已實(shí)現(xiàn)現(xiàn)代化。 稍后再詳細(xì)介紹。
新的安全上下文 API標(biāo)準(zhǔn)化了Servlet和EJB容器執(zhí)行身份驗(yàn)證以及
新的身份存儲(chǔ)庫(kù)抽象可簡(jiǎn)化身份存儲(chǔ)庫(kù)的使用。
因此,讓我們看一下其中的第一個(gè)。
注釋驅(qū)動(dòng)的認(rèn)證機(jī)制
此功能全部與配置Web安全有關(guān)。 web.xml文件中需要哪種傳統(tǒng)的XML聲明。
有了HttpAuthenticationMechanism接口,該接口代表HTTP身份驗(yàn)證,并帶有三個(gè)內(nèi)置的啟用CDI的實(shí)現(xiàn),每個(gè)實(shí)現(xiàn)都可以表示可配置Web安全的三種方式之一,因此不再需要此操作。
使用這些注釋之一觸發(fā)它們。
@BasicAuthenticationMechanismDefinition @FormAuthenticationMechanismDefinition @CustomFormAuthenticationMechanismDefinition它們復(fù)制了servlet容器中已經(jīng)可用的經(jīng)典HTTP基本身份驗(yàn)證,表單和基于自定義表單的身份驗(yàn)證的功能。
例如,要啟用基本身份驗(yàn)證, 僅需向您的servlet添加BasicAuthenticationMechanismDefinition批注即可。
@BasicAuthenticationMechanismDefinition(realmName="${'user-realm'}") @WebServlet("/user") @DeclareRoles({ "admin", "user", "demo" }) @ServletSecurity(@HttpConstraint(rolesAllowed = "user")) public class UserServlet extends HttpServlet { … }現(xiàn)在,您可以放棄XML配置,并使用這些新注釋之一來提高Web安全性。
2. JAX-RS 2.1:新的反應(yīng)式客戶端
讓我們看一下JAX-RS 2.1中新的反應(yīng)式客戶端,以及它如何包含反應(yīng)式編程風(fēng)格。
被動(dòng)式方法以數(shù)據(jù)流的思想為中心,該模型具有一個(gè)執(zhí)行模型,該模型可以在流中傳播更改。 一個(gè)典型的示例是JAX-RS方法調(diào)用。 當(dāng)調(diào)用返回時(shí),對(duì)方法調(diào)用的結(jié)果執(zhí)行下一個(gè)操作(可能是繼續(xù),完成或錯(cuò)誤)。
您可以將其視為流程的異步管道 ,而下一個(gè)流程將對(duì)前一個(gè)流程的結(jié)果起作用,然后將其流程的結(jié)果傳遞給鏈中的下一個(gè)流程。 數(shù)據(jù)流是可組合的,因此您可以將許多流組合并轉(zhuǎn)換為一個(gè)結(jié)果。
通過在用于構(gòu)造客戶端實(shí)例的Invocation.Builder實(shí)例上調(diào)用rx()方法來啟用反應(yīng)式功能。 它的返回類型是帶有參數(shù)化響應(yīng)類型的CompletionStage 。 Java 8中引入了CompletionStage接口,并提出了一些有趣的可能性。
例如,在此代碼段中,對(duì)不同的端點(diǎn)進(jìn)行了兩次調(diào)用,然后將結(jié)果合并:
CompletionStage<Response> cs1 = ClientBuilder.newClient().target(".../books/history").request().rx().get();CompletionStage<Response> cs2 = ClientBuilder.newClient().target(".../books/geology").request().rx().get();cs1.thenCombine(cs2, (r1, r2) ->r1.readEntity(String.class) + r2.readEntity(String.class)).thenAccept(System.out::println);3.新的JSON綁定API
現(xiàn)在,讓我們繼續(xù)下一個(gè)重要功能。 新的JSON綁定API,此API為JSON序列化和反序列化提供了本機(jī)Java EE解決方案 。
以前,如果要在JSON上對(duì)Java進(jìn)行序列化和反序列化,則必須依靠Jackson或GSON之類的第三方API。 不再。 使用新的JSON Binding API,您可以擁有所有可能希望本機(jī)可用的功能。
從Java對(duì)象生成JSON文檔再簡(jiǎn)單不過了。 只需調(diào)用toJson()方法并將其要序列化的實(shí)例傳遞給它即可。
String bookJson = JsonbBuilder.create().toJson(book);將JSON文檔反序列化為Java對(duì)象也很簡(jiǎn)單。 只需將JSON文檔和目標(biāo)類傳遞給fromJson()方法,然后彈出您的Java對(duì)象。
Book book = JsonbBuilder.create().fromJson(bookJson, Book.class);但這還不是全部。
行為定制
通過注釋字段,JavaBeans方法和類,可以自定義默認(rèn)的序列化和反序列化行為。
例如,您可以使用@JsonbNillable定制空處理,并使用@JsonbPropertyOrder注釋定制在類級(jí)別指定的屬性順序。 你可以指定與@JsonbNumberFormat()標(biāo)注的數(shù)字格式,并與@JsonbProperty()注釋更改字段的名稱。
@JsonbNillable @JsonbPropertyOrder(PropertyOrderStrategy.REVERSE) public class Booklet {@JsonbProperty("cost")@JsonbNumberFormat("#0.00")private Float price;}或者,您可以選擇使用運(yùn)行時(shí)配置構(gòu)建器JsonbConfig來處理定制:
JsonbConfig jsonbConfig = new JsonbConfig().withPropertyNamingStrategy(PropertyNamingStrategy.LOWER_CASE_WITH_DASHES).withNullValues(true).withFormatting(true);Jsonb jsonb = JsonbBuilder.create(jsonbConfig);無(wú)論哪種方式,JSON Binding API都為Java對(duì)象的序列化和反序列化提供了廣泛的功能。
4. CDI 2.0:在Java SE中使用
現(xiàn)在,讓我們繼續(xù)下一個(gè)API。 CDI 2.0 API。 此版本具有許多新功能,更有趣的功能之一是能夠在Java SE應(yīng)用程序中引導(dǎo)CDI 。
要在Java SE中使用CDI,必須明確引導(dǎo)CDI容器。 這可以通過在SeContainerInitializer抽象類上調(diào)用靜態(tài)方法 newInstance() 來實(shí)現(xiàn) 。 它返回一個(gè)SeContainer實(shí)例,該實(shí)例是CDI運(yùn)行時(shí)的句柄,您可以使用該實(shí)例執(zhí)行CDI解析,如此代碼段所示。 它可以訪問BeanManager,它是CDI的核心入口點(diǎn)。
SeContainer seContainer =SeContainerInitializer.newInstance().initialize();Greeting greeting = seContainer.select(Greeting.class).get();greeting.printMessage("Hello World");seContainer.close();通過向CDI bean傳遞要檢索和使用的bean的類名,可以使用select()方法對(duì)其進(jìn)行檢索。
配置選項(xiàng)
通過添加攔截器,擴(kuò)展,替代品,屬性和裝飾器,可以對(duì)SeContext進(jìn)行進(jìn)一步的配置 。
.enableInterceptors() .addExtensions() .selectAlternatives() .setProperties() .enableDecorators()通過調(diào)用SeContainer上的close()方法來手動(dòng)關(guān)閉容器,或者在使用try-with-resources結(jié)構(gòu)時(shí)自動(dòng)關(guān)閉容器,因?yàn)镾eContainer擴(kuò)展了AutoCloseable接口。
5. Servlet 4.0:服務(wù)器推送
最后但并非最不重要的一點(diǎn)是,Servlet 4.0中的服務(wù)器推送功能使Servlet規(guī)范與HTTP / 2保持一致。
要了解此功能,您首先需要知道什么是服務(wù)器推送。
什么是服務(wù)器推送?
服務(wù)器推送是HTTP / 2協(xié)議中的許多新功能之一,旨在通過將客戶端資源推送到瀏覽器的緩存中來預(yù)期客戶端資源需求,以便客戶端發(fā)送網(wǎng)頁(yè)請(qǐng)求并收到響應(yīng)時(shí)返回從服務(wù)器上,它所需的資源已經(jīng)在緩存中。 這是一項(xiàng)性能增強(qiáng)功能,可提高網(wǎng)頁(yè)加載速度。
它在Servlet 4.0中如何公開?
在Servlet 4.0中, 服務(wù)器Push功能通過從HttpServletRequest實(shí)例獲得的PushBuilder實(shí)例公開 。
看一下這個(gè)代碼片段。 您可以看到header.png的路徑是通過path()方法在PushBuilder實(shí)例上設(shè)置的,并通過調(diào)用push()將其推送到客戶端。 當(dāng)該方法返回時(shí),將清除路徑和條件標(biāo)頭,以供構(gòu)建器重用。 推送menu.css文件,然后將ajax.js javascript文件推送到客戶端。
protected void doGet(HttpServletRequest request, HttpServletResponse response) {PushBuilder pushBuilder = request.newPushBuilder();pushBuilder.path("images/header.png").push();pushBuilder.path("css/menu.css").push();pushBuilder.path("js/ajax.js").push();// Return JSP that requires these resources}到Servlet doGet()方法完成執(zhí)行時(shí),資源將到達(dá)瀏覽器。 從JSP生成HTML需要這些資源,由于它們已經(jīng)是瀏覽器緩存,因此不需要從服務(wù)器請(qǐng)求它們。
結(jié)論
好吧,這是Java EE 8中最好的新功能,但是還有許多其他功能可以告訴您。
目前為止就這樣了。
翻譯自: https://www.javacodegeeks.com/2018/04/the-top-5-new-features-in-java-ee-8.html
總結(jié)
以上是生活随笔為你收集整理的Java EE 8的前5个新功能的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 画世界APP如何绘图 画世界APP绘图方
- 下一篇: grails框架_Play和Grails