文档章节

Java 8在Spring 4中的使用

Bieber
 Bieber
发布于 2015/02/13 15:33
字数 1564
阅读 158
收藏 2
点赞 0
评论 0

#Java 8在Spring 4中的使用# Spring4已经发布一段时间了,但是在国内大部分企业还一直沉浸在Spring 3.x的时代。今天无意在Infoq看到一片关于Spring 4中对Java 8性功能的使用,趁机看看Spring 4的功能以及Java 8 的一些新特性。

这篇文章大部分内容是翻译自:http://www.infoq.com/articles/spring-4-java-8

##Spring 4对Lambda表达式的应用## 在JDK中存在很多回调接口,老外叫做方法接口。比如RunnableComparable,Listener类的接口等等,这种接口我们一般习惯通过匿名类的方式实现它,它们的特点包括:接口定义简单(一般就一两个方法),我们只需要new出它们,但是从来不是我们调用它们,一般用于通知类型的场景。在Spring中类似这些接口也有很多,这里只列举出JDBC相关的接口:

<!--lang:java-->
public interface ConnectionCallback<T> {
	T doInConnection(Connection con) throws SQLException, DataAccessException;
}

public interface RowMapper<T>
{
	T mapRow(ResultSet rs, int rowNum) throws SQLException;
 }

JdbcTemplate下存在下面方法:

<!--lang:java-->
public <T> List<T> query(String sql, RowMapper<T> rowMapper) throws DataAccessException

在Java 8之前我们是如下方式调用的:

<!--lang:java-->
jdbcTemplate.query("SELECT * from products", new RowMapper<Product>(){
@Override
public Product mapRow(ResultSet rs, int rowNum) throws SQLException {
Integer id = rs.getInt("id");
String description = rs.getString("description");
Integer quantity = rs.getInt("quantity");
BigDecimal price = rs.getBigDecimal("price");
Date availability = rs.getDate("available_date");

Product product = new Product();
product.setId(id);
product.setDescription(description);
product.setQuantity(quantity);
product.setPrice(price);
product.setAvailability(availability);
return product;
}
});

但是在Java 8下面,我们可以通过Lambda表达式的方式:

<!--lang:java-->
jdbcTemplate.query("SELECT * from queries.products", (rs, rowNum) -> {
Integer id = rs.getInt("id");
String description = rs.getString("description");
Integer quantity = rs.getInt("quantity");
BigDecimal price = rs.getBigDecimal("price");
Date availability = rs.getDate("available_date");

Product product = new Product();
product.setId(id);
product.setDescription(description);
product.setQuantity(quantity);
product.setPrice(price);
product.setAvailability(availability);

return product;
});

这里我们并没有实例化一个RowMapper类,而是通过Lambda的方式来执行,相对之前简单明了。当然这需要Java 8的支持。依次类推,在Java 8下可以执行下面代码:

<!--lang:java-->
new Thread(()->{
	//do run method 	
});

关于Lambda可以参照相关的资料,由于这里不是介绍Lambda的,而且我也不熟悉,所以就不误导大家了!

##Spring 4和Java 8最新时间日期API## 在Java 8之前,我们对日期的操作用的比较多的就是两个类(Date,SimpleDateFormate),用于时间转换和表示时间对象。在Java 8中提供了更加丰富的时间API,在java.time包下面有很多新的类来操作时间日期相关的类,比如:LocalDate,LocalTime以及LocalDateTime。Spring 4对这些新的API进行了兼容。例如下面的代码:

<!--lang:java-->
@RestController
public class ExampleController {

@RequestMapping("/date/{localDate}")
public String get(@DateTimeFormat(iso = ISO.DATE)LocalDate localDate)
{
	return localDate.toString();
}
}

如果localDate参数值是2015-02-13那么将会自动转换成LocalDate类的实体。

但是这只是Spring 4对它进行了支持,但是在SSH或者SSI其他第三方非Spring 4的项目中可能没有对其进行支持,所以不能说项目里面有了Spring 4就能放心的使用这些最新的日期时间API来做日期转换。

##Spring 4支持重复注解##

Java8之前,在同一个作用域不能配置相同的注解,不然会提示唯一注解的错误。但是Java8以后,支持了重复的注解,即一个作用域上面同一个注解可以配置多次。代码如下:

<!--lang:java-->
@Configuration
@ComponentScan
@EnableAutoConfiguration
@PropertySource("classpath:/example1.properties")
@PropertySource("classpath:/example2.properties")
public class Application {

@Autowired
private Environment env;

@Bean
public JdbcTemplate template(DataSource datasource) {
	System.out.println(env.getProperty("test.prop1"));
	System.out.println(env.getProperty("test.prop2"));
	return new JdbcTemplate(datasource);
}

public static void main(String[] args) {
	SpringApplication.run(Application.class, args);
}
}

但是这里是要有意义的重复配置,而不是无聊的进行配置,比如你对@Autowired重复配置,这个我只能说很无聊咩!

##Java 8 Optional<>在Spring 4.1的使用##

