Java EE 8 的五大最新特性

点击上方“程序员大咖”,选择“置顶公众号”

关键时刻,第一时间送达!640?640?wx_fmt=gif


原文链接: dzone 翻译: ImportNew.com enigma
译文链接: http://www.importnew.com/29189.html

程序员大咖整理发布,转载请联系作者获得授权


备受期待的 Java Enterprise Edition 8 发布了两个令人兴奋的全新 API (JSON-Binding 1.0 和 Java EE Security 1.0),并改进了现有的API(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 的企业级 Java 平台近四年以来第一次发布新版本,其中包含了数百项新特性、功能升级和错误修复。

哪些新特性是最棒的?我试图在这篇文章中回答这个非常主观的问题。

摘要:五大新特性

1.新的安全 API:注解驱动型的认证机制。这个全新的安全API包含了三个优秀新功能:身份储存的抽象层,新的安全上下文,以及一个注解驱动型的认证机制——这使得用 web.xml 文件声明的方式过时了。最后一个功能我们将会在今天讲到。
2.JAX-RS 2.1: 新的响应式客户端。JAX-RX 2.1 中新的响应式客户端,融合了响应式编程风格,允许组合端点结果。
3.新的 JSON 绑定 API:新的 JSON 绑定 API,为 JSON 的序列化和反序列化提供了一个原生的 Java EE 解决方案。
4.CDI 2.0: 在 Java SE 中使用CDI。CDI 2.0 中的这个有趣的新功能允许在 Java SE 中引导 CDI。
5.Servlet 4.0: 服务器推送。Servlet 4.0 中的服务器推送功能使得 servlet 规范和 HTTP/2 保持一致。
准备好了么?我们开始吧。

1、新的安全 API

Java EE 8 添加的新安全 API 可能是最重要的新特性之一。

这个新 API 的主要动机是简化、标准化及现代化跨容器和跨实现的安全问题处理方式。现有成效,尽如人意。

Web 认证的配置因为三个新的注解而实现了现代化,web.xml 从此变得冗余。具体稍后再说。
新的安全上下文 API 标准化了 servlet 和EJB 容器执行身份验证的方式。
新的身份储存抽象层简化了身份储存的使用。

让我们仔细看看这些新增功能中的第一个。















































































































































































































































































































    先不说楚枫的这般年纪,能够踏入元武一重说明了什么,最主要的是,楚枫在刚刚踏入核心地带时,明明只是灵武七重,而在这两个月不到的时间,连跳两重修为,又跳过一个大境界,踏入了元武一重,这般进步速度,简直堪称变态啊。


    “这楚枫不简单,原来是一位天才,若是让他继续成长下去,绝对能成为一号人物,不过可惜,他太狂妄了,竟与龚师兄定下生死约战,一年时间,他再厉害也无法战胜龚师兄。”有人认识到楚枫的潜力后,为楚枫感到惋惜。


    “哼,何须一年,此子今日就必败,巫九与龚师兄关系甚好,早就看他不顺眼了,如今他竟敢登上生死台挑战巫九,巫九岂会放过他?”但也有人认为,楚枫今日就已是在劫难逃。


    “何人挑战老子?”就在这时,又是一声爆喝响起,而后一道身影自人群之中掠出,最后稳稳的落在了比斗台上。


    这位身材瘦弱,身高平平,长得那叫一个猥琐,金钩鼻子蛤蟆眼,嘴巴一张牙带色儿,说话臭气能传三十米,他若是当面对谁哈口气,都能让那人跪在地上狂呕不止。


    不过别看这位长得不咋地,他在核心地带可是鼎鼎有名,剑道盟创建者,青龙榜第九名,正是巫九是也。


    “你就是巫九?”楚枫眼前一亮,第一次发现,世间还有长得如此奇葩的人。


    巫九鼻孔一张,大嘴一咧,拍着那干瘪的肚子,得意洋洋的道:“老子就是巫九,你挑战老子?”


    “不是挑战你,是要宰了你。”楚枫冷声笑道。


    “好,老子满足你这个心愿,长老,拿张生死状来,老子今日在这里了解了这小子。”巫九扯开嗓子,对着下方吼了一声。


    如果他对内门长老这么说话,也就算了,但是敢这么跟核心长老说话的,他可真是算作胆肥的,就连许多核心弟子,都是倒吸了一口凉气,心想这楚枫够狂,想不到这巫九更狂。


    不过最让人无言的就是,巫九话音落下不久,真有一位核心长老自人群走出,缓缓得来到了比斗台上,左手端着笔墨,右手拿着生死状,来到了巫九的身前。


    “我去,这巫九什么身份,竟能这般使唤核心长老?”有人吃惊不已,那长老修为不低,乃是元武七重,比巫九还要高两个层次,但却这般听巫九的话,着实让人吃惊不已。


    “这你就不知道了吧,巫九在前些时日,拜了钟离长老为师尊,已正式得到钟离长老的亲传。”有人解释道。


    “钟离长老?可是那位性情古怪的钟离一护?”


    “没错,就是他。”


    “天哪,巫九竟然拜入了他的门下?”


    人们再次大吃一惊,那钟离一护在青龙宗可是赫赫有名,若要是论其个人实力,在青龙宗内绝对能够排入前三,连护宗六老单打独斗都不会是他的对手。


    只不过那钟离一护,如同诸葛青云一样,也是一位客卿长老,所以在青龙宗内只是挂个头衔,什么事都不管,更别说传授宗内弟子技艺了,如今巫九竟然能拜入他老人家门下,着实让人羡慕不已。


    “恩怨生死台,的确可以决斗生死,但必须要有所恩怨,你们两个人,可有恩怨?”那位长老开口询问道。































































































注解驱动型的认证机制

这个功能主要用于配置 Web 安全。旧的方式要求在 web.xml 文件中声明。

得益于 HttpAuthenticationMechanism 接口,我们不必再使用旧方式。HttpAuthenticationMechanism 接口代表了一个 HTTP 身份验证,并附带了三个内置的 CDI 支持的实现,每个实现都代表了可配置的三种 Web 安全方式之一。

使用以下的注解之一触发特定的实现。

@BasicAuthenticationMechanismDefinition
@FormAuthenticationMechanismDefinition
@CustomFormAuthenticationMechanismDefinition

它们复制了 servlet 容器中已有的传统 HTTP 基本认证,表单和基于表单的自定义认证功能。

举个例子来说,若要启用基本认证,所要做的仅是把 BasicAuthenticationMechanismDefinition 注解添加到你的 servlet 中。

@BasicAuthenticationMechanismDefinition(realmName=”${‘user-realm’}”)
@WebServlet(“/user”)
@DeclareRoles({ “admin”, “user”, “demo” })
@ServletSecurity(@HttpConstraint(rolesAllowed = “user”))
public class UserServlet extends HttpServlet { … }

现在你可以抛弃 XML 配置,并使用上面的注解来驱动 Web 安全了。

2、JAX-RS 2.1:新的响应式客户端

让我们来看看 JAX-RS 2.1 中新的响应式客户端,以及它是怎么融合响应式编程风格的。

响应式方法的核心概念是数据流以及一个通过流来传播变化的执行模型。一个典型的例子是 JAX-RS 的方法调用。当调用返回时,将在方法调用的结果上执行下一个操作(可能是继续,完成或错误)。

你可以将其视作:数据变成了一个异步的进程管道,后一个进程根据前一个进程的结果执行,然后将其进程的结果传递给链中的下一个进程。组件化的流让你得以组合和转化多个流到一个结果中。

通过调用 rx()Invocation.Builder 实例中用于构造客户端实例的方法,以此启用响应式的功能。此方法返回一个携带 Response 类型的 CompletionStage 实例。 CompletionStage 接口在 Java 8 中引入,并提出了一些有趣的可能性。

例如,在这个代码片段中,两个调用是对不同的端点进行的,然后将结果合并:

CompletionStagecs1 = ClientBuilder.newClient()
 .target(“…/books/history”)
 .request()
 .rx()
 .get();

CompletionStagecs2 = 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

现在让我们来看看下一个优秀的新特性。新的 JSON 绑定 API为 JSON 的序列化和反序列化提供了一个原生的 Java EE 解决方案。

在此之前,如果你想对 JSON 进行序列化和反序列化,则必须依赖类似 Jackson 或是 GSON 这样的第三方 API。现在不一样了,使用新的 JSON 绑定 API,你可能需要的所有功能都有了原生支持。

从 Java 对象生成一个 JSON 文档非常简单。只需要调用 toJson() 方法,并传递你想要序列化的实例即可。

String bookJson = JsonbBuilder.create().toJson(book);

将 JSON 文档反序列化为 Java 对象也同样简单。只需要将 JSON 文档和目标类传递给 fromJson 方法,即可获得 Java 对象。

Book book = JsonbBuilder.create().fromJson(bookJson, Book.class);

但其功能不止于此。

行为定制

可以通过注解字段,JavaBean 方法和类来自定义默认的序列化和反序列化行为。

例如,你可以使用 @JsonbNillable 来自定义空处理和 @JsonbPropertyOrder 注解来自定义在类级别指定的属性顺序。 也可以使用 @JsonbNumberFormat() 注解指定数字格式,并使用 @JsonbProperty() 注解更改字段的名称。

JsonbNillable
@JsonbPropertyOrder(PropertyOrderStrategy.REVERSE)
public class Booklet {
 @JsonbProperty(“cost”)
 @JsonbNumberFormat(“#0.00”)
 private Float price;
}

或者,你可以选择使用运行时自定义构建器 JsonbConfig 来处理自定义:

JsonbConfig jsonbConfig = new JsonbConfig()
    .withPropertyNamingStrategy( PropertyNamingStrategy.LOWER_CASE_WITH_DASHES)
    .withNullValues(true)
    .withFormatting(true);
Jsonb jsonb = JsonbBuilder.create(jsonbConfig);

无论哪种方式,JSON 绑定 API 都为 Java 对象的序列化和反序列化提供了广泛的功能。

4、CDI 2.0:在 Java SE 中使用CDI

现在让我们继续看下一个API。 CDI 2.0 API。该版本拥有许多新功能,其中一个较为有趣的功能是在 Java SE 应用程序中引导 CDI 的能力。

要在 Java SE 中使用 CDI,必须明确引导 CDI 容器。这是通过调用 SeContainerInitializer 抽象类的静态方法 newInstance() 来实现的。此方法返回一个 SeContainer 实例,该实例是 CDI 运行时的句柄,你可以使用该实例执行 CDI 解析,如代码片段中所示。它可以访问 BeanManager,是 CDI 的核心入口点。

SeContainer seContainer =
      SeContainerInitializer.newInstance().initialize();
Greeting greeting = seContainer.select(Greeting.class).get();
greeting.printMessage(“Hello World”);
seContainer.close();

传递想要检索和使用的 bean 的类名给 select() 方法,以此检索 CDI bean。

配置选项

可以添加 Interceptors, Extensions, Alternatives, Properties, 和 Decorators 来进一步配置 SeContext 。

.enableInterceptors()
.addExtensions()
.selectAlternatives()
.setProperties()
.enableDecorators()

在 SeContainer 上调用 close() 方法手动关闭容器,因为 SeContainer 扩展了 AutoCloseable 接口,也可以使用 try-with-resources 结构自动关闭容器。

5、Servlet 4.0:服务器推送

最后,Servlet 4.0 中的服务器推送功能。这使得 servlet 规范和HTTP/2 保持一致。

为了理解这个特性,你首先需要知道服务器推送是什么。

什么是服务器推送?

服务器推送是HTTP/2协议中的许多新功能之一,旨在通过预测客户端资源需求,将这些资源推送到浏览器的缓存中,客户端发送网页请求并接收服务器的响应时,它需要的资源已经在缓存中。这是一项提高网页加载速度的性能增强功能。

这一功能在 Servlet 4.0 中是如何暴露的?

在 Servlet 4.0 中,服务器推送功能通过 PushBuilder 实例暴露,该实例从 HttpServletRequest 实例中获得。

看看这段代码片段。你可以看到,通过 path() 方法在 PushBuilder 实例上设置了 header.png 的路径,并通过调用 push() 将其推送到客户端。当方法返回时,路径和条件头将被清除,以便构建器重用。接着将 menu.css 文件,JavaScript 文件 ajax.js 推送到客户端。

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() 方法执行完毕时,资源将会到达浏览器。从JSP生成的HTML需要这些资源,但不必从服务器请求它们,因为它们已经是浏览器缓存了。

640?wx_fmt=gif640?【点击成为源码大神】

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值