Spring Boot 2.x

从SSH(Structs/Spring/Hibernate)到SSM(SpringMVC/Spring/MyBatis),到现在一个S(Spring)就够的年代,可见Spring越来越重要了。

Spring Boot是用来简化Spring应用的搭建到开发的过程,只需要通过java -jar或tomcat或maven插件run或shell脚本就可以启动项目。因为SpringBoot是“约定优于配置”,所以只要很少的Spring配置文件。

Spring Boot 2.x_第1张图片

上图是Spring Boot 2.0的架构图,Spring Boot 2.0是基于Spring 5 Framework,提供了异步非阻塞IO的响应式Stream、非阻塞式Reactive Web框架Spring WebFlux。

开发环境要求:

 (1)JDK1.8环境及以版本

(2)Spring Framework 5.0及以上版本

(3)Maven 3.2+/Gradle 1.12+

Web MVC架构 

这种模式很适合Spring Boot来开发,View使用JSP或其他模板引擎(默认支持FreeMarker、Groovy、Thymeleaf、Mustache)。

传统模式比如获取用户,是从用户view层发送获取用户请求到Spring Boot提供的用户控制层,然后获取数据封装进Model,最后将model返回到view。

因为Spring Boot基于Spring,所以Spring能做的,Spring就能做到,而且更方便。

前后端分离架构

这种架构,免不了的是API文档作为中间的桥梁,Spring很方便的开发REST API,前端通过调用REST API获取数据,数据形式可能是JSON或者XML等。

然后进行视图渲染,这里的前端也有对应的前端模板引擎。

Spring WebFlux/Reactor

Spring WebFlux是基于Reactive Streams API和Servlet 3.1+容器设计的。

先理解Stream流是什么?流是序列,是生产者生产,一个或多个消费者消费的元素序列。对应发布订阅设计模式,常见的流处理机制是pull或push模式。其中背压是一种常用策略,就是消费者需要多少,生产者就生产多少。

Reactive Streams(响应式流)是提供处理非阻塞背压异步流的一种标准,主要针对运行时环境(JVM和JS)和网络。同样,JDK 9 java.util.concurrent包提供了两个主要的API来处理响应流:

(1)Flow

(2)SubmissionPublisher

而在3.1 规范中一个新特性是异步处理支持,即Servlet线程不需要一直阻塞,即不需要业务处理完毕再输出响应,然后结束Servlet线程。异步处理的作用是在接收到请求之后,Servlet线程可以将耗时的操作委派给另一个线程来完成,在不生成响应的情况下返回至容器。

Spring Boot 2.x_第2张图片

左侧是传统的基于Servlet的Spring Web MVC框架,右侧是5.0版本引入的基于Reactive Streams的Spring WebFlux框架。

(1)Router Functions:提供一套函数风格的API,用于创建Router、Handler、Filter。

(2)WebFlux:核心组件,协调上下游各个组件提供响应式编程支持。

(3)Reactive Streams:一种支持背压的异步数据流处理标准,主流实现有RxJava和Reactor,Spring WebFlux默认集成的是Reactor。

在Web容器的选择上,Spring WebFlux即支持像Tomcat、Jetty这样的传统容器(前提是支持Servlet 3.1 Non-Blocking API),又支持像Netty、Undertow那样的异步容器,不管是何种容器,Spring WebFlux都会将其输入输出流适配成Flux格式,以便进行统一处理。

除了新的Router Functions接口, Spring WebFlux同时支持使用老的Spring MVC注解声明Reactive Controller,和传统的MVC Controller不同,Reactive Controller操作是非阻塞的ServerHttpRequest的ServerHttpResponse,而不是HttpServletRequest和HttpServletResponse。

 @GetMapping("/reactive/restaurants")
    public Flux findAll() {
        return restaurantRepository.findAll();
    }

常见问题

1、jar中没有主清单属性

jar包中包含三个文件夹:Boot-inf , meta-inf, org,在meta-inf文件夹下有一个manifest.mf文件,该文件指明了程序的入口以及版本信息等。

Manifest-Version: 1.0
Implementation-Title: spring-xxx-xxx
Implementation-Version: 0.0.1-SNAPSHOT
Archiver-Version: Plexus Archiver
Built-By: XXXX
Implementation-Vendor-Id: com.huyikang.practice
Spring-Boot-Version: 1.5.9.RELEASE
Implementation-Vendor: Pivotal Software, Inc.
Main-Class: org.springframework.boot.loader.JarLauncher
Start-Class: com.huyikang.practice.eureka.Application
Spring-Boot-Classes: BOOT-INF/classes/
Spring-Boot-Lib: BOOT-INF/lib/
Created-By: Apache Maven 3.5.2
Build-Jdk: 1.8.0_151
Implementation-URL: http://maven.apache.org

main-class代表了spring boot中启动的jar包的程序。

start-class属性就代表了spring boot程序的入口类,这个类中应该有一个main方法。

spring-boot-classes代表了类的路径,所有编译后的class文件,以及配置文件,都存储在该路径 下。

spring-boot-lib表示依赖的jar包存储的位置。

这些值都是springboot打包插件都会默认生成的,如果没有这些属性,springboot程序自然不能运行,就会报错:jar 中没有主清单属性。

解决方法,在pom中添加一个springboot的构建的插件,


  
  	
  		org.springframework.boot
 		spring-boot-maven-plugin
  	
  
 

 

最后欢迎大家访问我的个人网站:1024s

你可能感兴趣的:(秒扒Spring)