我们在开发过程中,如果对一个方法返回结果,在不确定他是非空的时候,都要进行非空校验,以防止出现空指针异常。于是Java 8针对这种情况,提供了一个统一的处理,就是Optional。先看看怎么用它:

之前我们这样来进行空校验:

<!--lang:java-->
Customer customer = customerRepository.findCustomerById(“123”);
if(customer != null) {
	customer.getName(); // avoid a null pointer exception
}

java 8里利用Optional可以如下来做:

<!--lang:java-->
public interface CustomerRepository extends CrudRepository<Customer, Long> {
public Optional<Customer> findCustomerById(String id);
}


//在其他方法调用:
Optional<Customer> optional = customerRepository.findCustomerById(“123”);
if(optional.isPresent()) {
	Customer customer = optional.get();
	customer.getName();
}

个人感觉也没简单而已,只是没出现了null关键词,那Spring怎么来使用它的呢?Spring一般用在对Bean的注入的时候,当我们配置某个不是必须注入的,可以通过这种方式来用,具体代码如下:

之前代码:

<!--lang:java-->
@Service
public class MyService {

    @Autowired(required=false)
    OtherService otherService;

    public doSomething() {
      if(otherService != null) {
        // use other service
      }
   	}
}

使用Optional之后:

<!--lang:java-->
public class MyService {

    @Autowired
    Optional<OtherService> otherService;

    public doSomething() {
      otherService.ifPresent( s ->  {
        // use s to do something
      });
    }
}

##可以获取方法参数名## java 8之前,通过反射是无法获取方法参数名称的,Field只能获得类型,但是java 8以后将参数名称存储在了类文件中,于是可以通过反射获取方法参数的名称。这个对于我来说是一个惊喜,之前为了能够获取方法参数需要增加多少配置,弄得很是蹩脚,现在,可以放开脚步走了。带着这个特性,可以带来很多好处,下面列举出部分例子:

Java 8之前:

<!--lang:java-->
@RequestMapping("/accounts/{id}")
public Account getAccount(@PathVariable("id") String id)

Java 8之后: @RequestMapping("/accounts/{id}") public Account getAccount(@PathVariable String id)

不在指定参数名称了,只要保持你方法参数和引用的参数名称一样即可。是否小激动了一把?

又例如:

Java 8之前:

<!--lang:java-->
interface CustomerRepository extends CrudRepository<Customer, Long> {
@Query("select c from Customer c where c.lastname = :lastname")
List<Customer> findByLastname(@Param("lastname") String lastname);
}

Java 8之后:

<!--lang:java-->
interface CustomerRepository extends CrudRepository<Customer, Long> {
@Query("select c from Customer c where c.lastname = :lastname")
List<Customer> findByLastname(String lastname);
}

借助这篇文章也体验了一下Java 8的新特性。更多的特性还需真正引用的时候去发现。

© 著作权归作者所有

共有 人打赏支持
Bieber
粉丝 203
博文 36
码字总数 83312
作品 1
杭州
高级程序员
OpenJ9 和 HotSpot 的对比 Part 1

OpenJ9 和 IBM J9 是来自默认 Oracle HotSpot JVM 的不同 JVM 实现。使用现代的 adoptopenjdk 预置 Docker 镜像,你可以轻易地切换和测试不同的组合,并且可以为你选择合适的 JVM。 这个传言...

oschina ⋅ 05/28 ⋅ 0

Java程序员面试大纲—错过了金三银四,你还要错过2018吗?

跳槽时时刻刻都在发生,但是我建议大家跳槽之前,先想清楚为什么要跳槽。切不可跟风,看到同事一个个都走了,自己也盲目的开始面试起来(期间也没有准备充分),到底是因为技术原因(影响自己...

java高级架构牛人 ⋅ 04/27 ⋅ 0

IOC/AOP工具 - jBeanBox

jBeanBox是一个微形但功能较齐全的IOC/AOP工具适用于JAVA7+,利用了Java的初始化块实现的Java配置代替XML。jBeanBox采用Apache License 2.0开源协议。 其他一些IOC/AOP框架的问题: 1)Sprin...

yong9981 ⋅ 2016/07/25 ⋅ 14

Java高级程序员面试大纲——错过了金三,你还要错过银四吗

