SpringBoot入门3(SpringBoot 2.0)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_34515002/article/details/82491363

参考: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学习案例

扫描二维码关注公众号,回复: 3653155 查看本文章

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/

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

猜你喜欢

转载自blog.csdn.net/qq_34515002/article/details/82491363