Spring Boot
Spring Boot的主要优点:
- 为所有Spring开发者更快的入门
- 开箱即用,提供各种默认配置来简化项目配置
- 内嵌式容器简化Web项目
- 没有冗余代码生成和XML配置的要求
一、第一个Spring Boot程序
环境
- JDK 11.0.6
- maven 3.6.1
- spring boot:最新版
- IDEA
官方:提供了一个快速生成的网站,IDEA集成了这个网站
-
可以在官网直接下载后,导入idea开发
- 打开 https://start.spring.io/
- 填写项目信息
- 点击”Generate Project“按钮生成项目;下载此项目
- 解压项目包,并用IDEA以Maven项目导入,一路下一步即可,直到项目导入完毕。
-
直接使用idea创建一个spring boot项目(一般开发直接在idea中创建)
- 创建一个新项目
- 选择spring initalizr , 默认就是官网的快速构建工具实现
- 填写项目信息
- 选择初始化的组件(初学勾选 Web 即可)
- 填写项目路径
- 等待项目构建成功
pom.xml分析
<!-- 父依赖 -->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.2.5.RELEASE</version>
<relativePath/>
</parent>
<dependencies>
<!-- web场景启动器 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- springboot单元测试 -->
<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>
<plugins>
<!-- 打包插件 -->
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
编写接口
-
在主程序的同级目录下,新建一个controller包(一定要在同级目录下,否则识别不到)
-
在包中新建一个Controller类
HelloController
@RestController public class HelloController { @RequestMapping("/hello") public String hello() { return "Hello SpringBoot!"; } }
-
启动项目,浏览器发起请求,进行测试即可!
打包
-
将项目打成jar包,点击 maven的 package
-
如果打包成功,则会在target目录下生成一个 jar 包 : helloSpringBoot-0.0.1-SNAPSHOT.jar
-
打成了jar包后,就可以在任何地方运行了!
彩蛋
更改启动时显示的字符拼成的字母 SpringBoot ,也就是 banner 图案
-
到项目下的 resources 目录下新建一个banner.txt 。
-
图案可以到 https://www.bootschool.net/ascii 这个网站生成,然后拷贝到文件中即可!
-
例:
banner.txt
// _ooOoo_ // // o8888888o // // 88" . "88 // // (| ^_^ |) // // O\ = /O // // ____/`---'\____ // // .' \\| |// `. // // / \\||| : |||// \ // // / _||||| -:- |||||- \ // // | | \\\ - /// | | // // | \_| ''\---/'' | | // // \ .-\__ `-` ___/-. / // // ___`. .' /--.--\ `. . ___ // // ."" '< `.___\_<|>_/___.' >'"". // // | | : `- \`.;`\ _ /`;.`/ - ` : | | // // \ \ `-. \_ __\ /__ _/ .-` / / // // ========`-.____`-.___\_____/___.-`____.-'======== // // `=---=' // // ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ // // 佛祖保佑 永不宕机 永无BUG //
二、原理初探
自动配置:
pom.xml
- spring-boot-dependencies:核心依赖在父工程中
- 我们在写或者引入一些Spring boot以来的时候,不需要指定版本,就因为有这些版本仓库
启动器
-
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency>
-
启动器:就是Springboot的启动场景
-
例如 spring-boot-starter-web :就会自动导入 web 环境所有的依赖
-
Springboot 会将所有的功能场景,都变成一个个的启动器
-
我们要使用什么功能,就只需要找到对应的启动器就可以了
starter
主程序
// @SpringBootApplication : 标注这个类是一个 springboot 的应用
@SpringBootApplication
public class Springboot01HelloApplication {
public static void main(String[] args) {
// 将 Spring Boot 应用启动
SpringApplication.run(Springboot01HelloApplication.class, args);
}
}
-
自动配置
自动配置真正实现是从classpath中搜寻所有的META-INF/spring.factories配置文件 ,并将其中对应的 org.springframework.boot.autoconfigure. 包下的配置项,通过反射实例化为对应标注了 @Configuration的JavaConfig形式的IOC容器配置类 , 然后将这些都汇总成为一个实例并加载到IOC容器中。
结论:
- SpringBoot在启动的时候从类路径下的META-INF/spring.factories中获取EnableAutoConfiguration指定的值
- 将这些值作为自动配置类导入容器 , 自动配置类就生效 , 帮我们进行自动配置工作;
- 整个J2EE的整体解决方案和自动配置都在springboot-autoconfigure的jar包中;
- 它会给容器中导入非常多的自动配置类 (xxxAutoConfiguration), 就是给容器中导入这个场景需要的所有组件 , 并配置好这些组件 ;
- 有了自动配置类 , 免去了我们手动编写配置注入功能组件等的工作;
-
SpringApplication
1、推断应用的类型是普通的项目还是Web项目
2、查找并加载所有可用初始化器 , 设置到initializers属性中
3、找出所有的应用程序监听器,设置到listeners属性中
4、推断并设置main方法的定义类,找到运行的主类
三、yaml 语法
1、配置文件
SpringBoot使用一个全局的配置文件 , 配置文件名称是固定的
-
application.properties
-
- 语法结构 :key=value
-
application.yml
-
- 语法结构 :key:空格 value
**配置文件的作用 :**修改SpringBoot自动配置的默认值,因为SpringBoot在底层都给我们自动配置好了;
2、yaml 基础语法
说明:语法要求严格!
-
空格不能省略。
-
以缩进来控制层级关系,只要是左边对齐的一列数据都是同一个层级。
-
属性和值的大小写都十分敏感。
字面量:普通的值 [ 数字,布尔值,字符串 ]
字面量直接写在后面就可以 , 字符串默认不用加上双引号或者单引号;、
# 对空格要求十分严格
# 格式: key: value
# 普通的key-value
name: zhangsan
# 对象
student:
name: zhangsan
age: 20
# 行内写法
teacher: {name: zhangsan, age: 21}
# 数组
pets:
- dog
- cat
- pig
# 或
animals: [cat, dog, tiger]
3、给实体类赋值
创建两个实体类
Dog
@Component
public class Dog {
private String name;
private Integer age;
// 构造/set/get/toString 方法略
}
Person
@Component
public class Person {
private String name;
private Integer age;
private Boolean happy;
private Date birth;
private Map<String, Object> maps;
private List<Object> lists;
private Dog dog;
// 构造/set/get/toString 方法略
}
以前的赋值方式:
@Value("大黄")
private String name;
@Value("1")
private Integer age;
测试
@Autowired
private Dog dog;
@Test
void contextLoads() {
System.out.println(dog);
}
使用 ymal 注入配置文件:
编写 ymal 配置:
application.yaml
person:
name: 张三
age: 20
happy: true
birth: 2020/01/01
maps: {id: 001, class: 3}
lists:
- read
- run
- eat
dog:
name: 大黄
age: 1
注入到类中
Person
/*
@ConfigurationProperties作用:
将配置文件中配置的每一个属性的值,映射到这个组件中;
告诉SpringBoot将本类中的所有属性和配置文件中相关的配置进行绑定
参数 prefix = “person” : 将配置文件中的person下面的所有属性一一对应
*/
@Component // 配置bean
@ConfigurationProperties(prefix = "person")
public class Person {
private String name;
private Integer age;
private Boolean happy;
private Date birth;
private Map<String, Object> maps;
private List<Object> lists;
private Dog dog;
// 构造/set/get/toString 方法略
}
此时会有爆红提示,springboot配置注解处理器没有找到
解决方法:点击提示信息右边的打开文档,里面有一个依赖,我们需要导入这个依赖
注:如果使用的spring boot版本过高,可能无法进入文档,只要降低版本即可
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
测试:
@Autowired
private Person person;
@Test
void contextLoads() {
System.out.println(person);
}
注:如果输出结果的值有 null,检查 ymal 配置文件中的 key 值和实体类中的属性是否一致,如果不一致,则会注入失败!
四、JSR303数据校验
Springboot中可以用@validated来校验数据,如果数据异常则会统一抛出异常,方便异常中心统一处理。
常见参数
@NotNull(message="名字不能为空")
private String userName;
@Max(value=120,message="年龄最大不能查过120")
private int age;
@Email(message="邮箱格式错误")
private String email;
空检查
@Null 验证对象是否为null
@NotNull 验证对象是否不为null, 无法查检长度为0的字符串
@NotBlank 检查约束字符串是不是Null还有被Trim的长度是否大于0,只对字符串,且会去掉前后空格.
@NotEmpty 检查约束元素是否为NULL或者是EMPTY.
Booelan检查
@AssertTrue 验证 Boolean 对象是否为 true
@AssertFalse 验证 Boolean 对象是否为 false
长度检查
@Size(min=, max=) 验证对象(Array,Collection,Map,String)长度是否在给定的范围之内
@Length(min=, max=) string is between min and max included.
日期检查
@Past 验证 Date 和 Calendar 对象是否在当前时间之前
@Future 验证 Date 和 Calendar 对象是否在当前时间之后
@Pattern 验证 String 对象是否符合正则表达式的规则
.......等等
除此以外,我们还可以自定义一些数据校验规则
例如:
@Component // 配置bean
@ConfigurationProperties(prefix = "person")
@Validated // 数据校验
public class Person {
@Email(message = "邮箱格式不合法") // name必须是邮箱格式,否则会报错,message为报错信息
private String name;
}
多环境切换
profile是Spring对不同环境提供不同配置功能的支持,可以通过激活不同的环境版本,实现快速切换环境;
多配置文件:我们在主配置文件编写的时候,文件名可以是 application-{profile}.properties/yml , 用来指定多个环境版本;
例如:
- application-test.properties 测试环境配置
- application-dev.properties 开发环境配置
Springboot并不会直接启动这些配置文件,它默认使用application.properties主配置文件;
我们可以通过配置来选择需要激活的环境:
spring.profiles.active=dev
# 或者
spring.profiles.active=test
ymal的多文档块
和properties配置文件中一样,但是使用yml去实现不需要创建多个配置文件,更加方便了 !
server:
port: 8080
#选择要激活那个环境块
spring:
profiles:
active: test
---
server:
port: 8081
spring:
profiles: dev #配置环境的名称
---
server:
port: 8082
spring:
profiles: test #配置环境的名称
注意:如果yml和properties同时都配置了端口,并且没有激活其他环境 , 默认会使用properties配置文件的!