为了账号安全,请及时绑定邮箱和手机立即绑定

慕课网《Spring Boot 2.0深度实践-初遇Spring Boot》学习总结

标签:
Java SpringBoot

慕课网《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 框架定位

图片描述

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 环境准备

开发环境

安装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)

完成后的结构如下

图片描述

第四章:课程总结
4-1 课程总结

主要内容

Spring Boot介绍
Spring Boot 项目
Spring Boot 模块
Spring Boot 打包
Spring Boot 运行
点击查看更多内容
1人点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
JAVA开发工程师
手记
粉丝
138
获赞与收藏
532

关注作者,订阅最新文章

阅读免费教程

感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消