欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

SpringBoot入门3(SpringBoot 2.0)

程序员文章站 2022-05-03 13:14:32
...

参考:Spring Boot 2.0深度实践-初遇Spring Boot

环境:

JDK8

Maven

IDEA

POSTMAN

 

1、Spring Boot 介绍

2、Spring Boot 2.0 新特性

3、Spring Web MVC 学习案例

4、Spring Web Flux学习案例

5、多模块化项目

6、各种Spring Boot构建方式

7、各种 Spring Boot 运行方式

SpringBoot的角色

SpringFramework-->SpringBoot-->SpringCloud

2.0新特性

编程语言:Java8,Kotlin

底层框架:Spring Framwork 5.0.x

全新特性:Web Flux

1、为什么选择Web Flux?

函数编程: Java8 Lambda

响应编程:Reactive Streams

异步编程:Servlet 3.1或Asyc NIO

第一个SpringBoot项目

1、环境准备:JDK,MAVEN,IDEA

略。

IDEA 社区版(免费COMMUNITY):配置MAVEN、JAVA8 JDK

2、简单应用:

编写REST程序

运行SpringBoot应用

使用HTTP请求工具:PostMan

3、场景说明:

定义用户模型:包括属性:用户ID和名称

客户端发送POST请求:创建用户(Web MVC)

客户端发送GET请求:获取所有用户(Web Flux)

4、下载Spring Initializr

URL:https://start.spring.io/

SpringBoot入门3(SpringBoot 2.0)

IDEA import这个下载的项目。

5、定义用户模型:包括属性:用户ID和名称

User.java

package com.imooc.firstappdemo.domain;

/**
 * Created By  Administrator
 * Date&Time:   2018/9/7 10:09
 */
public class User{
    private Integer id;
    private String name;

    public User() {
    }

    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;
    }

    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", name='" + name + '\'' +
                '}';
    }
}

6、客户端发送POST请求:创建用户(Web MVC)

存储数据到内存&&查询数据

UserRepository.java

package com.imooc.firstappdemo.repository;

import com.imooc.firstappdemo.domain.User;
import org.springframework.stereotype.Repository;

import java.util.Collection;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.atomic.AtomicInteger;

/**
 * Created By   Administrator
 * Date&Time:   2018/9/7 11:13
 */
@Repository
public class UserRepository {

    /* * 采用内存型的存储方式 -> Map*/
    private final ConcurrentHashMap<Integer,User> repository = new ConcurrentHashMap<>();
    /*ID 自动生成器,自增*/
    private  final  static AtomicInteger idGenerator = new AtomicInteger();

    /**
     * 保存用户对象
     * @param user {@link User} 对象
     * @return 如果保存成功,返回<code>true</code>,否则返回<code>false</code>
     */
    public boolean save(User user){
        //ID从1开始
        Integer id = idGenerator.incrementAndGet();
        user.setId(id);

        return repository.put(id,user)==null;
    }

    public Collection<User> findAll() {
        return repository.values();
    }
}

UserContoller,以POST的方式存储数据。

package com.imooc.firstappdemo.controller;

import com.imooc.firstappdemo.domain.User;
import com.imooc.firstappdemo.repository.UserRepository;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
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;

/**
 * Created By   Administrator
 * Date&Time:   2018/9/7 11:42
 */
@RestController
public class UserController {
    private final Logger logger = LoggerFactory.getLogger(UserController.class
    );

    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);

        Boolean save = userRepository.save(user);
        if(save){
            this.logger.info("用户对象:{}保存成功!",user);
        }

        return user;
    }

}

7、客户端发送GET请求:获取所有用户(Web Flux)

package com.imooc.firstappdemo.config;

import com.imooc.firstappdemo.domain.User;
import com.imooc.firstappdemo.repository.UserRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.reactive.function.server.RequestPredicates;
import org.springframework.web.reactive.function.server.RouterFunction;
import org.springframework.web.reactive.function.server.RouterFunctions;
import org.springframework.web.reactive.function.server.ServerResponse;
import reactor.core.publisher.Flux;

import java.util.Collection;

/**
 * Created By   Administrator
 * Date&Time:   2018/9/7 14:05
 * 路由器函数 配置
 */
@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
    @Autowired
    public RouterFunction<ServerResponse> personFindAll(UserRepository userRepository){

        return RouterFunctions.route(RequestPredicates.GET("/person/find/all"),
                request-> {
                    /*返回所有的用户对象*/
                    Collection<User> users = userRepository.findAll();
                    Flux<User> userFlux = Flux.fromIterable(users);
                    return ServerResponse.ok().body(userFlux,User.class);

                });

    }

}

构建方式、多模块、运行方式

1、构建项目

图形化方式(http://start.spring.io/)

命令行方式(Maven)

 

单模块改变为多模块

 

项目打包

mvn -Dmaven.test.skip -u clean package

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

相关标签: SpringBoot2.0