SpringBoot小知识点(二)

1.YAML配置绑定变量两种方式

1.1 @Value

1.application.yml配置文件增加配置

person:
  pid: 1
  pname: 小明

2.增加实体类接收,并把这个实体类注入到spring容器中(不然直接new的实体类是不会有值的)

@Data
@Component
public class Person {

    @Value("${person.pid}")
    private Integer pid;
    @Value("${person.pname}")
    private String pname;

}
@RestController
@RequestMapping("/demo")
@Slf4j
public class PersonController {

    @Resource
    Person person;

    @RequestMapping("/showPerson")
    public void showPerson() {
        log.info(person.toString());

    }
}

3.访问请求,则结果如图

在这里插入图片描述

1.2 @ConfigurationProperties

1.上面其他部分不变,只需实体类修改一下

@Data
@Component
@ConfigurationProperties(prefix = "person")   //表示配置的整体前缀
public class Person {
    private Integer pid;//成员变量名称要和yml配置项key一一对应
    private String pname;

}

2.执行结果也一样
在这里插入图片描述

其实,还可以通过SpEl在读取时,进行相关数据操作,再映射到对应的属性上,这个后续再了解

2 配置属性值数据绑定校验

我们都知道配置文件是需要开发人员手动来修改的,只要是人为参与就会有出错的可能。为了避免人为配置出错的可能,我们需要对配置属性值做校验。
比如:

  • 针对数据库密码配置:需要限定最小长度或者复杂度限制
  • 针对系统对外发邮件,邮件发送方的邮箱地址配置:字符串配置要符合一定的邮件正则表达式规则
  • 针对某些不能为空的配置:开发人员有可能忘了为它赋值,等等场景

我们不能等到程序上线之后,才发现相关的配置错误。所以我们通常对配置属性与类对象的成员变量绑定的时候,就加上一些校验规则。如果配置值不符合校验规则,在应用程序在启动的时候就会抛出异常。

那么如何优雅的对参数进行校验呢?JSR303就是为了解决这个问题出现的

javax.validation 是基于JSR-303标准开发出来的,使用注解方式实现,及其方便,但是这只是一个接口,没有具体实现
Hibernate-Validator是一个hibernate独立的包,可以直接引用,他实现了javax.validation同时又做了其他扩展,比较强大。SpringBoot在内部集成了hibernate-validation,可以直接使用。
校验规则注解是在JSR 303(java)规范中定义的,但是JSR 303只是一个规范,并没有很多比较具体的实现。目前通常都是使用hibernate-validator进行统一参数校验,hibernate-validator是对JSR 303规范的实现。

java和javax都是Java的API(Application Programming Interface)包,java是核心包,javax的x是extension的意思,也就是扩展包。

因为spring-boot-starter-web包中已经包含了Hibernate-Validator 依赖,如图:

在这里插入图片描述
所以我们可以直接使用,比如增加相关注解,如下:

@Data
@Component
@ConfigurationProperties(prefix = "person")   //表示配置的整体前缀
@Validated
public class Person {
    private Integer pid;//成员变量名称要和yml配置项key一一对应
    @NotBlank(message = "也可以定制信息")
    private String pname;
    @Min(18)
    private Integer page;

}

配置文件修改,如下

person:
  pid: 1
  pname:
  page: 22

启动,就会去校验,若不符合,则直接报错
在这里插入图片描述
参考例子:

@size (min=6, max=20, message="密码长度只能在6-20之间")
@pattern (regexp="[a-za-z0-9._%+-]+@[a-za-z0-9.-]+\.[a-za-z]{2,4}", message="请输入正确的邮件格式")
@Length(min = 5, max = 20, message = "用户名长度必须位于5到20之间")
@Email(message = "请输入正确的邮箱")
@NotNull(message = "用户名称不能为空")
@Max(value = 100, message = "年龄不能大于100岁")
@Min(value= 18 ,message= "必须年满18岁!" )
@AssertTrue(message = "bln4 must is true")
@AssertFalse(message = "blnf must is falase")
@DecimalMax(value="100",message="decim最大值是100")
@DecimalMin(value="100",message="decim最小值是100")
@NotNull(message = "身份证不能为空")
@Pattern(regexp="^(\d{18,18}|\d{15,15}|(\d{17,17}[x|X]))$", message="身份证格式错误")

spring boot项目使用(2)-- javax.validation

3 加载额外配置文件的两种方式

