快速学习 Spring Boot 技术栈

文章推荐

Selenium 自动化测试从零实战【原文链接】
原来这样做,才能向架构师靠近【原文链接】
Cordova App 打包全揭秘【原文链接】
TensorFlow on Android:物体识别【原文链接】
TensorFlow on Android:训练模式【原文链接】
图解敏捷教练和 ScrumMaster【原文链接】
[运营专题]零预算引爆个人和企业品牌【原文链接】
学就会的 WordPress 实战课【原文链接】

快速学习 Spring Boot 技术栈_第1张图片

作者简介

纯洁的微笑,曾经先后在互联网金融、第三方支付公司担任高级 Java 工程师、架构师、技术经理、技术负责人等职务。在互联网金融工作期间,从零参与公司技术平台建设,组织平台进行过四次大架构升级。目前在一家第三方支付公司做架构师,负责支付公司大数据平台建设。

课程简介

如今微服务架构已经慢慢成为了互联网架构的主流,Spring Boot 正是这股潮流的主先锋。

本课程是围绕 Spring Boot 技术栈的系列教程,目标是带领读者了解 Spring Boot 各种特性,学会使用 Spring Boot 相关技术栈上手开发项目。课程以 Spring Boot 所支持的技术栈为主线,一步一步了解每个组建的使用方式,最后综合演练。

认真学完这个系列文章之后,会对 Spring Boot 有进一步的了解,具备使用 Spring Boot 上手进行开发的基本能力。

课程内容(前三课免费阅读)

第01课:课程概要

第02课:快速实战 Spring Boot

第03课:快速体验 Web 开发

第04课:Spring Data JPA 的使用

第05课:模板引擎 Thymeleaf

第06课:JPA 和 Thymeleaf 实践

第07课:Spring Boot 集成 MyBatis

第08课:MyBatis Druid 多数据源

第09课:如何玩转 Redis

第10课:Redis 实现数据缓存和 Session 共享

第11课:RabbitMQ 详解

第12课:MongoDB 实战

第13课:使用 Spring Boot 发送邮件

第14课:Spring Boot 集成 Quartz

第15课:Spring Boot 集成测试和部署运维

第16课:综合实战用户管理系统

第01课:课程概要

背景

这个事情还要从 Spring 说起,2000 年左右 Java 行业中都是 EJB 的天下,但是 EJB 本身比较庞大复杂,各企业使用起来并不是很便利。有一个大神就站了出来,他就是 Rod Johnson。他认为企业开发应该更简单,没有必要全部使用 EJB,企业开发应该是一个统一的、高效的方式构造整个应用,并且可以将单层框架以最佳的组合揉和在一起建立一个连贯的体系。

于是在 2002 年编写了一本书叫 《Expert One-to-One J2EE Design and Development ”(Wrox,2002)》,进一步的阐述了自己的思想。在这本书中,Rod Johnson 展示了他的 interface 21 框架,这一框架被发布到开源世界后,组成了现在我们所知的 Spring 框架的基础。接下来 Spring 发展迅速,平均两三年就会发布一个新版本,直到最近 9 月份推出的 Spring 5.0,Spring 也从一个小小的开源软件发展为 Java 界第一个框架,覆盖的内容也越来越广泛。

Spring 在不断发展的过程中也出现了一些问题,随着 Spring 边界不断扩张,需要的配置文件也越来越多,使用起来也越复杂,项目中也经常因为配置文件配置错误产生很多问题。慢慢 Spring 变成了一个大而全的框架,背离它简洁开发的理念。Spring 也意识到了这些问题,急需有这么一套软件可以解决这些问题,这个时候微服务的概念也慢慢兴起,Spring 站在了这么一个高度上开发了一个全新的技术栈:Spring Boot。

Spring Boot 介绍

Spring Boot 是由 Pivotal 团队提供的全新框架,其设计目的是用来简化新 Spring 应用的初始搭建以及开发过程。该框架使用了特定的方式来进行配置,从而使开发人员不再需要定义样板化的配置。采用 Spring Boot 可以大大的简化开发模式,所有你想集成的常用框架,它都有对应的组件支持。

