Spring 4 支持的 Java 8 特性

Spring 框架 4 支持 Java 8 语言和 API 功能。在本文中,我们将重点放在 Spring 4 支持新的 Java 8 的功能。最重要的是 Lambda 表达式,方法引用,JSR-310的日期和时间,和可重复注释。

Lambda 表达式

Spring 的代码库使用了 Java 8 大量的函数式接口,Lambda 表达式可以用来编写更干净和紧凑的代码。每当出现函数式接口的对象的预期时我们便可以提供一个 Lambda 表达式。让我们进一步继续之前首先学习函数式接口。

函数式接口

有单一抽象方法的接口被称为函数式接口。下面是 JDK 中函数式接口的一些例子:

Comparator 是仅具有一个抽象的非对象方法的函数。尽管声明了两个抽象方法,因为 equals 是对应于对象的公共方法所以从计数里排除了。其中有一个对象类方法且没有非对象方法的接口并不是函数式接口。

一个接口如果有一个抽象的非对象类方法并且扩展自具有唯一对象类方法的非函数式接口,则称为函数式接口。

Spring 框架的函数式接口的例子:

@FunctionalInterface 注解可以在接口声明的顶部声明中被使用,但这并不是必需的。此注解用于由编译器来检测该接口是不是有效的函数式接口。如果我们试图在接口里定义多个单一抽象方法,编译器将抛出一个错误。

函数描述符

接口的函数描述符是该接口的一个抽象方法的方法的类型。该方法类型包括参数类型,返回类型和 throws 子句。

例:

如何编写 Lambda 表达式

Lambda 表达式的语法可以拆分成三部分:

  • 一个箭头 (–>)
  • 参数列表: 一个 Lambda 表达式可以包含0个或多个参数 例: () → { System.out.println(“ No arguments”); } (String arg) → { System.out.println(“ One argument : ”+arg); } (String arg1, Integer arg2) → { System.out.println(“Two arguments : ”+arg1+” and ”+arg2); }
  • 表达式体: 可以是单个表达式或代码块。单个表达式将被简单地求值并返回。 例: (String arg) → { System.out.println(“ One argument : ”+arg); } 如果表达式体(Body)中存在语句块,那么它将被判定为方法体,并且在块执行后隐藏的返回语句将控制权交给调用者。

现在我们看一下如何使用 Lambda 表达式:

例1:

// 使用 Lambda 表达式

例2:

//使用 Lambda 表达式

你可以通过 Spring 的回调函数使用 Lambda 表达式。例如,用一个 ConnectionCallback 检索给定 JDBC 连接的列表,可写成如下语句: jdbcTemplate.execute(connection -> connection.getCatalog())

方法引用

函数式接口也可以使用方法引用来实现,引用方法或构造函数但并不调用它们。方法引用和 Lambda 表达式是类似的,但方法引用是指现有类的方法,而 Lambda 定义了一个匿名方法,并将其作为函数式接口的实例。

在 Java 8 中一个新增包中包含了常用于 Lambda 表达式和方法引用的函数式接口:java.util.function

Date Time API

在 Java 中现有的 Date 和 Time 类存在多个问题。Date 和 Calendar 类的最大问题之一是它们不是线程安全的。在编写日期处理代码时开发人员不得不特别小心并发问题。Date 类也不支持国际化,因此不支持时区。开发人员必须编写大量的代码来支持不同的时区。

Date 和 Time 类也显现出不佳的 API 设计。java.util.Date 中的月从0,日从1,年从1900开始。缺少一致性。现在这些与 Date 和 Time 类的其它几个问题在 Java 8 中的新 Date 和 Time API 中已解决。

在 java.time 包下新的 Date 和 Time API 的重要的类是 LocalDate,LocalTime 和 ZonedDateTime。

LocalDate 和 LocalTime

LocalDate 表示日期时的默认格式为 YYYY-MM-DD,并没有时间。这是一个不可变类。我们可以使用 now() 方法获得的当前日期。

新建 LocalDate 实例的例子:

//获取当前日期

我们也可以通过对年,月,日的输入参数来新建 LocalDate 实例。

