目录
[1、方式一:使用Spring Initializr的web 页面创建项目:](#1、方式一:使用Spring Initializr的web 页面创建项目:)
[4、使用 IDEA 创建Maven项目并改造为springBoot项目](#4、使用 IDEA 创建Maven项目并改造为springBoot项目)
[2、Spring Boot配置文件分类](#2、Spring Boot配置文件分类)
[2、yaml 基础语法](#2、yaml 基础语法)
[1. 逐个注入:@Value (不支持复杂数据类型](#1. 逐个注入:@Value (不支持复杂数据类型)
[2. 批量注入:1.@ConfigurationProperties 2.Environment类](#2. 批量注入:1.@ConfigurationProperties 2.Environment类)
[3. 对比](#3. 对比)
[4、 JSR303数据校验 (检查属性赋值是否符合规范)](#4、 JSR303数据校验 (检查属性赋值是否符合规范))
1.添加依赖,导入spring-boot-starter-validation启动器
2.在实体类需要校验的成员字段(Field)上,添加校验注解。
[3.在Controller控制器的校验参数前,使用@Valid注解开启校验,使用BindingResult 绑定校验结果](#3.在Controller控制器的校验参数前,使用@Valid注解开启校验,使用BindingResult 绑定校验结果)
一、环境准备
- java Version :1.8
- Maven:3.6以上
- SpringBoot:2.X最新版
二、构建spring项目
1、方式一:使用Spring Initializr的web 页面创建项目:
-
填写项目信息
-
点击"Generate Project"按钮生成项目;下载此项目
-
解压项目包,并用IDEA以Maven项目导入,一路下一步即可,直到项目导入完毕。
-
如果是第一次使用,可能速度会比较慢,包比较多、需要耐心等待一切就绪。
2、方式二:使用IDEA直接创建项目
1、创建一个新项目
2、选择SpringBoot,可以看到默认就是去官网的快速构建工具那里实现
3、填写项目信息
4、选择未初始化的组件(初学勾选web)
5、填写项目路径
6、等待项目构建成功
7、配置MAVEN信息和更换jdk版本
3、方式三:使用idea创建项目
(与方式二相同,路径不同:https://start.aliyun.com)
4、使用 IDEA 创建Maven项目并改造为springBoot项目
-
程序的主启动类
-
一个 application.properties 配置文件
-
一个 测试类
-
一个 pom.xm
java
//pom 文件spring boot主坐标(依赖)
<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>
5、将项目打jar包
1、点击package

2、可以通过cmd之既然运行jar包:Java -jar jar包名
三、springboot核心配置
1、banner修改:
1、方式一:文本txt方式,
- 在resources 目录下新建一个banner.txt,
- 图案可以到: https://www.bootschool.net/ascii 这个网站生成,然后拷贝到文件中即可,
- 设置图片作为banner :在配置文件中添加
spring.banner.image.location=logo.png
2、方式二
- 直接将图片移到resources目录下,改名为banner
- 关闭其他banner设置
- 直接启动项目
2、Spring Boot配置文件分类
SpringBoot是基于约定的,所以很多配置都有默认值,但如果想使用自己的配置替换默认配置的话,就可以使用 application.properties或者application.yml(application.yaml)进行配置
- application.properties 语法结构 :key=value
server.port=8081
- application.yml 语法结构 :key:空格 value (冒号后面必须要有空格)
server: port: 8081
1、yaml概述:(简洁,以数据为核心)
YAML全称是YAML Ain't Markup Language 。YAML是一种直观的能够被电脑识别的的数据序列化格式 , 并且容易被人类阅读,容易和脚本语言交互的 ,可以被支持YAML库的不同的编程语言程序导入,比如: C/C++, Ruby, Python, Java, Perl, C#, PHP等。YML文件是以数据为核心的,比传统的xml方式更加简洁。 YAML文件的扩展名可以使用.yml或者.yaml。
- properties:
server.port=8080
server.address=127.0.0.1
- xml:
<server>
<port>8080</port>
<address>127.0.01</address>
<server>
- yml:
server: port: 8080
address: 127.0.0.1
2、yaml 基础语法
- 1、大小写敏感
- 2、数据值前必须要有空格,作为分隔符
- 3、使用缩进表示层级关系
- 4、缩进时不使用tab键,值允许使用空格()各个系统对应的Tab空格数可能不同,导致层次结构发生变化
- 5、缩进的空格数目不重要,只要相同层级的元素左侧对其即可
- 6、'#'表示注释,从这个字符一致到行尾,都会被解析器忽略
java
#################yml语法数据类型######################
######基本数据类型与string##########
boolean: true
float: 3.14
int: 18
String: 张三
#########类型二:数组单列list set array##############
adress:
- 北京
- 上海
- 南京
- 成都
#行类写法:
adress1: [ 北京,上海,南京,成都 ]
########类型二 集合 多列#############
person:
name: 张三
age: 25
sex: 男
#行内写法
person1: { name: 张三,age: 16,sex: 男 }
#########对象集合 集合【person】############
#1
people:
- name: 张三
age: 24
sex: 男
- name: 李四
age: 25
sex: 女
#2
people2:
- name: 张三
age: 24
sex: 男
- name: 李四
age: 25
sex: 女
#行类写法
people1: [ { name: 张三,age: 24,sex: 男 },{ name: 李四,age: 25,sex: 女 } ]
pepole2:
- { name: 张三,age: 24,sex: 男 }
- { name: 李四,age: 25,sex: 女 }
#########YAML: 参数引用-特殊应用############
name: 张三
user:
name: 李四
father: ${name}
3、yaml读取配置内容
yaml文件更强大的地方在于,他可以给我们的实体类直接注入匹配值! 支持方式:
1. 逐个注入:@Value (不支持复杂数据类型
java
//yaml配置
persons1:
name: 张三
age: 25
happy: true
birth: 2002/9/11
maps: {k1: v1,k2: v2}
lists: [1,2,3,4]
dog:
name: 旺财
age: 3
java
@Component
@ConfigurationProperties(prefix = "person1") // 读取配置文件中的 persons 前缀的属性
//@PropertySource ("classpath:person1.properties") :加载指定的配置文件;
public class Persons {
@Value("${person1.name}")
private String name;
@Value("${person1.age}"
private Integer age;
@Value("${person1.happy}")
private Boolean happy;
@Value("${person1.birth}")
private Date birth;
// @Value("${person1.maps}") 不支持复杂数据类型
private Map<String, Object> maps;
// @Value("${person1.lists}")
private List<Object> lists;
// @Value("${person1.dog}")
private Dog dog;
//有参无参构造、get、set方法、toString()方法
}
2. 批量注入:1.@ConfigurationProperties 2.Environment类
编写一个复杂一点的实体类:Person 类
java
@Component //注册bean到容器中
public class Person {
private String name;
private integer age;
private boolean marry;
private Date birth;
private Map<String,Object> maps;
private List<Object> lists;
private Dog dog;
//有参无参构造、get、set方法、toString()方法
}
编写yaml文件内容
java
person1:
name: wangls
age: 18
marry: true
birth: 1990/10/19
maps: {k1: v1,k2: v2}
lists:- code- bodybuilding- music
dog:
name: summer
age: 1
将数据注入到我们的类中
java
/*
@ConfigurationProperties作用:
将配置文件中配置的每一个属性的值,映射到这个组件中;
告诉SpringBoot将本类中的所有属性和配置文件中相关的配置进行绑定
参数 prefix = "person" : 将配置文件中的person下面的所有属性一一对应
*/
@Component //注册bean
@ConfigurationProperties(prefix = "person1")
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;
}
3. 对比

1、@ConfigurationProperties只需要写一次即可 , @Value则需要每个字段都添加
2、松散绑定:这个什么意思呢? 比如我的yml中写的last-name,这个和lastName是一样的, - 后面跟 着的字母默认是大写的。这就是松散绑定。可以测试一下
3、JSR303数据校验 , 这个就是我们可以在字段是增加一层过滤器验证 , 可以保证数据的合法性
4、复杂类型封装,yml中可以封装对象 , 使用value就不支持
结论:
配置yml和配置properties都可以获取到值 , 强烈推荐 yml; 如果我们在某个业务中,只需要获取配置文件中的某个值,可以使用一下 @value; 如果说,我们专门编写了一个JavaBean来和配置文件进行一一映射,就直接 @configurationProperties,不要犹豫!
4、 JSR303数据校验 (检查属性赋值是否符合规范)
对于web服务来说,为防止非法参数对业务造成影响,在 Controller 层一定要做参数校验的!大部分 情况下,请求参数分为如下两种形式: 1. POST 、 PUT 请求,使用 2. requestBody 传递参数; GET 请求,使用 requestParam/PathVariable 传递参数。
什么是 JSR303 标准 ?
JSR的全称是Java Specification Requests(Java 规范提案),是指向JCP ( Java Community Process )提出
新增一个标准化技术规范的正式请求。
Java API规范( JSR303 )定义了 Bean 校验的标准 validation-api ,但没有提供实现。 hibernate validation 是对这个规范的实现,并增加了校验注解如 Validation 是对 来,我们以 @Email 、 @Length 等。 Spring hibernate validation 的二次封装,用于支持 spring mvc参数自动校验。接下 spring-boot 项目为例,介绍 Spring Validation 的使用
JSR303校验注解的使用步骤
1.添加依赖,导入spring-boot-starter-validation启动器
java
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>
2.在实体类需要校验的成员字段(Field)上,添加校验注解。
java
@Component //注册bean到容器中
//@ConfigurationProperties(prefix = "dog")
@Validated //开启jsr303校验
public class Dog {
@NotNull(message = "狗名不能为空")
private String name;
@NotNull(message = "狗命不能为空")
@Max(value = 15,message = "狗命拿来")
private Integer age;
@Min(value = -1,message = "狗还是个细胞")
private Integer length;
@Email(message = "邮箱必须合法")
private String email;
}
3.在Controller控制器的校验参数前,使用@Valid注解开启校验,使用BindingResult 绑定校验结果
java
@RequestMapping("/validationDemo")
public String validationDemo(@Valid Dog dog, BindingResult result){
//得到所有错误信息计数
int errorCount = result.getErrorCount();
//错误数大于0
if (errorCount>0){
//得到所有错误
List<FieldError> fieldErrors = result.getFieldErrors();
//迭代错误
for (FieldError fieldError:fieldErrors) {
//错误信息
System.out.println( "属性:{},"+fieldError.getField()+"传来的值是:
{}"+fieldError.getRejectedValue()+",出错的提示消息:
{}"+fieldError.getDefaultMessage());
}
return "数据不合法";
}else{
return "数据合法";
}
}
4、常用注解
java
// 被注解的元素必须为null
@Null(message = "必须为null")
// 被注解的元素必须不为null
@NotNull(message = "必须不为null")
// 校验注解的元素值不为空(不为null、去除首位空格后长度为0),类型为String
@NotBlank(message = "必须不为空")
// 校验注解的元素值不为null且不为空(字符串长度不为0、集合大小不为0),类型为CharSequence、
Collection、Map、Array
@NotEmpty(message = "必须不为null且不为空")
// 被注解的元素必须为true,并且类型为boolean
@AssertTrue(message = "必须为true")
// 被注解的元素必须为false,并且类型为boolean
@AssertFalse(message = "必须为false")
// 被注解的元素其值必须大于等于最小值,并且类型为int,long,float,double
@Min(value = 18, message = "必须大于等于18")
// 被注解的元素其值必须小于等于最小值,并且类型为int,long,float,double
@Max(value = 18, message = "必须小于等于18")
// 校验注解的元素值大于等于@DecimalMin指定的value值,并且类型为BigDecimal
@DecimalMin(value = "150", message = "必须大于等于150")
// 校验注解的元素值小于等于@DecimalMax指定的value值 ,并且类型为BigDecimal
@DecimalMax(value = "300", message = "必须大于等于300")
// 校验注解的元素值在最小值和最大值之间,并且类型为BigDecimal,BigInteger,CharSequence,
byte,short,int,long。
@Range(max = 80, min = 18, message = "必须大于等于18或小于等于80")
// 被注解的元素必须为过去的一个时间,并且类型为java.util.Date
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") @Past(message = "必须为过去的时
间")
// 被注解的元素必须为未来的一个时间,并且类型为java.util.Date
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") @Future(message = "必须为未来的时
间")
长度校验
// 被注解的元素的长度必须在指定范围内,并且类型为String,Array,List,Map
@Size(max = 11, min = 7, message = "长度必须大于等于7或小于等于11")
// 校验注解的元素值长度在min和max区间内 ,并且类型为String
@Length(max = 11, min = 7, message = "长度必须大于等于7或小于等于11")
// 校验注解的元素值的整数位数和小数位数上限 ,并且类型为float,double,BigDecimal。
@Digits(integer=3,fraction = 2,message = "整数位上限为3位,小数位上限为2位")
// 被注解的元素必须符合指定的正则表达式,并且类型为String
@Pattern(regexp = "\\d{11}",message = "必须为数字,并且长度为11")
// 校验注解的元素值是Email,也可以通过regexp和flag指定自定义的email格式,类型为String
@Email(message = "必须是邮箱")