Spring Boot 是一套全新的框架,它来自于 Spring 大家族,因此 Spring 所有具备的功能它都有,而且更容易使用;Spring Boot 以约定大于配置的核心思想,默认帮我们进行了很多设置,多数 Spring Boot 应用只需要很少的 Spring 配置。Spring Boot 开发了很多的应用集成包,支持绝大多数开源软件,让我们以很低的成本去集成其他主流开源软件。

Spring Boot 特性

  • 使用 Spring 项目引导页面可以在几秒构建一个项目
  • 方便对外输出各种形式的服务,如 REST API、WebSocket、Web、Streaming、Tasks
  • 非常简洁的安全策略集成
  • 支持关系数据库和非关系数据库
  • 支持运行期内嵌容器,如 Tomcat、Jetty
  • 强大的开发包,支持热启动
  • 自动管理依赖
  • 自带应用监控
  • 支持各种 IED,如 IntelliJ IDEA 、NetBeans

热度

Spring Boot 本身发展特别快,自从 2014 年 4 月发布 Spring Boot 1.0 之后,版本更新非常频繁,我在 2016 年使用的时候是 1.3.X,到现在 Spring Boot 最新稳定版本为 1.5.8,2.0 版本也进入了第 5 个里程碑。Spring Boot 一经推出就迅速的成为一门热门的技术,从下图也可以看出这个结论:
快速学习 Spring Boot 技术栈_第2张图片
enter image description here
此图来自于百度指数,从图中可知,自从 2015 年 6 月开始,Spring Boot 的搜索指数呈稳定大幅增长的趋势,说明大家对 Spring Boot 的关注度越来越高。
快速学习 Spring Boot 技术栈_第3张图片
enter image description here
此图截取于 Spring Boot 的首页,可以看出 Spring 在官网重点推荐了三个项目,Spring Boot 排名第一,可见官方的重视程度。

为什么学习 Spring Boot

  • 从软件发展的角度来讲,越简单的开发模式越会流行。简单的开发模式解放出更多生产力,让开发人员可以将精力集中在业务上,而不是各种配置、语法所设置的门槛上。Spring Boot 就是尽可能的简化应用开发的门槛。

  • Spring Boot 所集成的技术栈,几乎都是各互联网公司在使用的技术,按照 Spring Boot 的路线去学习,基本可以了解国内外互联网公司的技术特点。

  • Spring Boot 和微服务架构都是未来软件开发的一个大趋势,越早参与其中受益越大。

这个课程可以学到什么

早些时候由于工作原因研究并使用了 Spring Boot,在使用时发现,国内对于 Spring Boot 介绍的资料并不是很多,网上充斥着各种资料质量参差不齐,这给初学者带来了很大的困扰。于是我在网络上连载了 Spring Boot 的系列文章,并且受到广大网友的喜欢。早期的文章可以在我的个人公众号或者博客查看:

  • 我的公众号
  • 我的博客

回过头来再次翻看这些文章,很多的 API 已经过时,大多数文章也只是理论为主,并且那时候对 Spring Boot 没有一个整体的了解,文章只是罗列了最基本的使用。因此我又重新梳理了 Spring Boot 技术栈,将其中工作中最常用、最具实战代表性的一些内容重新整理出来,以 GitChat 达人课的形式来展现。课程也增加了实战项目的内容,让你亲自体会如何使用 Spring Boot 技术栈进行快速开发,并且可以很快的应用在工作中。

本期达人课,首先介绍如何使用 Spring Boot 进行快速开发,再一起探讨 Spring Boot 如何快速集成主流开源软件,最后使用 Spring Boot 技术栈实现一个简单的用户管理系统,进行实战演练。通过本课程学习,可以掌握工作中最常用的技术和实际项目的使用经验。

适合阅读的人群

该系列文章适合以下人群阅读:

  • 从事 Java 相关开发对 Spring Boot 感兴趣的人员
  • 传统开发领域,急迫想打破原有开发模式的开发人员

在学习本节课程之前,首先需要了解 Spring、Maven 和其他开源软件的基础技能。

因为 Spring Boot 2.0 还在开发中,为了更贴近实战,我们选取 Spring Boot1.5.8.RELEASE 版本进行演示。

开发环境:

  • IDEA 2017
  • JDK 1.8

