SpringBoot入门3(SpringBoot 2.0)
参考: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
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如何启用https协议
-
基于Springboot2.0构建ES的多客户端
-
Spring Boot入门系列八(SpringBoot 整合Mybatis)
-
springboot2.0和springcloud Finchley版项目搭建(包含eureka,gateWay,Freign,Hystrix)
-
SpringBoot2.0 整合 Shiro 框架,实现用户权限管理
-
SpringBoot2.0 整合 SpringSecurity 框架,实现用户权限安全管理
-
[springboot 开发单体web shop] 3. 用户注册实现
-
Docker从入门到掉坑(二):基于Docker构建SpringBoot微服务
-
微项目:一步一步带你使用SpringBoot入门(二)
-
SpringBoot 2.0 开发案例之百倍级减肥瘦身之旅