基本介绍
Spring与Spring boot的关系
Spring发展史
2003年兴起的一个轻量级的java开源框架,这个框架最初是为了解决企业级应用开发笨重臃肿的问题。宗旨就是简化开发。特点:AOP和IOC。并且提供了很多Template模板。
Spring boot的诞生
随着Spring越来越火,Spring也慢慢从一个小而精的框架变成了一个覆盖面广又全的框架,但是也导致了大量繁琐的XML配置和第三方整合配置,这时候Spring boot应运而生。从13年开始研发,到14年4月1.0版本正式发布。
Spring Boot相对于Spring来说是一套全新的框架,并且Sring所具备的功能它都有并且更容易使用;同时还简化了基于Spring的应用开发,通过少量的代码就能创建一个独立的、产品级别的Spring应用。
Spring Boot默认配置了很多框架的使用方式,整合了所有的框架。核心设计思想是:约定优于配置,所有的开发细节都是依据此思想进行实现的。
Spring boot的特性
- 搭建项目快;
- 没有冗余代码生成和XML配置的要求;
- 提供各种默认配置来简化项目配置;
- 内嵌容器,省去了配置Tomcat的繁琐;
- Starter自动依赖和版本控制;
- 方便监控,使用Spring Boot Actuator组件提供了应用的系统监控,可以查看应用配置的详细信息。
什么是微服务
微服务就是一种架构思想,可以把单一的一个项目,拆分成很多微小的服务并且他们都运行在自己的进程中,相互之间通过http进行通信。
单体架构和微服务架构
单体架构
- 什么是单体架构
所谓单体应用架构(all in one)是指我们将一个应用中的所有服务都封装在一个应用中。无论是ERP、CRM或是其他什么系统,都把数据库访问,web访问,等等功能放到一个war包内。
- 优缺点
优点:易于开发和测试;方便部署;当需要扩展时,只需要将war复制多份,然后放到多个服务器上,再做负载均衡即可。
缺点:项目过于臃肿;资源无法隔离;无法灵活扩展。
微服务架构
- 什么是微服务架构
所谓微服务架构,就是把每个功能元素独立出来。把独立出来的功能元素动态组合,需要的功能元素才拿来组合,需要多一些时可以整合多个功能元素。所以微服务架构是对功能元素进行复制,而没有对整个应用进行复制。
优点:节省了调用资源,每个功能元素的服务都是一个可替换的、可独立升级的软件代码。
如何构建微服务
-
一个大型系统的微服务架构,就像一个复杂的神经网络,每一个神经元就是一个功能元素,它们各自完成自己的功能,然后通过http或者RPC相互请求调用。但这种庞大的系统架构给部署和运维带来很大的难度,于是,spring为我们带来了构建大型分布式微服务的产品:
- 构建一个个功能独立的微服务应用单元,可以使用springboot,可以帮我们快速构建一个应用;
- 大型分布式网络服务的调用,这部分由spring cloud来完成,实现分布式;
- 在分布式中间,进行流式数据计算、批处理,采用spring cloud data flow。
快速入门
Springboot的结构说明
pom.xml文件
- 项目元数据信息:创建时候输入的Project Metadata部分,也就是Maven项目的基本元素,包括:groupId、artifactId、version、name、description等。
- parent:继承spring-boot-starter-parent的依赖管理,控制版本与打包依赖的功能。
- dependencies:项目具体依赖
- build:构建配置部分。默认使用了spring-boot-maven-plugin,配合spring-boot-starter-parent就可以把Spring Boot应用打包成JAR来直接运行。
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<!-- 模块的版本号 -->
<modelVersion>4.0.0</modelVersion>
<!-- 父级版本的引入,集成了所有父级的配置-->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.3.2.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<!-- 新建项目的时候进行描述的项目信息-->
<groupId>com.springboot-study-two</groupId>
<artifactId>springboot-study-two</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>springboot-study-two</name>
<description>Demo project for Spring Boot</description>
<!--构建项目所需要的公共变量-->
<properties>
<!-- jdk的版本号-->
<java.version>1.8</java.version>
</properties>
<!--项目所需要的依赖配置-->
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
<!--web模块的支持-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--test测试模块的支持-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
<!--构建配置-->
<build>
<!--进行整个工程打jar包的配置-->
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
原理分析
package com.study.springboot;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
/**
* @SpringBootConfiguration:springboot的配置类
* @Configuration:表明这是一个配置类
* @Component:加载到spring容器
* @EnableAutoConfiguration:开启自动配置功能
* @AutoConfigurationPackage:自动配置包
* @Import({Registrar.class}):把启动类所在的包进行默认扫描,该包下的所有类都会被扫到spring容器中进行管理
* @Import({AutoConfigurationImportSelector.class}):加载指定的类到spring容器中去
* AutoConfigurationImportSelector:自动配置导入选择器
* 根据项目来判断你的项目需要哪些配置信息然后把默认的配置内容导入spring容器中进行管理
* @ComponentScan:组件扫描和自动装配,用来指定扫描容器的范围。
* **/
@SpringBootApplication//Springboot启动类注解
public class SpringbootStudyOneApplication {
public static void main(String[] args) {
SpringApplication.run(SpringbootStudyOneApplication.class, args);
}
}
如下图所示:
配置说明
Springboot中的配置文件
-
springboot为什么还需要用配置文件
- 方便我们修改springboot默认的配置;
- 我们有其他的信息需要保存在配置文件中;
-
springboot中的配置文件有哪些
- properties配置文件;
- yml配置文件;
-
springboot中的配置文件使用中注意事项
- 文件放入在src/main/resources目录或者是类路径**/config**目录下;
- springboot默认读取以application开头的配置文件;
yml文件的语法说明
yml文件的介绍
yml的全称为YAML(YAML Ain’t Markup Language)它是一种标记语言,它是一种直观地呗电脑识别的数据序列化格式,并且容易被人类阅读,这种标记语言和其他标记语言不同的地方是,它是以数据为中心,比json、xml等更适合做配置文件。
yml语法
- yml的基本语法
- key:value的格式(value前面的空格不能少,可以有多个,不能用tab替代);
- 大小写敏感;
- 字符串默认不需要使用引号,单引号和双引号的区别在于是否能用转义字符;
- 注释方式:#
- yml支持的三种数据类型
- 字面量:直接量,单个不能被拆分的值(数字、字符串、布尔);
- 对象:键值对形式存在;
- 数组:字面量/对象的集合
yml文件的读取操作
Value注入
- 三种书写方式: 字 面 量 、 {字面量}、 字面量、{配置文件中取值} 以及使用#{spEL表达式}
例如:
@Value("${person.name}")
private String name;
等同于:
<bean id="Person">
<property name="lastName" value="字面量/${key}从环境变量、配置文件中获取值/#{spEL}"></property>
</bean>
自定义properties的读取
- 自定义一个properties文件,并且让key和之前的properties不一样;
- 使用propertysource注解来标明你要读取的properties文件名;例如
@PropertySource("classpath:properties文件名")
; - 更之前一样的读取方式,注意修改prefix的值。
RESTful的介绍及使用
URI
什么是URI
统一资源标识符,服务器上每一种资源,比如文档、图像、视频片段、程序都由一个通用资源标识符(Uniform Resource Identifier,简称“URI”)进行定位。
- 关于URL
URL是URI的一种,不仅标识了Web 资源,还指定了操作或者获取方式,同时指出了主要访问机制和网络位置。
- 关于URN
URN是URI的一种,用特定命名空间的名字标识资源。使用URN可以在不知道其网络位置及访问方式的情况下讨论资源。
REST
产生的背景
近年来移动互联网的发展,前端设备层出不穷(手机、平板、桌面电脑、其他专用是设备…),因此REST作为一种统一的机制,为了方便不同的前端设备与后端进行通信而诞生了。它可以通过一套统一的接口为Web,iOS和Android提供服务。
概念
Rest(Representational State Transfer,表述性状态转移),是一种架构风格。
原则
- 网络上所有的事物都被抽象为资源,都可以通过一个叫URI的东西来进行定位,并且来进行访问。
- 每个资源都有一个唯一的资源标识符(URI)。
- 同一个资源具有多种表现形式(xml,json等)。
- 对资源的各种操作不会改变资源标识符。
- 所有的操作都是无状态的。http协议的特点是无状态无连接,所谓的无状态指的就是客户端与服务器端之间的交互的请求之间是没有状态的,所以从客户端到服务器端的每一个请求都必须包含能够理解该请求所需要的相关信息。
RESTful
遵循了REST原则的web服务,rest式的web服务是一种ROA(The Resource-Oriented Architecture——面向资源的架构),RESTful架构一个核心概念是**“资源”**。
- 互联网中,客户端和服务端之间的互动传递就只是资源的表述。上网的过程就是调用资源的URI,获取它的不同表现形式的过程。这种互动只能使用无状态协议HTTP。
- 服务端必须保存所有的状态,客户端可以使用HTTP的几个基本操作,包括**GET(获取)、POST(创建)、PUT(更新)与DELETE(删除),**使得服务端上的资源发生"状态转化"(State Transfer),也就是所谓的"表述性状态转移"。
方法 | URL | 功能 |
---|---|---|
GET | /users | 获取用户列表 |
GET | /users/1 | 获取id为1的用户 |
POST | /users | 创建一个用户 |
PUT | /users/1 | 替换id为1的用户 |
PATCH | /users/1 | 修改id为1的用户 |
DELETE | /users/1 | 删除id为1的用户 |
DELETE | /users/1/products/2 | 删除id为1的用户下id为2的产品 |
RESTful的运用
Spring Boot全面支持开发RESTful程序,通过不同的注解来支持前端的请求:
@GetMapping
,处理Get请求;@PostMapping
,处理Post请求;@PutMapping
,用于更新资源;@DeleteMapping
,处理删除请求;@PatchMapping
,用于更新部分资源
Controller中的映射注解
PathVariable
,用于接收url路径上的参数;ModelAttribute
,用于直接接受**url?**后面的参数,如url?id=123&name=456,然后直接转为Pojo
Springboot下进行RESTful的开发流程
Spring Data REST的介绍
-
Spring Data REST作为Spring Data项目的子集,开发者只需要使用注解
@RepositoryRestResource
标记,就可以把整个Repository转换为HAL(Hypertxt Application Language,是一个被广泛采用的超文本表达的规范)风格的REST资源,目前已支持Spring Data JPA、Spring Data MongoDB、Spring Data Neo4j等等。 -
简单地说,Spring Data REST把我们需要编写的大量REST模板接口做了自动化实现,并符合HAL的规范。只要使用了他,我们就能大大减少代码量。
-
官方文档:https://www.springcloud.cc/spring-data-rest-zhcn.html
Spring-Data-REST的开发流程
-
REST里的常用操作
- GET:查询所有,根据id查询,分页查询,排序分页查询,条件查询
- POST:新增
- PUT:修改
- PATCH:修改
-
PUT和PATCH两种修改的区别(PUT只能全局进行修改,PATCH可以局部进行修改)
ring-Data-REST的开发流程
-
REST里的常用操作
- GET:查询所有,根据id查询,分页查询,排序分页查询,条件查询
- POST:新增
- PUT:修改
- PATCH:修改
-
PUT和PATCH两种修改的区别(PUT只能全局进行修改,PATCH可以局部进行修改)
-
手写Controller与REST共存