使用到的软件:

  • JPA
  • MyBatis
  • Thymeleaf
  • Druid
  • Redis
  • RabbitMQ
  • MongoDB
  • Quartz

课程列表

  • 快速实战 Spring Boot
  • 快速体验 Web 开发
  • Spring Data JPA 的使用
  • 前端模板引擎 Thymeleaf
  • JPA 和 Thymeleaf 实践
  • Spring Boot 集成 MyBatis
  • MyBatis Druid 多数据源
  • 如何玩转 Redis
  • Redis 实现 Session 共享
  • RabbitMQ 详解
  • MongoDB 实战
  • 使用 Spring Boot 发送邮件
  • Spring Boot 集成 Quartz
  • Spring Boot 集成测试和部署运维
  • 综合实战用户管理系统

点击这里下载源码 。

第02课:快速实战 Spring Boot

什么是 Spring Boot

Spring 在官方首页这样介绍:

BUILD ANYTHING . Spring Boot is designed to get you up and running as quickly as possible, with minimal upfront configuration of Spring. Spring Boot takes an opinionated view of building production ready applications.

解释一下:Spring Boot 可以构建一切。Spring Boot 设计之初就是为了最少的配置,最快的速度来启动和运行 Spring 项目。Spring Boot 使用特定的配置来构建生产就绪型的项目。

使用 Spring Boot 有什么好处

其实就是简单、快速、方便!如果搭建一个 Spring Web 项目的时候需要怎么做呢?

  • 配置 web.xml,加载 Spring 和 Spring MVC
  • 配置数据库连接、配置 Spring 事务
  • 加载配置文件的读取,开启注解
  • 配置日志文件
  • 配置完成之后部署 Tomcat 调试

现在非常流行微服务,如果我这个项目仅仅只是需要发送一个邮件,如果我的项目仅仅是生产一个积分;我都需要这样折腾一遍!

但是如果使用 Spring Boot 呢?很简单,仅仅只需要三步就可以快速的搭建起一个 Web 项目!

使用 Spring Boot 到底有多爽,用下面这幅图来表达:
快速学习 Spring Boot 技术栈_第4张图片

快速入门

说了那么多,手痒痒的很,马上来一发试试!

构建项目

(1)访问 http://start.spring.io/。

(2)选择构建工具 Maven Project、Spring Boot 版本 1.5.8 及一些工程基本信息,可参考下图:
快速学习 Spring Boot 技术栈_第5张图片

(3)单击 Generate Project 按钮并下载项目压缩包。

(4)解压后,单击 Eclipse,Import | Existing Maven Projects | Next | 选择解压后的文件夹 | Finsh 命令,OK Done!

(5)如果使用的是 Idea,单击 File | New | Model from Existing Source.. | 选择解压后的文件夹 | OK 命令, 选择 Maven ,一路 Next,OK Done!

如果读者使用的是 Idea 工具,也可以这样:

(1)单击 File | New | Project… 命令,弹出新建项目框。

(2)选择 Spring Initializr 选项,单击 Next 按钮,也会出现上述类似的配置界面,Idea 帮我们做了集成。

(3)填写相关内容后,单击 Next 按钮,选择依赖的包再单击 Next 按钮,最后确定信息无误单击 Finish 按钮。

对上面的配置做一个解释:

  • 第一个选择框选择创建以 Maven 构建项目,还是以 Gradle 构建项目,这是两种不同的构建方式,其中 Gradel 配置内容更简洁一些,并且包含了 Maven 的使用,不过日常使用 Maven 居多。
  • 第二个选择框选择编程语言,现在支持 Java、Kotlin 和 Groovy。
  • 第三个选择框选择 Spring Boot 版本,可以看出 Spring Boot 2.0 已经到了第五个里程碑了。在实际使用中,我们会优先使用稳定版本,1.0 的最新稳定版本是 1.5.8,也是我们演示使用的版本。

下面就是项目的配置信息了。

  • Group:一般填写公司域名,比如百度公司填 com.baidu,演示使用 com.neo。
  • Artifact:可以理解为项目的名称,可以根据实际情况来填,本次演示填写 helloWorld。
  • Dependencies:在这块添加我们项目所依赖的 Spring Boot 组件,可以多选。本次选择 Web、devtools 两个模块。
    项目结构介绍

