一、新特性

依赖java 8+

支持Kotlin语言,主要底层框架采用了(Spring Framwork 5.0X)

支持全新特性:Web Flux(一种新的编程模型,是对传统的Spring MVC做了一种补充)


为什么选择Web Flux?

  • 支持函数编程:Java 8 Lambda

  • 响应式编程:Reactive Streams,主要是指的一个规范

  • 异步编程:Servlet 3.1或者Asyc NIO


二、使用简单Web Flux

场景:发送GET请求,获取所有用户(Web Flux和Web MVC)

业务:通过GET请求,添加用户;存储在Map中,再通过findAll获取之前添加的所有用户

1.创建项目

BaiduShurufa_2018-7-1_17-46-5.jpg

2.检查pom.xml文件;发现它和web时所用到的dependency完全不一样。

spring boot入门之——2.0新特性以及模块化构建_第1张图片

MVC模式同web,结构如下:

spring boot入门之——2.0新特性以及模块化构建_第2张图片

关键代码如下:

public class User {

	private Integer id;
	
	private String name;

	//get/set方法

	@Override
	public String toString() {
		return "User [id=" + id + ", name=" + name + "]";
	}
/**
 * dao,数据访问对象
 * 由两部分组成{@link User}{@link Repository}
 * version 1.0
 * TODO
 */
@Repository
public class UserRepository {

	/**
	 * 采用内存的存储方式 -> Map
	 */
	private ConcurrentMap repository = new ConcurrentHashMap<>();
	
	/**
	 * Id采用自增长的方式
	 */
	private final static AtomicInteger idGenerator = new AtomicInteger();
	
	
	/**
	 * 保存用户对象
	 * @param user {@link User}对象
	 * @return 
	 */
	public boolean save(User user){
		//ID从1开始
		Integer id = idGenerator.incrementAndGet();
		user.setId(id);
		//返回null,说明保存成功
		return repository.put(id, user)==null;
	}
	
	/**
	 * 返回所有用户列表
	 * @return
	 */
	public Collection findAll(){
		return repository.values();
	}
}
@RestController
public class UserController {

	//采用构造器的注入方式
	/**
	 * 1.不能修改
	 * 2.可以提早进行初始化
	 */
	private final UserRepository userRepository;
	
	@Autowired  //可写,可无
	public UserController(UserRepository userRepository) {
		this.userRepository = userRepository;
	}
	
	@PostMapping(value="/person/save")
	public User save(@RequestParam String name){
		User user = new User();
		user.setName(name);
		if(userRepository.save(user)){
			System.out.println("用户对象:"+user+"保存成功!");
		}
		return user;
	}
	
	@GetMapping(value="/persons")
	public Collection findAll(){
		return userRepository.findAll();
	}
}

页面测试访问页面如下:

逐次添加2个用户

spring boot入门之——2.0新特性以及模块化构建_第3张图片

spring boot入门之——2.0新特性以及模块化构建_第4张图片

由findAll()方法获取所有用户

spring boot入门之——2.0新特性以及模块化构建_第5张图片


重点:

在使用Web Flux时有什么区别呢?

Web Flux是Spring 5.X的新特性,支持lambda 等特性,详情后续添加

在此基础上需要增加FunctionConfiguration类

/**
 * 路由器函数 配置
 * version 1.0
 * TODO java版的xml文件
 */
@Configuration
public class RouterFunctionConfiguration {

	/**
	 * Servlet
	 * 请求接口:ServletRequest或者HttpServletRequest
	 * 响应接口:ServletResponse或者HttpServletResponse
	 * 
	 * Spring 5.0 重新定义了服务请求和相应接口
	 * 请求接口:ServerRequest
	 * 响应接口:ServerResponse
	 * 即支持Servlet规范,也可以支持自定义,例如Netty(Web Server)
	 * @return 定义GE请求,返回所有用户对象
	 * Flux 是  0 - N 个对象集合
	 * Mono 是  0 - 1  个对象集合
	 * Reactive中的Flux或者Mono它是异步处理(非阻塞)
	 * 集合对象基本上是同步处理的(阻塞)
	 * Flux或者Mono都是Publisher  提高吞吐量
	 */
	@Bean
	@Autowired
	public RouterFunction findAll(UserRepository userRepository){
		Collection users = userRepository.findAll();
		
		return RouterFunctions.route(RequestPredicates.GET("/person/all"), 
			request ->{
				Flux userFlux = Flux.fromIterable(users);
				return ServerResponse.ok().body(userFlux,User.class);
			});
	}
}

由页面访问结果得知:结果为正确指向;

spring boot入门之——2.0新特性以及模块化构建_第6张图片

本次操作只简单涉及Web Flux,由于设计知识点较多,后续慢慢更新;


三、多模块项目

spring boot入门之——2.0新特性以及模块化构建_第7张图片

多模块项目的层级:

  1. 调整主工程的打包类型

  2. 子模块依赖管理

第1步:修改pom.xml文件

spring boot入门之——2.0新特性以及模块化构建_第8张图片


第2步:选中当前maven项目,右键-->module

spring boot入门之——2.0新特性以及模块化构建_第9张图片

第三步:起个“web”项目名称,其他下一步

spring boot入门之——2.0新特性以及模块化构建_第10张图片

第四步:检查父项目的pom.xml文件和web项目的pom.xml文件

BaiduShurufa_2018-6-17_14-0-33.jpg

spring boot入门之——2.0新特性以及模块化构建_第11张图片

待续... ...