跳槽时时刻刻都在发生,但是我建议大家跳槽之前,先想清楚为什么要跳槽。切不可跟风,看到同事一个个都走了,自己也盲目的开始面试起来(期间也没有准备充分),到底是因为技术原因(影响自己...

Java高级架构 ⋅ 04/27 ⋅ 0

Spring Boot整合模板引擎jsp

jsp也算是一种模板引擎吧。整合jsp前,先说一下运行SpringBoot项目的几种方式 1. 运行SpringBoot项目的几种方式 1.1 使用内嵌Tomcat运行项目 在IDE中右键运行启动类,也就是直接直接运行App...

yysue ⋅ 06/15 ⋅ 0

【小马哥】Spring Boot系列讲座

这里为大家推荐一个不错的Spring Boot系列讲座,讲师介绍如下: 小马哥,阿里巴巴技术专家,从事十余年Java EE 开发,国内微服务技术讲师。目前主要负责微服务技术推广、架构设计、基础设施、...

杜琪 ⋅ 03/02 ⋅ 0

【死磕Sharding-jdbc】—基于 SSM 集成sharding-jdbc2.0.3

原文作者:阿飞Javaer 原文链接:https://www.jianshu.com/p/7b6997c3586d 本篇文章讲解如何在ssm(spring、springmvc、mybatis)结构的程序上集成sharding-jdbc(版本为2.0.3)进行分库分表...

飞哥-Javaer ⋅ 05/27 ⋅ 0

【小马哥】Spring Cloud系列讲座

这里为大家推荐一个不错的Spring Cloud系列讲座,讲师介绍如下: 小马哥,阿里巴巴技术专家,从事十余年Java EE 开发,国内微服务技术讲师。目前主要负责微服务技术推广、架构设计、基础设施...

杜琪 ⋅ 03/02 ⋅ 0

Java程序员必读书单,家族又添新成员

点击关注异步图书,置顶公众号 每天与你分享IT好书 技术干货 职场知识 参与文末话题讨论,每日赠送异步图书。 ——异步小编 有些革命出其不意地吸引了全世界的眼球。Twitter、Linux操作系统和...

异步社区 ⋅ 05/09 ⋅ 0

Spring Boot 2.0 新特性解读

点击上方“程序员小灰”,选择“置顶公众号” 有趣有内涵的文章第一时间送达! 本文转载自公众号 InfoQ 作者|翟永超编辑|郭蕾Spring Boot 2.0 来啦,有哪些新特性?升级吗?写在前面 北京时...

bjweimengshu ⋅ 04/13 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

来自一个优秀Java工程师的简历

写在前面: 鉴于前几天的一份前端简历,虽然带着很多不看好的声音,但却帮助了很多正在求职路上的人,不管评论怎么说,我还是决定要贴出一份后端的简历。 XXX ID:357912485 目前正在找工作 ...

颖伙虫 ⋅ 24分钟前 ⋅ 0

Confluence 6 恢复一个站点有关使用站点导出为备份的说明

推荐使用生产备份策略。我们推荐你针对你的生产环境中使用的 Confluence 参考 Production Backup Strategy 页面中的内容进行备份和恢复(这个需要你备份你的数据库和 home 目录)。XML 导出备...

honeymose ⋅ 今天 ⋅ 0

JavaScript零基础入门——(九)JavaScript的函数

JavaScript零基础入门——(九)JavaScript的函数 欢迎回到我们的JavaScript零基础入门,上一节课我们了解了有关JS中数组的相关知识点,不知道大家有没有自己去敲一敲,消化一下?这一节课,...

JandenMa ⋅ 今天 ⋅ 0

火狐浏览器各版本下载及插件httprequest

各版本下载地址:http://ftp.mozilla.org/pub/mozilla.org//firefox/releases/ httprequest插件截至57版本可用

xiaoge2016 ⋅ 今天 ⋅ 0

Docker系列教程28-实战:使用Docker Compose运行ELK

原文:http://www.itmuch.com/docker/28-docker-compose-in-action-elk/,转载请说明出处。 ElasticSearch【存储】 Logtash【日志聚合器】 Kibana【界面】 答案: version: '2'services: ...

周立_ITMuch ⋅ 今天 ⋅ 0

使用快嘉sdkg极速搭建接口模拟系统

在具体项目研发过程中,一旦前后端双方约定好接口,前端和app同事就会希望后台同事可以尽快提供可供对接的接口方便调试,而对后台同事来说定好接口还仅是个开始、设计流程,实现业务逻辑,编...

fastjrun ⋅ 今天 ⋅ 0

PXE/KickStart 无人值守安装

导言 作为中小公司的运维,经常会遇到一些机械式的重复工作,例如:有时公司同时上线几十甚至上百台服务器,而且需要我们在短时间内完成系统安装。 常规的办法有什么? 光盘安装系统 ===> 一...

kangvcar ⋅ 昨天 ⋅ 0

使用Puppeteer撸一个爬虫

Puppeteer是什么 puppeteer是谷歌chrome团队官方开发的一个无界面(Headless)chrome工具。Chrome Headless将成为web应用自动化测试的行业标杆。所以我们很有必要来了解一下它。所谓的无头浏...

小草先森 ⋅ 昨天 ⋅ 0

Java Done Right

* 表示难度较大或理论性较强。 ** 表示难度更大或理论性更强。 【Java语言本身】 基础语法,面向对象,顺序编程,并发编程,网络编程,泛型,注解,lambda(Java8),module(Java9),var(...

风华神使 ⋅ 昨天 ⋅ 0

Linux系统日志

linux 系统日志 /var/log/messages /etc/logrotate.conf 日志切割配置文件 https://my.oschina.net/u/2000675/blog/908189 logrotate 使用详解 dmesg 命令 /var/log/dmesg 日志 last命令,调......

Linux学习笔记 ⋅ 昨天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部