快速学习 Spring Boot 技术栈_第6张图片

如上图所示,Spring Boot 的基础结构共三个文件:

  • src/main/java:程序开发以及主程序入口
  • src/main/resources:配置文件
  • src/test/java:测试程序

另外,Sping Boot 建议的目录结果如下:

root package 结构:com.example.myproject

myproject
 +-src
    +- main
         +- java
              +- com.example.myproject
                    +- comm
                    +- domain
                    +- repository
                    +- service
                    +- web
                    +- Application.java
         +- resources
              +- static
              +- templates
              +- application.properties
    +- test
 +-pom.xml

com.example.myproject 目录下:

  • Application.java:建议放到根目录下面,是项目的启动类,Spring Boot 项目只能有一个 main() 方法。
  • comm:目录建议放置公共的类,如全局的配置文件、工具类等。
    domain:目录主要用于实体(Entity)与数据访问层(Repository)。
  • repository:数据库访问层代码。
  • service:该层主要是业务类代码。
  • web:该层负责页面访问控制。

resources 目录下:

  • static:目录存放 Web 访问的静态资源,如 JS、CSS、图片等。
    templates:目录存放页面模板。
  • application.properties:项目的配置信息。
  • test 目录存放单元测试的代码;pom.xml 用于配置项目依赖包,以及其他配置。

采用默认配置可以省去很多设置,当然也可以根据自己的喜好来进行更改。最后,启动 Application main 方法,至此一个 Java 项目搭建好了!

简单 Web 开发

(1)可以在 Spring Initializr 上面添加,也可以手动在 pom.xml 中添加:

<dependency>
        <groupId>org.springframework.bootgroupId>
        <artifactId>spring-boot-starter-webartifactId>
 dependency>

pom.xml 文件中默认有两个模块:

  • spring-boot-starter:核心模块,包括自动配置支持、日志和 YAML;

  • spring-boot-starter-test:测试模块,包括 JUnit、Hamcrest、Mockito。

(2)编写 controller 内容:

@RestController
public class HelloWorldController {

    @RequestMapping("/hello")
    public String hello() {
        return "Hello World";
    }
}

@RestController的意思就是 controller 里面的方法都以 json 格式输出,不用再配置什么 jackjson 的了!

如果配置为@Controller就代表着输出为页面内容。

(3)启动主程序,打开浏览器访问 http://localhost:8080/hello,就可以看到以下内容,是不是很简单!

Hello World
(4)如果我们想传入参数怎么办?

@RestController
public class HelloWorldController {

    @RequestMapping("/hello")
    public String index(String name) {
        return "Hello World, " +name;
    }
}

重新启动项目,访问 http://localhost:8080/hello?name=neo,返回内容如下:

Hello World,neo

经过上一个测试发现,修改 controller 内相关代码,就需要重新启动项目才能生效,这样做很麻烦是不是,别着急。Spring Boot 提供了另外一个组件来解决。

热部署

热启动就需要用到我们在一开始引入的另外一个组件:devtools。它是 Spring Boot 提供的一组开发工具包,其中就包含我们需要的热部署功能。但是在使用这个功能之前还需要再做一些配置。

(1)在 dependency 中添加 optional 属性,并设置为 true:

 <dependencies>
    <dependency>
        <groupId>org.springframework.bootgroupId>
        <artifactId>spring-boot-devtoolsartifactId>
        <optional>trueoptional>
    dependency>
dependencies>

(2)在 plugin 中配置另外一个属性 fork,并且配置为 true:

<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.bootgroupId>
            <artifactId>spring-boot-maven-pluginartifactId>
            <configuration>
                <fork>truefork>
            configuration>
        plugin>
plugins>
build>

OK,以上两步配置完成,如果读者使用的是 Eclipse,那么恭喜你大功告成了。

如果读者使用的是 Idea 还需要做以下配置。

(3)配置 Idea

选择 File-Settings-Compiler 勾选 Build project automatically,低版本 Idea 勾选make project automatically
快速学习 Spring Boot 技术栈_第7张图片

