SpringBoot⭐️(创建一切)
1. SpringBoot是什么?
Spring Boot 是 Pivotal 团队在 Spring 的基础上提供的一套全新的开源框架,其目的是为了简化 Spring 应用的搭建和开发过程。Spring Boot 去除了大量的 XML 配置文件,简化了复杂的依赖管理。
Spring Boot 具有 Spring 一切优秀特性,Spring 能做的事,Spring Boot 都可以做,而且使用更加简单,功能更加丰富,性能更加稳定而健壮。随着近些年来微服务技术的流行,Spring Boot 也成了时下炙手可热的技术。
Spring Boot 集成了大量常用的第三方库配置,Spring Boot 应用中这些第三方库几乎可以是零配置的开箱即用(out-of-the-box),大部分的 Spring Boot 应用都只需要非常少量的配置代码(基于 Java 的配置),开发者能够更加专注于业务逻辑。
- 一个快速开发的脚手架
- 基于SpringBoot可以快速的开发单个微服务
- 约定大于配置!
1.1 SpringBoot的优点
- 为所有Spring开发者更快的入门
- 开箱即用,提供各种默认配置来简化项目配置
- 内嵌式容器简化Web项目(内嵌tomcat)
- 没有冗余代码生成和XML配置的要求
2. 什么是微服务架构?
微服务架构(Microservice Architecture)是一种架构概念,旨在通过将功能分解到各个离散的服务中以实现对解决方案的解耦。你可以将其看作是在架构层次而非获取服务的
类上应用很多SOLID原则。微服务架构是个很有趣的概念,它的主要作用是将功能分解到离散的各个服务当中,从而降低系统的耦合性,并提供更加灵活的服务支持。
概念:把一个大型的单个应用程序和服务拆分为数个甚至数十个的支持微服务,它可扩展单个组件而不是整个的应用程序堆栈,从而满足服务等级协议。
定义:围绕业务领域组件来创建应用,这些应用可独立地进行开发、管理和迭代。在分散的组件中使用云架构和平台式部署、管理和服务功能,使产品交付变得更加简单。
本质:用一些功能比较明确、业务比较精练的服务去解决更大、更实际的问题。
3. 创建第一个SpringBoot程序
3.1 第一种创建方法
通过Spring官网初始化springboot项目,获得springboot项目压缩包
3.2 第二种创建方法
直接通过IDEA来创建springboot项目即可
3.3 运行主程序
如果要用到
tomcat
,注意在创建项目时一定要加上 spring Web,否则内置tomcat不会运行,网页也不会显示出来
3.4 写出第一个HelloWorld程序
在controller包中创建一个类,并且添加注释
@RestController
public class HelloController {
// -- 接口: http://localhost:8080/hello
@RequestMapping("/hello")
public String hello() {
// -- 调用业务,接收前端的参数!
return "hello,springboot~";
}
}
程序运行结果:
注意:
在主程序的同级目录下,新建一个
controller
包,一定要在同级目录下,否则识别不到一定要在主程序类所在的包下创建其他包才能生效
3.5 pom依赖
<?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>
<!-- springboot 的一个在线的父程序 -->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.7.3</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.cczj</groupId>
<artifactId>springboot-helloWorld</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>springboot-helloWorld</name>
<description>springboot-helloWorld</description>
<properties>
<java.version>11</java.version>
</properties>
<dependencies>
<!-- web依赖 内置tomcat DispatcherServlet xml -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- 单元测试 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<!-- jar包插件 -->
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
3.6 自定义端口号
3.7 自定义banner
推荐网站:Spring Boot banner在线生成工具,制作下载banner.txt,修改替换banner.txt文字实现自定义,个性化启动banner-bootschool.net
将banner
进行下载,然后添加在resource
包下重新启动服务器即可
4. 原理初探
自动配置:
- pom.xml
spring-boot-dependencies
: 核心依赖在父工程中- 我们在写或者引入一些Springboot依赖的时候,不需要指定版本
启动器
-
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> </dependency>
-
启动器:就是Springboot的启动场景
-
比如
spring-boot-starter-web
,他就会帮我们自动导入web环境所有的依赖~ -
springboot会将所有功能的场景都变成一个个的启动器
-
我们要使用什么功能,就只需要找到对应的启动器就可以了
注解:
- @SpringBootConfiguration : springboot的配置
- @Configuration : spring配置类
- @Component : spring的组件
- @EnableAutoConfiguration : 自动配置
- @AutoConfigurationPackage : 自动配置包
源码探不动,直接上结论:
springboot所有自动配置都是在启动的时候扫描并加载:spring.factories
所有的自动配置类都在这里面,但是不一定生效。要经过一个注解进行判断条件是否成立才会生效。
只要导入了对应的start,就有对应的条件进行判断,然后就会产生对应的启动器,有了启动器,自动装配就会生效,然后就配置成功~
- springboot在启动的时候,从类路径下
/META-INF/spring.factories
获取指定的值 - 将这些自动配置的类导入容器,自动配置就会生效,帮我们自动配置!
- 以前我们需要自动配置的东西,现在springboot帮我们做了!
- 整合javaEE,解决方案和自动配置的东西都在
spring-boot-autoconfigure-2.2.0.RELEASE.jar
这个包下 - 它会把所有需要导入的组件,以类名的方式返回,这些组件就会被添加到容器
- 容器中也会存在很多
XXXautoConfiguration
的文件,就是这些类给容器中导入了这个场景所需要的所有组件;并自动配置这些组件。 - 有了自动配置类,免去了我们动手编写配置注入功能组件等的工作
关于springboot,谈谈你的理解:
- 自动装配
- run()方法
- 判断这个程序是web项目还是普通项目,如果有就需要一直运行,如果没有就直接结束。
- 查找并加载所有可用初始化器,设置到
initializers
属性中 - 找出所有的应用程序监听器,设置到
listeners
属性中 - 推断并设置main方法的定义类,找到运行的主类
5. springboot的配置
因为官方的配置实在是太多了,所以尽量了解原理,然后简单配置
5.1 配置文件的作用
springboot 使用一个全局的配置文件,配置文件名称是固定的
- application.properties
- 语法结构:key=value
- application.yaml
- 语法结构:key: value
修改springboot自动配置的默认值,因为springboot在底层都给我们自动配置好了。
5.2 yaml语法规范和特别之处
普通的key-value 注意空格!
name: zhangsan
对象
student:
name: zhangsan
age: 3
行内写法
student: {name: zhangsan,age: 3}
数组
pets:
- cat
- dog
- pig
pets: [cat,dog,pig]
5.2.1 yaml 和 properties 区别
-
在对应的类上添加注释@Configuration(prefix=“类名”),实现yaml注入。而
properties
只能通过value
一个一个单独赋值,非常麻烦 -
yaml中可以使用EL表达式,如
${random.uuid}
-
松散绑定:如果yaml中按照
last-name
来写名称,那么这个属性就可以在类中写为lastName
-
JSR303 数据校验,这个就是我们可以在字段上增加一层过滤器验证,可以保证数据的合法性
- JSR303 : 在需要校验的类上添加@Validated (数据校验),然后在属性上添加对应的校验方式
- 比如:
private String email
就可以添加 @Email 进行邮箱校验 - @Email可以添加message来自定义返回异常信息
- [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RTEONHZK-1662712063810)(后端框架.assets/webp.webp)]
-
yaml中可以封装对象,使用 @value就不支持
5.3 配置文件优先级
- 项目目录/config/… 优先级最高
- 项目目录/… 优先级第二
- 项目目录/src/main/resrouce/config/… 优先级第三
- 项目目录/src/main/resrouce/… 优先级最低
同时配置多个文件时,生效按照优先级高的最先
spring profiles active
选择配置文件版本,提高优先级
5.4 结论
配置yaml
和配置properties
都可以获取到值,但非常推荐yaml
如果我们在某个业务中,只需要获取配置文件中的某个值,可以使用一下@value
如果我们专门编写了一个javaBean来和配置文件进行映射,就直接使用@configurationProperties,不要犹豫