【SpringBoot】SpringBoot基础教程(4)
前言:
本文内容:JSR303校验、多环境配置及配置文件位置、自动配置原理再理解
推荐免费SpringBoot基础教程视频:[【狂神说Java】SpringBoot最新教程通俗易懂_哔哩哔哩_bilibili
JSR303校验
SpringBoot中可以用@validated
来校验数据,如果数据异常则会统一抛出异常,方比那异常中心统一处理。
Email爆红引入这个依赖即可
1
2
3
4
5 <!-- @Validated -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>
这里我们让Person实体类的name必须为邮箱格式
1 | package com.jokerdig.pojo; |
运行测试,发现报错(我们赋值不是Email)
1 | ------------------------------------------------------------------------------- |
除了Email()
,JSR303还有一些常用的注解
注解 | 说明 |
---|---|
@Null | 必须为null |
@NotNull | 必须不为null |
@AssertTrue | 必须为true |
@AssertFalse | 必须为false |
@Min(value) | 必须为一个数字,其值必须大于等于指定的最小值 |
@Max(value) | 必须为一个数字,其值必须小于等于指定的最小值 |
@DecimalMin(value) | 必须为一个数字,其值必须大于等于指定的最小值 |
@DecimalMax(value) | 必须为一个数字,其值必须小于等于指定的最小值 |
@Size(max,min) | 元素的大小必须在指定范围内 |
@Digits(int,fraction) | 必须是一个数字,其值必须在可接受范围内 |
@Past | 必须是一个过去的日期 |
@Future | 必须是一个将来的日期 |
@Pattern(value) | 其值必须符合指定的正则表达式 |
被修饰的元素必须是电子邮件 | |
@Length | 被修饰的元素长度必须在指定的范围内 |
@NotEmpty | 被修饰的元素必须非空 |
@Range | 被修饰的元素必须在合适的范围内 |
多环境配置及配置文件位置
配置文件可以存放的位置
file:./config/
根目录的config
文件下放置file:./
根目录下放置classpath:/config/
resources目录的config
文件下放置classpath:/
resources目录下放置
分别在四个位置新建配置文件,然后设置端口号,运行项目观察默认生效的端口号
1 | 2022-07-14 10:19:32.371 INFO 12196 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port(s): 8082 (http) with context path '' |
发现执行了8082端口,8082端口是在根目录下的config
文件夹下的配置文件
我们运行并删除配置文件,来观察配置文件的优先级,得出:
根目录的
config
文件下放置的优先级>根目录下放置的优先级>resources目录的config
文件下放置的优先级>resources目录下放置的优先级
SpringBoot多环境切换
profile是Spring对不同环境提供不同配置功能的支持,可以通过激活不同的环境版本,实现快速切换环境;
方式一:多配置文件
我们在主配置文件编写的时候,文件名可以是application-{profile}.properties/yaml
,来指定多个环境版本;
例如:application-test.properties
代表测试环境配置;application-dev.properties
代表开发环境配置;
但是SpringBoot并不会直接启动这些配置文件,它默认使用application.properties
主配置文件;我们需要通过一个配置来选择需要激活的环境;
1 | # 比如我们在配置文件中指定使用dev环境,可以通过设置不同端口来测试 |
以上
properties
都可以替换为yaml
,这里只是举例
运行测试
启动端口已经切换到dev
开发环境
1 | Tomcat started on port(s): 8083 (http) with context path '' |
方式二:自主选择
yaml提供了多文档模块
1 | # 方式二 多文档模块 |
运行测试
1 | Tomcat started on port(s): 8083 (http) with context path '' |
自动配置原理再理解
自动配置再理解
1 | // spring接管 |
自动装配总结
- SpringBoot启动会加载大量的自动配置类
- 观察我们需要的功能有没有在SpringBoot默认写好的自动配置类中
- 再来看这个自动配置类中到底配置了哪些组件(如果存在就不需要手动配置了)
- 给容器中自动配置类添加组件的时候,会从properties类中获取某些属性。只需要再配置中指定这些属性的值即可
核心
-
xxxAutoConfiguration:自动配置类,为容器添加组件
-
xxxProperties:封装配置文件中相关属性
@Conditional
了解自动装配原理,我们发现自动配置类必须在一定条件下才能生效;@Conditional
派生注解(Spring原生注解)
作用:必须是@conditional
指定条件成立,才能为容器中添加组件,所配置的内容才能生效;
@Conditional注解拓展 | 作用 |
---|---|
@ConditionalOnJava | 系统的Java版本是否符合要求 |
@ConditionalOnBean | 容器中存在指定Bean |
@ConditionalOnMissingBean | 容器中不存在指定Bean |
@ConditionalOnExpression | 满足SpEL表达式指定 |
@ConditionalOnClass | 系统中有指定的类 |
@ConditionalOnMissingClass | 系统中没有指定的类 |
@ConditionalOnSingleCandidate | 容器中只有一个指定的Bean,或者这个Bean是首选Bean |
@ConditionalOnProperty | 系统中指定的属性是否有指定的值 |
@ConditionalOnResource | 类路径下是否存在指定资源文件 |
@ConditionalOnWebApplication | 当前是web环境 |
@ConditionalOnNotWebApplication | 当前不是web环境 |
@ConditionalOnJndi | JNDI存在指定项 |
如何判断配置类是否生效
1 | # 开启springboot调试类 |
Positive matches:自动配置类启用的:正匹配
Negative matches:没有启动,没有匹配成功的自动配置类:负匹配
Unconditional classes:没有条件的类