使用快捷键:CTRL + SHIFT + A 输入Registry 找到选项 compile.automake.allow.when.app.running 勾选

这里写图片描述

全部配置完成后,Idea 就支持热部署了,大家可以试着去改动一下代码就会发现 Spring Boot 会自动重新加载,再也不需要我们手动点击重新部署了。

为什么 Idea 需要多配置后面这一步呢,因为 Idea 默认不是自动编译的,需要我们手动去配置后才会自动编译,而热部署依赖于项目的自动编译功能。

该模块在完整的打包环境下运行的时候会被禁用。如果使用 java -jar 启动应用或者用一个特定的 classloader 启动,它会认为这是一个“生产环境”。

单元测试

单元测试在日常开发中是必不可少的,一个牛逼的程序员,单元测试写得也是杠杠的。下面来看下 Spring Boot 对单元测试又做了哪些支持?

如果我们只想运行一个 hello World,只需要一个注解就可以。在 src/test 目录下新建一个 HelloTests 类,代码如下:

public class HelloTest {
    @Test
    public void hello(){
        System.out.println("hello world");
    }
}

单击右键“运行”按钮,会发现控制台输出:hello world。仅仅只需要了一个注解。但是如果我们需要测试 web 层的请求呢?Spring Boot 也给出了支持。

以往我们在测试 web 请求的时候,需要手动输入相关参数在页面测试查看效果,或者自己写 post 请求。在 Spring Boot 中,Spring 给出了一个简单的解决方案;使用 mockmvc 进行 web 测试,mockmvc 内置了很多工具类和方法,可以模拟 post、get 请求,并且判断返回的结果是否正确等,也可以利用print()打印执行结果。

@SpringBootTest
public class HelloTest {

    private MockMvc mockMvc;

    @Before
    public void setUp() throws Exception {
        mockMvc = MockMvcBuilders.standaloneSetup(new HelloWorldController()).build();
    }

    @Test
    public void getHello() throws Exception {
        mockMvc.perform(MockMvcRequestBuilders.post("/hello?name=小明").accept(MediaType.APPLICATION_JSON_UTF8)).andDo(print());
    }

}

在类的上面添加@SpringBootTest,系统会自动加载 Spring Boot 容器。在日常测试中,我们就可以注入 bean 来做一些局部业务的测试。MockMvcRequestBuilders可以 post、get 请求,使用print()方法会将请求和相应的过程都打印出来,如下:

MockHttpServletRequest:
      HTTP Method = POST
      Request URI = /hello
       Parameters = {name=[neo]}
          Headers = {}

Handler:
             Type = com.neo.helloWorld.web.HelloWorldController
           Method = public java.lang.String com.neo.helloWorld.web.HelloWorldController.hello(java.lang.String)

...

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = {Content-Type=[text/plain;charset=ISO-8859-1], Content-Length=[16]}
     Content type = text/plain;charset=ISO-8859-1
             Body = Hello World ,neo
    Forwarded URL = null
   Redirected URL = null
          Cookies = []   

从返回的Body = Hello World ,neo可以看出请求成功。

总结

使用 Spring Boot 可以非常方便、快速搭建项目,而不用关心框架之间的兼容性、适用版本等各种问题,我们想使用任何东西,仅仅添加一个配置就可以,所以使用 Sping Boot 非常适合构建微服务。

建议大家使用 Idea 开发 Spring Boot 项目,Eclipse 对 Spring Boot 项目支持并不好,并且使用 Eclipse 偶尔会出现一些诡异的问题,影响初学者的学习。

点击这里下载源码。

第03课:快速体验 Web 开发

本篇介绍 Spring Boot 对 Web 开发的支持。

从上篇文章可知,Spring Boot 对 Web 开发做了很大的优化,包括开发、测试、部署都做了支持。本篇内容介绍 Spirng Boot 对 Web 提供的其他便利。

spring-boot-starter-web 是 Spring Boot 对 Web 开发的支持,主要包括 RESTful、参数校验、使用 Tomcat 作为内嵌容器等功能,接下来一一介绍。

Json 的支持

在 Spring Boot 体系中,天然对 Json 支持,在上篇文章中给大家做了简单的演示,这次来深入使用一番。

