准备写个Spring Boot教程

最近我打算写一系列Spring Boot教程,用来讲解Spring Boot基础知识和一些常见的应用场景。你可能会问,现在讲这个话题的东西这么多,写出来的意义是啥,别人会看么。我的觉得吧,一条街上很多饭店,你决定去哪个,肯定还是看谁的好吃或者服务好。我肯定得有一些不一样的地方,下面是我的思路:

  1. 首先我不打算列出长篇累牍的代码。我平常搜索文章的时候,也时常碰到有文章会连续出现整页的代码,有的缩进还是乱的,给人一种恐惧感。我会尽量把展示出来的代码压缩,减少干扰,让读者注意力集中在理解上。
  2. 其次我计划尝试用画图去说明问题。之前在学习Spring Security的时候,我脑子里充满了疑惑,搞不清楚他拦截的原理。后来搞懂了之后我脑子里就有一张图,十分清晰地表示了那一堆Filter是如何排序的,一个请求是如何被拦截处理的,如果我能把类似的容易理解的图像传递给读者,那么他们就会节省很多解惑的时间。
  3. 覆盖学习路径中可能遇见的错误。如果你照着某个教程一步一步走下去,可能遇见了bug,解决这类bug也是挺苦恼的,我尽量把这些可能发生的bug说出来。条条大路通罗马,通不到罗马的路,也需要给路人指出来,让人心里有底。
  4. 文章不会很长,专注于解决某个问题。对于想解决具体问题的人来说,他能判断出内容是否有用,对于想系统学习的人来说,文章长短倒是不太重要,一篇一篇来就是了。

我在纸上大概规划了下有哪些主题要写,随随便便就列了20多个,的确有很多要说的。如果再加上Spring Cloud的话,就更多了。如果你在内容上有什么建议,可以在下面给我留言。

我也在学习和实践Spring Boot的过程之中,同时我深知写作的过程会让我对知识的理解水平上升到高于写作内容的层次,你要教别人,就得搞清楚之前你只是会用的技能。看看我能否坚持下来吧。

继续阅读 →

使用Guava操作基本类型

Java中有8种基本类型,他们不能像类一样作为泛型的类型参数:

这就导致很多的通用工具类,并不支持基本类型,比如Collections.max()方法。Guava提供了一系列API,可以帮助你灵活地使用基本类型数组和集合API:

Guava的工具API

每个基本类型都对应有一个工具类,类名为基本类型的名字首字母大写,结尾加上个s,比如int对应Ints。Guava还提供了操作无符号整数的API,UnsignedIntegerUnsignedLong是对无符号整数的一个封装,你可以像用BigInteger一样用他们;如果你对性能要求高一点,可以使用UnsignedIntsUnsignedLongs直接对int和long进行操作。

接下来,我们通过示例来说明如何使用Guava的这些API。不过在你决定使用这些API之前,你得先看看Arrays或者Collections或者基本类型包装类里有没有你满足你需要的API,毕竟Guava只是对这些工具进行了补充。

(更多…)

继续阅读 →

为什么Java中char类型不能完整表示一个字符?

在Java中,一个char类型变量大多数情况下可以存储一个字符,但是有的时候却不可以。要想搞清楚原因,就需要了解到字符集、字符编码、码点和代码单元等等概念。本文将逐一解释这些概念。

什么是字符集

我们日常生活中所使用的文字,在存储到计算机中的时候需要使用二进制的形式,通俗地来说就是一个字符要唯一对应一个数字。字符集就用来表达这种对应关系的。这个世界上有很多的字符集,比如说简单的ASCII、国家标准总局发布的GB2312GB18030以及还在不断发展的Unicode

Unicode包含了世界上大多数的文字和符号。我们平常聊天时常用的表情符号 – Emoji,就已经被Unicode标准化了,每个表情就代表了一个“文字”。Unicode中,每个字符对应的数字,叫代码值(又叫Code Point, 码点),通常会以”U+”开头,后面跟上一串十六进制数字。比如U+86CB所表示的文字就是中文里的”蛋”。

(更多…)

继续阅读 →

数据库迁移工具Flyway

不管是在开发过程中还是在线上,数据库结构都是经常变化的,很多情况下都需要对数据库的变化做跟踪和管理,Flyway就是这样一款管理工具。

在Flyway里,每次数据库变化都称为一次迁移,每次迁移都有一个版本号。Flyway会在数据库里存储当前处在哪个版本。每当需要上线的时候,你可以手动或者自动地将代码里的多个迁移,同步到数据库当中。

迁移的规则

如图所示,文件名以V开头,后面跟上版本号,然后是两个下划线,最后是对此次迁移的描述,用下划线或者空格隔开。在每个sql文件中,都可以写多个DDL语句或者CRUD语句,根据你的需求而定。

怎么才能触发迁移呢?Flyway提供了多种方式:

(更多…)

继续阅读 →

使用Jackson生成和解析JSON