// 2016年4月1日

LocalTime 表示无日期的时间,是不变的。时间的默认格式为 hh:mm:ss.zzz。

新建 LocalTime 实例的例子:

//获取当前时间

// 18:30:30

默认情况下,LocalDate 和 LocalTime 类使用默认时区的系统时钟。这些类还提供了通过重载 new() 方法对修改时区的支持。可以通过传递 zoneid 来获得一个特定时区中的日期。

例子:

// 当前本地日期加尔各答(印度)

此外,还有一个类,LocalDateTime 组合了日期和时间,默认格式为 yyyy-MM-ddTHH:MM:ss.zzz·。

//当前日期和时间

// 2016-04-01 13:30

ZonedDateTime

这是一个不可变的类,用于表示包括时区信息的日期和时间。我们可以使用这个类的一个实例来表示特定事件,如在世界的某些地区一个会议。

// 当前时间使用系统的时间和默认区域

// 当前时间使用特定时区的系统时钟

Spring 4 提供了一个转换框架,支持做为 Java 8 日期和时间 API 一部分的所有类。Spring 4 可以使用一个 2016-9-10 的字符串,并把它转换成 Java 8 LocalDate 的一个实例。Spring 4 还支持通过 @DateTimeFormat 注解格式化 Java 8 Date-Time 字段。@DateTimeFormat 声明一个字段应该格式化为日期时间。

重复注解

在 Java 8 之前,将相同类型的多个注释加到声明或类型(例如一个类或方法)中是不允许的。作为一种变通方法,开发人员不得不将它们组合在一起成为单个容器注解。

例:

重复注解允许我们重写相同的代码并不需显式地使用容器注解。虽然容器注解没有在这里使用的,Java 编译器负责将两个注解封装成一个容器:

例:

定义重复注解

定义一个重复注解,通过可重复使用的 @Repeatable 注解来进行标注,或创建一个具有重复注解类型系列属性的注解。

第1步:声明重复注解类型:

第2步:声明容器注解类型。

全部的实现如下所示:

为了获得在运行时的注解信息,通过 @Retention(RetentionPolicy.RUNTIME) 注释即可。

检索注解

getAnnotationsByType() 或 getDeclaredAnnotationsByType() 是用于访问注解反射 API 中的新方法。

注解还可以通过它们的容器注解用 getAnnotation() 或 getDeclaredAnnotation() 进行访问。

结论

Spring 4 还可运行在 Java 6 和 Java 7 中。由于 Spring 使用了很多的函数式接口,用 Java 8 和 Spring 4,你将能够使用 Lambda 表达式和函数式接口,并可写出更干净、紧凑的代码。

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持我们!

(0)