新建一个项目 spring-boot-web,添加上篇同样的组件依赖,导入项目到 Idea 中。在项目路径下新建 domain 包,在包下新建一个实体类 User,User 信息如下:

public class User {
    private String name;
    private int age;
    private String pass;
    //setter、getter 省略
}

在项目中新建 web 包,并在 web 包下新建一个类 WebController,在类中创建一个方法返回 User,如下:

@RestController
public class WebController {
    @RequestMapping("/getUser")
    public User getUser() {
        User user=new User();
        user.setName("小明");
        user.setAge(12);
        user.setPass("123456");
        return user;
    }
}

在 Test 包下新建 WebControllerTest 测试类,对 getUser() 方法进行测试。

@SpringBootTest
public class WebControllerTest {
    //省略部分代码
    @Test
    public void getUser() throws Exception {
        mockMvc.perform(MockMvcRequestBuilders.post("/getUser")).andDo(print());
    }

}

返回结果如下:

{"name":"小明","age":12,"pass":"123456"}

说明 Spring Boot 自动将 User 对象转成了 Json 进行返回。那么如果返回的是一个 list 呢,在 WebController 添加方法 getUsers():

 @RequestMapping("/getUsers")
    public List getUsers() {
        List users=new ArrayList();
        User user1=new User();
        user1.setName("neo");
        user1.setAge(30);
        user1.setPass("neo123");
        users.add(user1);
        User user2=new User();
        user2.setName("小明");
        user2.setAge(12);
        user2.setPass("123456");
        users.add(user2);
       return users;
    }

添加测试方法进行测试,返回内容如下:

[{"name":"neo","age":30,"pass":"neo123"},{"name":"小明","age":12,"pass":"123456"}]

说明不管是对象还是集合或者对象嵌套,Spring Boot 均可以将其转化为 Json 字符串,特别适合我们给其他系统提供接口时使用。

请求传参

使用 Spirng Boot 可以轻松的对请求做一些限制,比如为了安全只允许 POST 请求的访问。只需要在方法上添加一个配置即可:

@RequestMapping(name="/getUser", method= RequestMethod.POST)
public User getUser() {
    ...
}

这时候再以 get 请求去访问,就会返回:Request method 'GET' not supported

Spring Web 层支持多种方法传参,上篇文章中传入一个属性 name,其直接使用对象接收也是支持的。

@RequestMapping(name="/getUser", method= RequestMethod.POST)
public String getUser(User user) {
    ...
}

这样的写法,只要是 User 的属性都会被自动填充到 user 对象中。还有另外一种传参的方式。

使用 Url 进行传参,这种形式的传参地址栏会更加美观一些。

@RequestMapping(value="get/{name}", method=RequestMethod.GET)
public User get(@PathVariable String name) {
    User user=new User();
    user.setName(name);
    return user;
}

浏览器访问:http://localhost:8080/get/neo,返回:{"name":"neo","age":0,"pass":null},说明 name 值已经传入成功。

参数校验

参数校验在我们日常开发中非常常见,最基本的校验有判断属性是否为空、长度是否符合要求等,在传统的开发模式中需要写一堆的 if else 来处理这些逻辑,很繁琐,效率也低。使用 @Valid + BindingResult 就可以优雅地解决这些问题,接下来看看示例:

首先在 WebController 添加一个保存用户的方法 saveUser,参数为 User,现在需要对参数 User 做校验:

public class User {
    @NotEmpty(message="姓名不能为空")
    private String name;
    @Max(value = 100, message = "年龄不能大于 100 岁")
    @Min(value= 18 ,message= "必须年满 18 岁!" )
    private int age;
    @NotEmpty(message="密码不能为空")
    @Length(min=6,message="密码长度不能小于 6 位")
    private String pass;

    //...
}

对不同的属性,按照规则添加了不同校验内容。

Spring Boot 的参数校验其实是依赖于 hibernate-validator 来进行。现在模拟对参数 User 进行参数校验,使用 @Valid + BindingResult,校验后如果有错误将错误打印出来,代码如下:

@RequestMapping("/saveUser")
public void saveUser(@Valid User user,BindingResult result) {
    System.out.println("user:"+user);
    if(result.hasErrors()) {
        List list = result.getAllErrors();
        for (ObjectError error : list) {
            System.out.println(error.getCode() + "-" + error.getDefaultMessage());
        }
    }
}