Jackson是目前使用非常广泛的JSON生成和解析工具。

Jackson项目主要由三个模块儿组成:

  • jackson-core 提供了一套流式API,他不仅自带了JSON的解析器和生成器,还支持扩展数据格式,比如XMLCSVProtobuf
  • jackson-annotations 提供了处理数据时需要的注解
  • jackson-databind 可以将数据和Java对象进行绑定,使用起来更方便、更符合直觉

通常来说,我们提到Jackson的时候,指的就是jackson-databind,他直接依赖了jackson-core和jackson-annotations。我们用Jackson的时候,通常也只是用来处理JSON,其他数据格式可以参考官网进行扩展。

(更多…)

继续阅读 →

用属性控制Hibernate生成DDL

Hiberate可以根据我们定义的@Entity实体类,来自动生成表结构,在一定程度上,你不需要与SQL打交道。在Spring Boot配合Hibernate使用的时候,可以定义属性来控制这种行为。如图所示:

可用的一些属性值
  • create表示每次应用启动的时候,都会将之前的表全部drop掉,重新根据实体类生成一遍。
  • create-drop在create的基础上,在应用关闭的时候还会drop一次。
  • update可能是比较常用的,每次启动的时候会看看实体类有什么变化,然后看需不需要更改表结构。
  • validate不会对表进行更改,但是会看看他和实体类是否对应
  • none什么都不做

除了这个属性之外,Spring Boot还有另外一个属性:

(更多…)

继续阅读 →

Oracle如何对JDK收费

今年4月16日,Oracle发布了新的JDK 8的更新,版本号为8u211和8u212。与以往不同的是,新版本的许可协议从BCL换成了OTN,这就意味着,你不能在生产环境使用这个版本了。如果你想继续使用8u211/8u212,或者之后发布的新版本,就需要给Oracle交钱了。

当然,并不是你用了新版本的JDK就要交钱,这个时候要区分私用和商用:

私用,是我总结的一个词,它包括”Personal Use”和”Development Use”,前者表示一些个人用途,比方说在自己的电脑上写一些小工具,做一些数据分析等等;后者表示开发用途,比如日常开发、做测试、做演示等等。商用不太好界定。我的理解就是拿来赚钱就是商用,比方说把网站部署到生产环境,在公司内部系统使用等。

我用的JDK使用什么协议?

BCL协议,即Oracle Binary Code License Agreement,协议规定你可以使用JDK,但是不能进行修改。私用和商用都可以,但是JDK中的某些商业特性,是需要付费才可以使用的。OTN协议,即Oracle Technology Network License Agreement,目前新发布的JDK用的都是这个协议,可以私用,商用需要付费。从下图可以看出各个版本对应的协议:

(更多…)

继续阅读 →

Spring Boot为什么不推荐使用JSP?

如果你在网上搜Spring Boot的教程,会发现模板引擎清一色用的Thymeleaf,为什么很少人用JSP?因为Spring Boot官方已经不推荐使用JSP了,文档中原话这么说的:

If possible, JSPs should be avoided. There are several known limitations when using them with embedded servlet containers.

Spring Boot 文档

在内置servlet容器中运行的时候,JSP会有一些限制:

  • 我们知道Spring Boot的打包方式有两种,一种jar包,一种war包。两种打包方式可以通过命令java -jar dist.jar或者java -jar dist.war运行。war包也可以单独部署在独立的Servlet容器(比如Tomcat,Jetty)中。使用jar包的时候不支持JSP,使用war包的时候支持
  • Undertow不支持JSP,话说Undertow国内用的比较少吧
  • 自定义的error.jsp不会覆盖Spring Boot默认的错误处理页面

既然如此,你如果需要使用JSP,就得打成war包,官方的代码仓库中自带有使用JSP的样例。当你需要迁移老项目到Spring Boot的时候,肯定会派上用场。

对于新项目,我的建议是你喜欢用哪个模板引擎,就用哪个。如果没有熟悉的,那就把FreeMarker、Groovy、Thymeleaf和Mustache全都看一遍,选择最合适的。

继续阅读 →

Spring Boot要不要搞?

最近抽空学写了下Spring Boot,它旨在简化Java应用的开发。利用自动配置的特性,你可以少写很多配置代码,利用COC(Convention Over Configuration),你可以直接上手,快速投入到你业务的开发过程中。

刚开始听说Spring Boot的时候,我是拒绝的。最早学习Spring,是通过《Spring实战(第四版)》开始的,这本书覆盖了Spring开发的方方面面,是一本极好的入门书籍。然后我还写了个模板项目,配置好了一些常用的东西,比如第三方库、数据库配置、资源路径等等。当我以为自己算是踏入Java Web开发的大门的时候,发现我在github找的一些开源项目都是使用的Spring Boot,而且拉勾上很多职位都对SB有要求(说明已经被广泛应用了),再加上Spring Cloud是基于Spring Boot的,我决定上手试一试。

(更多…)

继续阅读 →