相关推荐

  • Java事务管理学习之Spring和Hibernate详解

    环境与版本 本文出来之前的一篇文章中的hibernate的相关lib 外 Java事务管理之Hibernate 还需要加入spring的lib 包和如下的一些依赖包 org.aopalliance org.aspectj org.apache.commons Spring 的版本是Spring 4.1.5. 依赖包也可以到Spring 官方网站下载到 ,名字类似 spring-framework-3.0.2.RELEASE-dependencies 理论知识 Spring和Hibernate整合

  • Java中spring读取配置文件的几种方法示例

    Spring读取配置XML文件分三步: 一.新建一个Java Bean: package springdemo; public class HelloBean { private String helloWorld; public String getHelloWorld() { return helloWorld; } public void setHelloWorld(String helloWorld) { this.helloWorld = helloWorld; } } 二.构建一个配

  • Java中SpringSecurity密码错误5次锁定用户的实现方法

    Spring Security简介 Spring Security是一个能够为基于Spring的企业应用系统提供声明式的安全访问控制解决方案的安全框架.它提供了一组可以在Spring应用上下文中配置的Bean,充分利用了Spring IoC,DI(控制反转Inversion of Control ,DI:Dependency Injection 依赖注入)和AOP(面向切面编程)功能,为应用系统提供声明式的安全访问控制功能,减少了为企业系统安全控制编写大量重复代码的工作. 下面看下实例代码: 第

  • 详解Spring Boot 使用Java代码创建Bean并注册到Spring中

    从 Spring3.0 开始,增加了一种新的途经来配置Bean Definition,这就是通过 Java Code 配置 Bean Definition. 与Xml和Annotation两种配置方式不同点在于: 前两种Xml和Annotation的配置方式为预定义方式,即开发人员通过 XML 文件或者 Annotation 预定义配置 bean 的各种属性后,启动 spring 容器,Spring 容器会首先解析这些配置属性,生成对应都?Bean Definition,装入到 DefaultL

  • java web SpringMVC后端传json数据到前端页面实例代码

    下面的后台的代码:目的的查询数据库中的所有省的列表,然后转化为json传到前端页面 @Controller public class DistrictController { @Resource private ProvinceService provinceServiceImp; @Resource private CityService cityServiceImp; @Resource private TourSpotService tourSpotServiceImp; /** * 获取

  • Java Config下的Spring Test几种方式实例详解

    Java Config 下的Spring Test方式 用了三种方式: 1.纯手动取bean: package com.wang.test; import com.marsmother.commission.core.config.MapperConfig; import com.marsmother.commission.core.config.PropertyConfig; import com.marsmother.commission.core.config.ServiceConfig;

  • java Quartz定时器任务与Spring task定时的几种实现方法

    一.分类 从实现的技术上来分类,目前主要有三种技术(或者说有三种产品): 1.Java自带的java.util.Timer类,这个类允许你调度一个java.util.TimerTask任务.使用这种方式可以让你的程序按照某一个频度执行,但不能在指定时间运行.一般用的较少,这篇文章将不做详细介绍. 2.使用Quartz,这是一个功能比较强大的的调度器,可以让你的程序在指定时间执行,也可以按照某一个频度执行,配置起来稍显复杂,稍后会详细介绍. 3.Spring3.0以后自带的task,可以将它看成一

  • JavaEE开发之SpringMVC中的自定义消息转换器与文件上传

    本篇博客我们继续的来聊SpringMVC的东西,下方我们将会聊到js.css这些静态文件的加载配置,以及服务器推送的两种实现方式.当然我们在服务器推送时,会用到jQuery的东西,所以我们先聊一下如何加载静态资源文件,然后我们再聊如何实现服务器推送. 下方给出了两种实现服务器推送的方式,一种是SSE(Server Send Event (服务端推送事件))另一种是基于Servlet异步处理的推送,下方会给出详细的实现方式,并且给出了两者的区别. 一.静态资源文件映射 静态资源文件映射在Sprin

  • Spring 4 支持的 Java 8 特性

    Spring 框架 4 支持 Java 8 语言和 API 功能.在本文中,我们将重点放在 Spring 4 支持新的 Java 8 的功能.最重要的是 Lambda 表达式,方法引用,JSR-310的日期和时间,和可重复注释. Lambda 表达式 Spring 的代码库使用了 Java 8 大量的函数式接口,Lambda 表达式可以用来编写更干净和紧凑的代码.每当出现函数式接口的对象的预期时我们便可以提供一个 Lambda 表达式.让我们进一步继续之前首先学习函数式接口. 函数式接口 有单一

  • java新特性之for循环最全的用法总结

    1. 增强for概述 增强for循环,也叫Foreach循环,用于数组和容器(集合类)的遍历.使用foreach循环遍历数组和集合元素时,无需获得数组和集合长度,无需根据索引来访问数组元素和集合元素,大大提高的效率,代码也简洁不少. 2. Oracle官网的解释 So when should you use the for-each loop? Any time you can. It really beautifies your code. Unfortunately, you cannot

  • java实现Spring在XML配置java类的方法

    1. 创建自己的bean文件:beans.xml <?xml version="1.0" encoding="UTF-8"?> <busi-beans> <beans> <bean id="SysHelloImpl" type="com.cxm.test.SysHello"> <desc>test</desc> <impl-class>com.

  • 深入理解Java高级特性——注解

    博主在初学注解的时候看到网上的介绍大部分都是直接介绍用法或者功能,没有实际的应用场景,篇幅又很长导致学习的时候难以理解其意图,而且学完就忘QAQ.本篇文章中我将结合实际的应用场景尽可能由浅入深,平缓的介绍java注解. java注解是jdk1.5以后新出的特性,对于它的应用非常广泛,我们首先来看一下注解的应用,百度百科上这样说: 我们可以看到,注解的作用有三方面: 编写doc文档:这个就我们很常用的 @return 以及 @author,加了这些注解以后,就可以用jdk帮我们自动生成对应的API

  • Java三大特性-封装知识小结

    最近有个朋友说想要说最近在学java,他对面向对象的编程语言的时候还是有些不明白,为了帮他能更快地"转型",我就写了这篇文章.因为从上层建筑层面而言.所有的面向对象编程语言的思路都是差不多的,而这三大特性,则是思路中的支柱点,接下来我就重点讲解了一下java三大特性. 面向对象的编程语言,拥有三大特性,分别是:"封装","继承","多态". 封装 在面向对象编程中,封装封装(encapsulation)从字面上来理解就是包装的

  • Spring Boot支持Crontab任务改造的方法

    在以往的 Tomcat 项目中,一直习惯用 Ant 打包,使用 build.xml 配置,通过 ant -buildfile 的方式在机器上执行定时任务.虽然 Spring 本身支持定时任务,但都是服务一直运行时支持.其实在项目中,大多数定时任务,还是借助 Linux Crontab 来支持,需要时运行即可,不需要一直占用机器资源.但 Spring Boot 项目或者普通的 jar 项目,就没这么方便了. Spring Boot 提供了类似 CommandLineRunner 的方式,很好的执行

  • spring+springmvc+mybatis 开发JAVA单体应用

    myshop 概述 myshop项目是根据视频教程 Java 单体应用 做的一个练习项目,目前完成了登录功能.用户管理.类别管理后续有时间会继续做其它的功能.趁着双11花了99元一年买了台阿里云服务器,演示地址>> myshop 项目地址  https://gitee.com/yehuabin/myshop 项目结构 my-shop-dependencies:管理jar包的版本,所有项目依赖此项目 my-shop-commons:项目通用工具.实体类 my-shop-domain: POJO类

  • Spring Boot JPA中java 8 的应用实例

    上篇文章中我们讲到了如何在Spring Boot中使用JPA. 本文我们将会讲解如何在Spring Boot JPA中使用java 8 中的新特习惯如:Optional, Stream API 和 CompletableFuture的使用. Optional 我们从数据库中获取的数据有可能是空的,对于这样的情况Java 8 提供了Optional类,用来防止出现空值的情况.我们看下怎么在Repository 中定义一个Optional的方法: public interface BookRepos

  • 必须了解的高阶JAVA枚举特性!

    JAVA枚举,比你想象中还要有用! 我经常发现自己在Java中使用枚举来表示某个对象的一组潜在值. 在编译时确定类型可以具有什么值的能力是一种强大的能力,它为代码提供了结构和意义. 当我第一次了解枚举时,当时我认为它们只是一个为常量命名的工具,可以很容易地被静态常量字符串ENUM_VAL_NAME所取代. 后来我发现我错了.事实证明,Java枚举具有相当高级的特性,可以使代码干净.不易出错,功能强大. 让我们一起来看看Java中的一些高级枚举特性,以及如何利用这些特性使代码更简单.更可读. 枚举

  • 最优雅地整合 Spring & Spring MVC & MyBatis 搭建 Java 企业级应用(附源码)

    这里使用 Maven 项目管理工具构建项目 初始化项目 打开 Intellij IDEA,点击 Create New Project 选择 Maven 构建项目 选择 JDK 版本 选择 maven-archetype-webapp 模板(Java Web 项目) 填写项目在 Maven 仓库中的坐标(在 Maven 仓库中根据这个坐标才能找到该项目) 选择 Maven 路径 选择 Maven 配置文件路径 选择 Maven 本地仓库路径 填写项目名 选择工作目录 创建目录 在 src > ma

随机推荐