制作网站的顺序是,wordpress别人主题插件,高校国际交流中心网站建设方案,野花香社区论坛SpringBoot核心配置
SpringBoot配置文件分类
SpringBoot是基于约定的#xff0c;所以很多配置都有默认值#xff0c;但如果想使用自己的配置替换默认配置的话#xff0c;就可以使用
application.properties或者application.yml#xff08;application.yaml#xff09;进…SpringBoot核心配置
SpringBoot配置文件分类
SpringBoot是基于约定的所以很多配置都有默认值但如果想使用自己的配置替换默认配置的话就可以使用
application.properties或者application.ymlapplication.yaml进行配置 application.properties 语法keyvalue server.port8080application.yml 语法key空格 value 冒号后必须要用空格 server:port: 8080小结
SpringBoot提供了2种配置文件类型properteis和yml/yaml默认配置文件名称application在同一级目录入如果三类文件共存优先级为properties yml yaml
YAML概述
YAML全称是 YAML Ain’t Markup Language 。YAML是一种直观的能够被电脑识别的的数据数据序列化格式并且容易被人类阅读容易和脚本语言交互的可以被支持YAML库的不同的编程语言程序导入比如C/C, Ruby, Python, Java, Perl, C#, PHP等。YML文件是以数据为核心的比传统的xml方式更加简洁。YAML文件的扩展名可以使用.yml或者.yaml。
properties
server.port8080
server.address127.0.0.1xml
serverport8080/portaddress127.0.0.1/address
/serveryaml
server:port: 8080address: 127.0.0YAML基础语法
大小写数据值前边必须有空格作为分隔符使用缩进表示层级关系缩进时不允许使用Tab键只允许使用空格各个系统 Tab对应的 空格数目可能不同导致层次混乱缩进的空格数目不重要只要相同层级的元素左侧对齐即可#表示注释从这个字符一直到行尾都会被解析器忽略。
YAML数据格式 基本数据类型 #基本数据类型
boolean: True #TRUE,true,True,FALSE,falseFalse均可
float: 3.14 #6.8523015e5 #支持科学计数法
int: 123 #0b1010_0111_0100_1010_1110 支持二进制、八进制、十六进制
string: HelloWorld #字符串可以直接书写数组一组按次序排列的值 List、set # 数组
address:- beijing- shanghai#行内写法
commpany: [阿里,华为,腾讯]对象、Map(键值对) #对象
person:name: 张三age: 25#行内写法
person1: {name:张三,age:25}#对象数组格式一
users:- name: 张三age: 4- name: 李四age: 5#对象数组格式二
users2:-name: 张三age: 4-name: 李四age: 5#对象数组缩略格式
users3: [{name:张三,age:4},{name:李四,age:5}]YAML参数引用 #参数引用
name: 王老七
person3:name: ${name}age: 22sex: 男小结 配置文件类型 properties和以前一样 (设置文件的语言编码UTF-8)yml/yaml注意空格 yaml简洁以数据为核心 基本语法 大小写敏感数据值前边必须有空格作为分隔符使用空格缩进表示层级关系相同缩进表示同一级 数据格式 对象数组使用”-“表示数组的每个元素基本数据类型 参数引用 ${key}EL表达式
读取配置文件内容
yaml文件更强大的地方在于他可以给我们的实体类直接注入匹配值
支持方式
逐个注入Value
批量注入
ConfigurationProperties
Enviroment类
逐个注入
演示 properties
Component //注册bean
public class Dog {Value(阿黄)private String name;Value(18)private Integer age;
}加载指定的配置文件**PropertySource** ****加载指定的配置文件
ymlresources目录下新建一个.yml文件
name: 阿黄
age: 18PropertySource(value classpath:dog.yml)
Component //注册bean
public class Dog{Value(${name})private String name;Value(${age})private Integer age;
}批量注入
方式一
Person类
Component //注册bean到容器中
public class Person {private String name;private integer age;private boolean marry;private Date birth;private MapString,Object maps;private ListObject lists;private Dog dog;//有参无参构造、get、set方法、toString()方法
}Dog类
public class Dog{private String name;private int age;//有参无参构造、get、set方法、toString()方法
}编写yaml文件
person1:name: wanglsage: 18marry: truebirth: 1990/10/19maps: {k1: v1,k2: v2}lists:- code- bodybuilding- musicdog:name: summerage: 1数据注入到类中
Component //注册bean
ConfigurationProperties(prefix person1)
public class Person {private String name;private Integer age;private Boolean happy;private Date birth;private MapString,Object maps;private ListObject lists;private Dog dog;
}ConfigurationProperties的作用
将配置文件中配置的每一个属性的值映射到这个组件中告诉SpringBoot将本类中的所有属性和配置文件中相关的配置进行绑定参数 prefix “person” : 将配置文件中的person下面的所有属性一一对应
如果编写完配置文件有红色提示则可以添加坐标隐藏
dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-configuration-processor/artifactIdoptionaltrue/optional
/dependency测试
SpringBootTest
class SpringbootInitApplicationTests {AutowiredPerson person;Testvoid contextLoads() {System.out.println(person);}
}结果
Person{name‘刘大脑袋’, age22, birthMon Jan 01 00:00:00 CST 1990, lists[drink, eat, play, happy], maps{carBMW, pcROG}, dogDog{name‘summer’, age1}}
方式二
直接在测试类中装配开发模式类辅助获取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这个使用起来并不友好我们需要为每个属性单独注解赋值比较麻烦我们来看个功能对比图 ConfigurationProperties只需要写一次即可 Value则需要每个字段都添加松散绑定这个什么意思呢? 比如我的yml中写的last-name这个和lastName是一样的 - 后面跟着的字母默认是大写的。这就是松散绑定。JSR303数据校验 这个就是我们可以在字段是增加一层过滤器验证 可以保证数据的合法性复杂类型封装yml中可以封装对象 使用value就不支持 结论
配置yml和配置properties都可以获取到值 强烈推荐 yml
如果我们在某个业务中只需要获取配置文件中的某个值可以使用一下 value
如果说我们专门编写了一个JavaBean来和配置文件进行一一映射就直接configurationProperties不要犹豫
JSR303数据校验
对于 web 服务来说为防止非法参数对业务造成影响在 Controller 层一定要做参数校验的大部分情况下请求参数分为如下两种形式
POST 、 PUT 请求使用 requestBody 传递参数GET 请求使用 requestParam/PathVariable 传递参数。
什么是JSR303标准
JSR的全称是Java Specification RequestsJava 规范提案是指向JCP ( Java CommunityProcess )提出新增一个标准化技术规范的正式请求。
Java API 规范( JSR303 )定义了 Bean 校验的标准 validation-api 但没有提供实现。 hibernatevalidation 是对这个规范的实现并增加了校验注解如 Email 、 Length 等。 SpringValidation 是对 hibernate validation 的二次封装用于支持 spring mvc 参数自动校验。接下来我们以 spring-boot 项目为例介绍 Spring Validation 的使用
JSR303校验注解的使用步骤 注入依赖导入spring-boot-starter-validation启动器pom文件导入坐标 dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-validation/artifactId
/dependency在实体类需要校验的成员字段Field上添加校验注解。 Component
ConfigurationProperties(prefix person4)
Validated
public class Person {NotNull(message 姓名不能为空)private String name;Max(message 年龄不能超过上限,value 120)private int age;private Date birth;private ListString lists;private MapString,Object maps;private Dog dog;// 有参无参构造方法getsettoString()方法
}yml person4:name: 刘大脑袋age: 220birth: 1990/1/1lists: [drink,eat,play,happy]maps: {car: BMW,pc: ROG}dog:name: summerage: 1测试 SpringBootTest
class SpringbootInitApplicationTests {AutowiredPerson person;Testvoid contextLoads() {System.out.println(person);}
}报错信息
请求的参数校验
实体类Dog
Component
public class Dog {NotNull(message 狗狗的名字不能为空)private String name;Max(message 狗狗年龄超过上限了,value 20)private int age;// 有参无参构造方法getsettoString()方法
}在Controller控制器的校验参数前使用Valid注解开启校验使用BindingResult 绑定校验结果
RequestMapping(path /vali)
ResponseBody
public String validationDemo(Valid Dog dog, BindingResult result) {int errorCount result.getErrorCount();if (errorCount 0) {ListFieldError fieldErrors result.getFieldErrors();for (FieldError fieldError : fieldErrors) {System.out.println(属性{ fieldError.getField() },传参是{ fieldError.getRejectedValue() },报错提示信息{ fieldError.getDefaultMessage() });}return 数据不合法;} else {return 数据合法;}
}主程序启动项目访问URLlocalhost:8080/vali?name旺财age100
页面显示数据不合法
控制台打印拼接的报错信息
Controller统一异常处理
ControllerAdvice统一为Controller进行增强
ExceptionHandler : 异常处理
实现步骤 控制器 RequestMapping(path /vali)
ResponseBody
public String validationDemo(Valid Dog dog) {return 数据合法;
}新建包和类 ControllerAdvice // 统一异常处理注释
public class BindExceptionHandler {ExceptionHandler(BindException.class) // 捕获的异常类型ResponseBodypublic String handlerBindException(BindException ex, HttpServletRequest request){return 全局异常处理器捕获成功;}
}Dog实体类同上 测试 主程序启动项目访问URLlocalhost:8080/vali?name旺财age100 页面显示全局异常处理器捕获成功
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)范围校验
// 被注解的元素其值必须大于等于最小值并且类型为intlongfloatdouble
Min(value 18, message 必须大于等于18)// 被注解的元素其值必须小于等于最小值并且类型为intlongfloatdouble
Max(value 18, message 必须小于等于18)// 校验注解的元素值大于等于DecimalMin指定的value值并且类型为BigDecimal
DecimalMin(value 150, message 必须大于等于150)// 校验注解的元素值小于等于DecimalMax指定的value值 并且类型为BigDecimal
DecimalMax(value 300, message 必须大于等于300)// 校验注解的元素值在最小值和最大值之间并且类型为BigDecimalBigIntegerCharSequencebyteshortintlong。
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 必须为未来的时间)长度校验
// 被注解的元素的长度必须在指定范围内并且类型为StringArrayListMap
Size(max 11, min 7, message 长度必须大于等于7或小于等于11)// 校验注解的元素值长度在min和max区间内 并且类型为String
Length(max 11, min 7, message 长度必须大于等于7或小于等于11)格式校验
// 校验注解的元素值的整数位数和小数位数上限 并且类型为floatdouble,BigDecimal
Digits(integer3,fraction 2,message 整数位上限为3位小数位上限为2位)// 被注解的元素必须符合指定的正则表达式并且类型为String
Pattern(regexp \\d{11},message 必须为数字并且长度为11)// 校验注解的元素值是Email也可以通过regexp和flag指定自定义的email格式类型为String
Email(message 必须是邮箱)多环境切换profile
我们在开发Spring Boot应用时通常同一套程序会被安装到不同环境比如开发、测试、生产等。其中数据库地址、服务 器端口等等配置都不同如果每次打包时都要修改配置文件那么非常麻烦。profile功能就是来进行动态配置切换的
命名语法
例如application-环境简称.properties/yml
application-dev.properties/yml 开发环境application-test.properties/yml 测试环境application-pro.properties/yml 生产环境 profile配置方式 多profile文件方式 profile激活方式 配置文件 spring:profiles:active: test #环境简称虚拟机参数 在VM options 指定-Dspring.profiles.activedev 命令行参数java –jar xxx.jar --spring.profiles.activedev
配置文件加载位置 配置文件加载顺序 Springboot程序启动时会从以下位置加载配置文件
1. file:./config/当前项目下的/config目录下
2. file:./ 当前项目的根目录
3. classpath:/config/classpath的/config目录
4. classpath:/ classpath的根目录
加载顺序为上文的排列顺序高优先级配置的属性会生效外部配置加载顺序 通过官网查看外部属性加载顺序 https://docs.spring.io/spring-boot/docs/current/reference/html/features.html#features.external-config 项目打包好以后我们可以使用命令行参数的形式启动项目的时候来指定配置文件的新位置这种情况一般是后期运维做的多相同配置外部指定的配置文件优先级最高 java -jar XXX.jar --spring.config.locationF:/application.properties