慕课网《Spring Boot 2.0深度实践-初遇Spring Boot》学习总结
时间:2018年04月08日星期日
说明:本文部分内容均来自慕课网。@慕课网:https://www.imooc.com
教学源码:无
学习源码:https://github.com/zccodere/study-imooc
第一章:课程介绍
1-1 课程介绍
课程内容
Spring Boot介绍
环境准备
第一个Spring Boot项目
多模块项目
打包和运行
1-2 框架定位
2.0 新特性
编程语言:Java 8及以上
底层框架:Spring Framework 5.0.0及以上
全新特性:Web Flux
为什么选择Web Flux
函数编程:Java8 Lambda
响应编程:Reactive Streams
异步编程:Servlet 3.1或Asyn NIO
第二章:简单项目
2-1 环境准备
开发环境
安装JDK(https://java.oracle.com)
安装Maven(https://maven.apache.org)
安装IDEA(https://www.jetbrains.com/idea)
2-2 构建项目
简单应用
编写REST程序
运行Spring Boot应用
使用Http请求工具Postman
场景说明
定义用户模型,包括属性:用户ID和名称
客户端发送POST请求,创建用户(Web MVC)
客户端发送GET请求,获取所有用户(Web Flux)
代码编写
1.创建名为boot-simple的maven工程pom如下
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.myimooc</groupId>
<artifactId>boot-simple</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>boot-simple</name>
<description>Demo project for Spring Boot</description>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.1.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-webflux</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
2.完成后的项目结构如下
3.编写BootSimpleApplication类
package com.myimooc.boot.simple;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
/**
* <br>
* 标题: 启动类<br>
* 描述: 简单应用<br>
*
* @author zc
* @date 2018/04/08
*/
@SpringBootApplication
public class BootSimpleApplication {
public static void main(String[] args) {
SpringApplication.run(BootSimpleApplication.class, args);
}
}
4.编写User类
package com.myimooc.boot.simple.domain;
import java.io.Serializable;
/**
* <br>
* 标题: 用户模型<br>
* 描述: POJO类<br>
*
* @author zc
* @date 2018/04/08
*/
public class User implements Serializable{
private static final long serialVersionUID = 7564986345486454458L;
/**
* 主键ID
*/
private Integer id;
/**
* 用户名称
*/
private String name;
@Override
public String toString() {
return "User{" +
"id=" + id +
", name='" + name + '\'' +
'}';
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
5.编写UserRepository类
package com.myimooc.boot.simple.repository;
import com.myimooc.boot.simple.domain.User;
import org.springframework.stereotype.Repository;
import java.util.Collection;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;
import java.util.concurrent.atomic.AtomicInteger;
/**
* <br>
* 标题: 用户资源库<br>
* 描述: 领域驱动模型开发<br>
*
* @author zc
* @date 2018/04/08
* {@link User} {@link Repository}
*/
@Repository
public class UserRepository {
/**
* 采用内存型存储方式
*/
private final ConcurrentMap<Integer,User> repository = new ConcurrentHashMap<>(16);
private final static AtomicInteger ID_GENERATOR = new AtomicInteger();
/**
* 保存用户对象
* @param user {@link User}
* @return 如果成功返回<code>true</code>,否则,返回<code>false</code>
*/
public boolean save(User user){
// ID 从 1 开始
Integer id = ID_GENERATOR.incrementAndGet();
user.setId(id);
// put 方法返回 null 时表示保存成功
return repository.put(id,user) == null;
}
/**
* 返回所有用户列表
* @return 所有用户列表
*/
public Collection<User> findAll(){
return repository.values();
}
}
6.编写UserController类
package com.myimooc.boot.simple.controller;
import com.myimooc.boot.simple.domain.User;
import com.myimooc.boot.simple.repository.UserRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
/**
* <br>
* 标题: 用户 REST 接口<br>
* 描述: RESTFul 格式<br>
*
* @author zc
* @date 2018/04/08
*/
@RestController
public class UserController {
private final UserRepository userRepository;
@Autowired
public UserController(UserRepository userRepository){
this.userRepository = userRepository;
}
@PostMapping("/person/save")
public User save(@RequestParam String name){
User user = new User();
user.setName(name);
if (userRepository.save(user)){
System.out.printf("用户对象: %s 保存成功\n",user);
}
return user;
}
}
7.编写RouterFunctionConfiguration类
package com.myimooc.boot.simple.config;
import com.myimooc.boot.simple.domain.User;
import com.myimooc.boot.simple.repository.UserRepository;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.reactive.function.server.*;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;
import java.util.Collection;
/**
* <br>
* 标题: 路由器函数配置<br>
* 描述: 配置映射<br>
*
* @author zc
* @date 2018/04/08
*/
@Configuration
public class RouterFunctionConfiguration {
/**
* Servlet 规范
* 请求接口:ServletRequest 或者 HttpServletRequest
* 响应接口:ServletResponse 或者 HttpServletResponse
*
* Spring 5.0 重新定义了服务请求的响应接口
* 请求接口:ServerRequest
* 响应接口:ServerResponse
* 即可支持 Servlet 规范,也可以支持自定义,比如 Netty (Web Server)
* 以本例
* 定义 GET 请求,并且放回所有的用户对象 URI:/person/find/all
* Flux 是 0 - N 个对象集合
* Mono 是 0 - 1 个对象集合
* Reactive 中的 Flux 或者 Mono 是异步处理(非阻塞)
* 集合对象基本上是同步处理(阻塞)
* Flux 或者 Mono 都是 Publisher
*/
@Bean
public RouterFunction<ServerResponse> personFindAll(UserRepository userRepository){
Collection<User> users = userRepository.findAll();
return RouterFunctions.route(RequestPredicates.GET("/person/find/all"),
request -> {
Flux<User> userFlux = Flux.fromIterable(users);
return ServerResponse.ok().body(userFlux,User.class);
});
}
}
第三章:简单使用
3-1 模块拆分
多模块重构
调整父模块工程类型(packageing)
创建子模块工程(module)
子模块依赖管理(dependencyManagement)
完成后的结构如下
主要内容
Spring Boot介绍
Spring Boot 项目
Spring Boot 模块
Spring Boot 打包
Spring Boot 运行