添加测试方法进行测试:

@Test
public void saveUsers() throws Exception {
    mockMvc.perform(MockMvcRequestBuilders.post("/saveUser")
            .param("name","")
            .param("age","666")
            .param("pass","test")
    ).andDo(print());
}

结果返回:

user:name=,age=666,pass=test
Max-年龄不能大于 100Length-密码长度不能小于 6 位
NotEmpty-姓名不能为空

结果显示均已经触发了校验规则,返回了错误信息,在实际使用过程中可以对错误信息进行包装,最后返回到前端进行展示。

自定义 Filter

我们常常在项目中会使用 Filters 用于记录请求日志、排除有 XSS 威胁的字符、执行权限验证等等。Spring Boot 自动添加了 OrderedCharacterEncodingFilter 和 HiddenHttpMethodFilter,并且可以自定义 Filter。

自定义 Filter 两个步骤:

实现 Filter 接口,实现 Filter 方法 添加@Configuration 注解,将自定义 Filter 加入过滤链

新建 MyFilter 类,使用 doFilter() 方法:

public class MyFilter implements Filter {
    @Override
    public void destroy() {
        // TODO Auto-generated method stub
    }

    @Override
    public void doFilter(ServletRequest srequest, ServletResponse sresponse, FilterChain filterChain)
            throws IOException, ServletException {
        // TODO Auto-generated method stub
        HttpServletRequest request = (HttpServletRequest) srequest;
        System.out.println("this is MyFilter,url :"+request.getRequestURI());
        filterChain.doFilter(srequest, sresponse);
    }

    @Override
    public void init(FilterConfig arg0) throws ServletException {
        // TODO Auto-generated method stub
    }
}

将自定义 Filter 加入过滤链:

@Configuration
public class WebConfiguration {
    @Bean
    public RemoteIpFilter remoteIpFilter() {
        return new RemoteIpFilter();
    }

    @Bean
    public FilterRegistrationBean testFilterRegistration() {

        FilterRegistrationBean registration = new FilterRegistrationBean();
        registration.setFilter(new MyFilter());
        registration.addUrlPatterns("/*");
        registration.addInitParameter("paramName", "paramValue");
        registration.setName("MyFilter");
        registration.setOrder(1);
        return registration;
    }
}

添加完后启动项目,访问任意的 Url,都会看到控制台打印如下信息:

this is MyFilter,url :/xxx

说明 MyFilter 已经对所有的 Url 进行了监控,在实际使用的过程中,常常利用这个特性进行 session 验证,判断用户是否登录。

自定义 Property

在 Web 开发的过程中,经常需要自定义一些配置文件,如何使用呢?

配置在 application.properties 中

com.neo.title=纯洁的微笑
com.neo.description=分享生活和技术

自定义配置类:

@Component
public class NeoProperties {
    @Value("${com.neo.title}")
    private String title;
    @Value("${com.neo.description}")
    private String description;

    //省略 getter settet 方法

    }

写单元测试进行验证:

@RunWith(SpringRunner.class)
@SpringBootTest
public class PropertiesTest {

    @Resource
    private NeoProperties properties;

    @Test
    public void testProperties() throws Exception {
        System.out.println("title:"+properties.getTitle());
        System.out.println("description:"+properties.getDescription());
    }

}

运行 test 后输出结果:

text title:纯洁的微笑 description:分享生活和技术

如果测试中出现中文乱码,可安装以下方法进行设置:

依次单击 File | Settings | Editor | File Encodings 命令,将 Properties Files (*.properties) 下的 Default encoding for properties files 设置为 UTF-8,将 Transparent native-to-ascii conversion 前的复选框勾选上。

总结

Spring Boot 集成了参数校验、内嵌容器、Restful、JSON 内容,这些技术在进行 Web 开发中必不可少。Spring Boot 对这些技术进行了包装,让我们在 Web 项目开发过程中非常容易的使用这些技术,降低了开发 Web 项目的技术难度。

点击这里下载源码。

下一篇

你可能感兴趣的:(打包,java,spring-boot,GitChat技术杂谈)