1.SpringBoot介绍
随着动态语言的流行(Ruby、Scala、Node.js), Java的开发显得格外的笨重;繁多的配置、低下的开发效率、复杂的部署流程以及第三方技术整合难度大。 在上述环境下,Spring Boot由此诞生,它的设计是为了使您能够尽可能快地启动和运行。它使用 “习惯优于配置” (项目中存在大量的配置,而 Spring Boot 内置一个习惯性的配置,让你无须手动进行配置)的理念让你的项目快速运行起来。使用 Spring Boot 很容易创建一个独立运行(运行jar,内嵌 Servlet 容器)、准生产强力的基于 Spring 框架的项目,使用 Spring Boot你可以不用或者只需要很少的 Spring 配置。提供了 J2EE 开发的一站式解决方案。
2014 年 4 月,Spring Boot 1.0.0 发布。Spring的顶级项目之一( Spring | Home)。
1.2 SpringBoot优点
Create stand-alone Spring applications
-
创建独立Spring应用
Embed Tomcat, Jetty or Undertow directly (no need to deploy WAR files)
-
内嵌web服务器
-
Provide opinionated 'starter' dependencies to simplify your build configuration
-
自动starter依赖,简化构建配置
-
起步依赖 ,起步依赖本质上是一个Maven项目对象模型(Project Object Model,POM),
定义了对其他库的传递依赖 ,这些东西加在一起即支持某项功能。 简单的说,起步依赖就是 将具备某种功能的坐标打包到一起,并提供一些默认的功能
-
-
Automatically configure Spring and 3rd party libraries whenever possible
-
自动配置Spring以及第三方功能
-
-
Provide production-ready features such as metrics, health checks, and externalized configuration
-
提供生产级别的监控、健康检查及外部化配置
-
-
Absolutely no code generation and no requirement for XML configuration
-
无代码生成、无需编写XML
-
Spring Boot入门开发
2.1 环境要求
环境准备:
2.2 快速构建SpringBoot项目
创建一个新项目
选择spring initalizr , 可以看到默认就是去官网的快速构建工具那里实现
填写项目信息
选择初始化的组件(初学勾选 Web 即可)
修改pom文件springboot版本和java版本
等待项目构建成功
2.2.1 项目打jar包
2.2.2 banner修改
-
项目下的 resources 目录下新建一个banner.txt 即可。
-
图案可以到: Spring Boot banner在线生成工具,制作下载英文banner.txt,修改替换banner.txt文字实现自定义,个性化启动banner-bootschool.net 这个网站生成,然后拷贝到文件中即可!
-
设置图片作为banner
spring.banner.image.location=logo.png
2.2.3 项目列表显示优化
Spring Boot 核心配置
3.1 Spring Boot配置文件分类
SpringBoot是基于约定的,所以很多配置都有默认值,但如果想使用自己的配置替换默认配置的话,就 可以使用 application.properties或者application.yml(application.yaml)进行配置
-
application.properties
-
语法结构 :key=value
server.port=8081
-
-
application.yml
-
语法结构 :key:空格 value (冒号后面必须要有空格)
server: port: 8081
-
SpringBoot提供了2种配置文件类型:properteis和yml/yaml 默认配置文件名称:application 在同一级目录入如果三类文件共存,优先级为:properties > yml > yaml
3.2 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.0.1</address>
</server>
yml:
server:
port: 8080
address: 127.0.0.1
3.3 YAML基础语法
-
大小写敏感
-
数据值前边必须有空格,作为分隔符
-
使用缩进表示层级关系
-
缩进时不允许使用Tab键,只允许使用空格(各个系统 Tab对应的 空格数目可能不同,导致层次混 乱)。
-
缩进的空格数目不重要,只要相同层级的元素左侧对齐即可
-
"#"表示注释,从这个字符一直到行尾,都会被解析器忽略。
YAML:数据格式
-
字面量:普通的值 [ 数字,布尔值,字符串 ]
boolean: TRUE #TRUE,true,True,FALSE,false,False均可
float: 3.14 #6.8523015e+5 #支持科学计数法
int: 123 #0b1010_0111_0100_1010_1110 #支持二进制、八进制、十六进制
string: HelloWorld #字符串可以直接书写
- 数组:一组按次序排列的值( List、set )
address:
- beijing
- shanghai
# 行内写法
commpany: [阿里巴巴,华为,腾讯,字节跳动]
- 对象、Map(键值对)
person:
name: wangzhuo
# 行内写法
person: {name: wangzhuo}
#对象数组格式一
users:- name: Tom
age: 4- name: Jerry
age: 5
#对象数组格式二
users:
name: Tom
age: 4
name: Jerry
age: 5
#对象数组缩略格式
users2: [ { name:Tom,age:4 },{ name:Jerry,age:5 } ]
YAML:参数引用
name: wangzhuo
person:
name: xuelaoshi
pet: ${name}
# 引用上边定义的name值
name: xuls${random.uuid} # 配置文件占位符,随机uuid
name: ${person.name}_真帅
YAML:小结 (1) 配置文件类型
-
properties:和以前一样 (设置文件的语言编码UTF-8)
-
yml/yaml:注意空格
(2) yaml:简洁,以数据为核心
-
基本语法
-
大小写敏感
-
数据值前边必须有空格,作为分隔符
-
使用空格缩进表示层级关系,相同缩进表示同一级
-
-
数据格式
-
对象
-
数组: 使用 " - "表示数组每个元素
-
纯量
-
-
参数引用
-
${key}
-
@Component //注册bean
public class Dog {
@Value("阿黄")
private String name;
@Value("18")
private Integer age;
}
加载指定的配置文件@PropertySource :加载指定的配置文件; 我们去在resources目录下新建一个dog.yml文件
name: 阿黄
age: 18
@PropertySource(value = "classpath:dog.yml")
@Component //注册bean
public class Dog{
@Value("${name}")
private String name;
@Value("${age}")
private Integer age;
}
批量注入方式1
编写一个复杂一点的实体类:Person 类
@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文件内容
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
将数据注入到我们的类中
/*
@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.4 读取配置内容
yaml文件更强大的地方在于,他可以给我们的实体类直接注入匹配值! 支持方式: 逐个注入:@Value 批量注入:1.@ConfigurationProperties 2.Environment类
逐个注入演示
如果编写完配置文件有红色提示,则可以添加坐标隐藏
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
批量注入方式2
直接在测试类中装配开发模式类辅助获取key对应value数据
@Autowired
private Environment env;
@Test
public void test(){
System.out.println(env.getProperty("person1.name"));
System.out.println(env.getProperty("person1.age"));
System.out.println(env.getProperty("person1.dog.name"));
System.out.println(env.getProperty("person1.lists[0]"));
}
@Value这个使用起来并不友好!我们需要为每个属性单独注解赋值,比较麻烦;我们来看个功能对比图
1、@ConfigurationProperties只需要写一次即可 , @Value则需要每个字段都添加
2、松散绑定:这个什么意思呢? 比如我的yml中写的last-name,这个和lastName是一样的, - 后面跟 着的字母默认是大写的。这就是松散绑定。可以测试一下
3、JSR303数据校验 , 这个就是我们可以在字段是增加一层过滤器验证 , 可以保证数据的合法性
4、复杂类型封装,yml中可以封装对象 , 使用value就不支持
结论:
配置yml和配置properties都可以获取到值 , 强烈推荐 yml; 如果我们在某个业务中,只需要获取配置文件中的某个值,可以使用一下 @value; 如果说,我们专门编写了一个JavaBean来和配置文件进行一一映射,就直接@configurationProperties,不要犹豫!
3.5 JSR303数据校验
对于web服务来说,为防止非法参数对业务造成影响,在 Controller 层一定要做参数校验的!大部分 情况下,请求参数分为如下两种形式:
-
POST 、PUT 请求,使用
-
requestBody 传递参数;GET 请求,使用requestParam/PathVariable 传递参数。
JSR303校验注解的使用步骤
1.添加依赖,导入spring-boot-starter-validation启动器
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>
2.在实体类需要校验的成员字段(Field)上,添加校验注解。
@Component //注册bean到容器中
//@ConfigurationProperties(prefix = "dog")
//@Validated
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 绑定校验结果
@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 "数据合法";
}
}
JSR303校验注解的分类
值校验:
// 被注解的元素必须为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")
长度校验:
// 被注解的元素的长度必须在指定范围内,并且类型为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 = "必须是邮箱")
Controller统一异常处理
@ControllerAdvice:统一为Controller进行"增强"
@ExceptionHandler : 异常处理
import org.springframework.validation.BindException;
import org.springframework.web.bind.annotation.*;
@ControllerAdvice
public class BindExceptionUtilAdvice {
// 验证参数未使用@RequestBody注解
@ExceptionHandler(BindException.class)
@ResponseBody//选择添加
public String handlerBindException(BindException ex, HttpServletRequest
request){
return "全局异常处理器成功"; // 跳转至统一提示错误信息的视图
}
}
3.6 多环境切换profile
我们在开发Spring Boot应用时,通常同一套程序会被安装到不同环境,比如:开发、测试、生产等。 其中数据库地址、服务 器端口等等配置都不同,如果每次打包时,都要修改配置文件,那么非常麻烦。 profile功能就是来进行动态配置切换的;
命名语法:
例如:application-环境简称.properties/yml application-dev.properties/yml 开发环境 application-test.properties/yml 测试环境 application-pro.properties/yml 生产环境
1) profile配置方式
多profile文件方式
2) profile激活方式
配置文件 :
spring:
profiles:
active: 环境简称
虚拟机参数 :在VM options 指定:-Dspring.profiles.active=dev 命令行参数:java –jar xxx.jar --spring.profiles.active=dev