4

时间:2018年04月08日星期日
说明:本文部分内容均来自慕课网。@慕课网:https://www.imooc.com
教学源码:无
学习源码:https://github.com/zccodere/s...

第一章:课程介绍

1-1 课程介绍

课程内容

  • Spring Boot介绍
  • 环境准备
  • 第一个Spring Boot项目
  • 多模块项目
  • 打包和运行

1-2 框架定位

clipboard.png

1-3 特性介绍

2.0 新特性

  • 编程语言:Java 8及以上
  • 底层框架:Spring Framework 5.0.0及以上
  • 全新特性:Web Flux

为什么选择Web Flux

  • 函数编程:Java8 Lambda
  • 响应编程:Reactive Streams
  • 异步编程:Servlet 3.1或Asyn NIO

第二章:简单项目

2-1 环境准备

开发环境

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.完成后的项目结构如下

clipboard.png

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)

完成后的结构如下

clipboard.png

第四章:课程总结

4-1 课程总结

主要内容

  • Spring Boot 介绍
  • Spring Boot 项目
  • Spring Boot 模块
  • Spring Boot 打包
  • Spring Boot 运行

妙手空空
1.3k 声望370 粉丝

博观而约取,厚积而薄发