有一些老的项目里面的jar包并未主动的去与spring boot 融合,很多jar包都有自己的配置文件。如果我们在spring boot项目中使用这些jar包就必须得使用它们的配置文件,那就面临一个问题:我们的spring boot项目默认只有一个全局配置文件:application.yml或application.properties。该如何加载额外的配置文件?

3.1 使用@PropertySource加载properties文件

@PropertySource(value = {"classpath:person.properties"})
public class Person{

注意:这个注解不支持加载yml文件,若要支持,需要自己增加一个配置类

3.2 使用@ImportResource加载Spring的xml配置文件

在spring boot应用入口启动类上加@ImportResource(locations = {“classpath:beans.xml”}),该注解用来加载Spring XML配置文件。

4 profile不同环境使用不同配置

我们开发的服务通常会部署在不同的环境中,例如开发环境、测试环境,生产环境等,而不同环境需要不同的配置。最典型的场景就是在不同的环境下需要连接不同的数据库,需要使用不同的数据库配置。我们期待实现的配置效果是:

  • 减少配置修改次数
  • 方便环境配置切换

Spring Boot 默认的配置文件是 application.properties(或yml)。那么如何实现不同的环境使用不同的配置文件呢?一个比较好的实践是为不同

4.1 划分不同配置文件

在这里插入图片描述
在这里插入图片描述

4.2 切换环境方式

1.application.yml是默认使用的配置文件,在其中通过spring.profiles.active设置使用哪一个配置文件,下面代码表示使用application-prod.yml配置,如果application-prod.yml和application.yml配置了相同的配置,比如都配置了运行端口,那application-prod.yml的优先级更高
在这里插入图片描述
在这里插入图片描述
2.IDEA启动

VM options设置启动参数 -Dspring.profiles.active=prod

Program arguments设置 --spring.profiles.active=prod

Active Profile 设置 prod

进入
在这里插入图片描述
3.环境变量方式启动

java -jar spring-boot-profile.jar --spring.profiles.active=prod

5 配置文件优先级

5.1 全局配置文件加载优先级

spring boot 启动会扫描以下位置的application.properties或者application.yml文件作为Spring boot的默认配置文件.数值越小的标号优先级越高
在这里插入图片描述
file:./config/ (当前项目路径config目录下);
file:./ (当前项目路径下);
classpath:/config/ (类路径config目录下);
classpath:/ (类路径下).
以上是按照优先级从高到低的顺序,所有位置的文件都会被加载,高优先级配置内容会覆盖低优先级配置内容
在这里插入图片描述
SpringBoot会从这四个位置全部加载主配置文件,如果高优先级中配置文件属性与低优先级配置文件不冲突的属性,则会共同存在—互补配置。假如我们在上面的四个配置文件分别设置server.port=6666、7777、8888、9999。然后启动应用,最终的启动端口为6666,因为file:./config/ (当前项目路径config目录下配置文件)优先级是最高的。
自定义改变全局配置文件的加载位置:(优先级最高)
我们也可以通过配置spring.config.location来改变默认配置。

java -jar ./boot-launch-1.0.jar --spring.config.location=D:/application.yml

项目打包好以后,我们可以使用命令行参数的形式,启动项目的时候来指定配置文件的新位置

5.2 配置加载优先级

SpringBoot也可以从以下位置加载配置:优先级从高到低;高优先级的配置覆盖低优先级的配置,所有的配置会形成互补配置。

  1. 命令行参数
  2. 来自java:comp/env的JNDI属性
  3. Java系统属性(System.getProperties())
  4. 操作系统环境变量
  5. RandomValuePropertySource配置的random.*属性值
  6. jar包外部的application-{profile}.properties或application.yml(带spring.profile)配置文件
  7. jar包内部的application-{profile}.properties或application.yml(带spring.profile)配置文件
  8. jar包外部的application.properties或application.yml(不带spring.profile)配置文件
  9. jar包内部的application.properties或application.yml(不带spring.profile)配置文件
  10. @Configuration注解类上的@PropertySource
  11. 通过SpringApplication.setDefaultProperties指定的默认属性

其实大家关于配置的优先级不用特别的去记忆。用到的时候查一下、体验一下、一般来说:特殊指定配置(命令行、环境变量)大于通用配置、外部配置优先级高于内部配置、局部环境配置(带profile)大于全局普适性配置。

6

7

8

9

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值