lilele200706

 

SpringBoot之application.yml

 

SpringBoot的配置文件application.yml

序章:SpringBoot不做配置也可以跑,配了就是让我们自定义。我们都是自定义的,不然只能写个Controller,Hello World之类的。

一、SpringBoot的配置文件

  • SpringBoot使用一个全局的配置文件,配置文件的名称是固定的,application.properties or application.yml

  • 配置文件的作用:修改SpringBoot自动配置的默认值,因为SpringBoot在底层都给我们自动配置好了。

1.application.properties

server.port = 8081

2.application.yml(推荐)

  • yml是"YAML Ain't a Markup Language"的递归缩写。”YAML Another markup Language“,但强调这种语言以数据为中心,而不是以标记语言为重点,用反向缩略语重命名。

#对空格敏感
#可以将值注入到我们的配置类中
server:
port: 8081
#对象
student:
name: lele
age: 3
#行内写法 与javascript一样
student: {name: lele,age: 3}
#数组
pets:
- cat
- dog
- pig
pets: [cat,dog,pig]

二、yml的几种用法

  1. Spring的赋值方式

@Value("旺财")
private String name;

@Autowired
private Dog dog;
  1. yml的赋值方式

person: {name:lele,age: 22}
@Component//注册bean
@ConfigurationProperties(prefix = "person")
public class Person{
   private String name;
   private Integer age;
}
  • @ConfigurationProperties的作用:

    • 将配置文件中配置的每一个属性的值,映射到这个组件中;

    • 告诉SpringBoot将本类中的所有属性和配置文件中相关的配置进行绑定

    • 参数prefix = "person": 将配置文件中的person下面的所有索性一一对应

    • 只有这个组件是容器中的组件,才能使用容器中的@ConfigurationProperties功能

  1. yml可以松散绑定

last-name: lele

对应

private String lastName:

结论:

  • 配置yml和配置properties都可以获取到值,推荐yml

  • 如果我们在某个业务中,只需要获取配置文件中的某个值,可以使用以下@Value

  • 如果说,我们专门编写一个JavaBean来和配置文件进行映射,就直接使用@ConfigurationProperties,不用犹豫。

三、JSR303数据校验

1.添加依赖

<!--JSR303校验的依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>

2.@Validated //数据校验

@Validated
public class Person{
   @Email(message="邮箱格式错误")
   private String name;
}

常用的校验注解:

空检查
@Null       验证对象是否为null
@NotNull    验证对象是否不为null, 无法查检长度为0的字符串
@NotBlank 检查约束字符串是不是Null还有被Trim的长度是否大于0,只对字符串,且会去掉前后空格.
@NotEmpty 检查约束元素是否为NULL或者是EMPTY.

Booelan检查
@AssertTrue     验证 Boolean 对象是否为 true  
@AssertFalse    验证 Boolean 对象是否为 false  

长度检查
@Size(min=, max=) 验证对象(Array,Collection,Map,String)长度是否在给定的范围之内  
@Length(min=, max=) Validates that the annotated string is between min and max included.

日期检查
@Past           验证 Date Calendar 对象是否在当前时间之前  
@Future     验证 Date Calendar 对象是否在当前时间之后  
@Pattern   验证 String 对象是否符合正则表达式的规则

数值检查,建议使用在Stirng,Integer类型,不建议使用在int类型上,因为表单值为“”时无法转换为int,但可以转换为Stirng为"",Integer为null
@Min            验证 Number String 对象是否大等于指定的值  
@Max            验证 Number String 对象是否小等于指定的值  
@DecimalMax 被标注的值必须不大于约束中指定的最大值. 这个约束的参数是一个通过BigDecimal定义的最大值的字符串表示.小数存在精度
@DecimalMin 被标注的值必须不小于约束中指定的最小值. 这个约束的参数是一个通过BigDecimal定义的最小值的字符串表示.小数存在精度
@Digits     验证 Number String 的构成是否合法  
@Digits(integer=,fraction=) 验证字符串是否是符合指定格式的数字,interger指定整数精度,fraction指定小数精度。

@Range(min=, max=) 检查数字是否介于min和max之间.
@Range(min=10000,max=50000,message="range.bean.wage")
private BigDecimal wage;

@Valid  递归的对关联对象进行校验, 如果关联对象是个集合或者数组,那么对其中的元素进行递归校验,如果是一个map,则对其中的值部分进行校验.(是否进行递归验证)
   
@CreditCardNumber 信用卡验证
@Email  验证是否是邮件地址,如果为null,不进行验证,算通过验证。
@ScriptAssert(lang= ,script=, alias=)
   
@URL(protocol=,host=, port=,regexp=, flags=)

四、多环境配置文件及配置文件的位置

1.配置文件的位置

file: 指的是项目的目录

classpath: 指的是resources

  • file: ./config/

  • file: ./

  • classpath: /config/

  • classpath: /

优先级:file: ./config/ > file: ./ > classpath: /config/ > classpath: /

2.SpringBoot的多环境配置

server:
port: 8081
spring:
profiles:
active: dev #激活

---
server:
port 8082
spring:
profiles: dev

---
server:
port 8083
spring:
profiles: test

五、配置文件里面到底能写什么? 和spring.factories 之间的联系

  1. spring.factories中HttpEncodingAutoConfiguration

//表示这是一个配置类
@Configuration(proxyBeanMethods = false)
//自动配置属性:ServerProperties
@EnableConfigurationProperties({ServerProperties.class})
//spring底层注解:根据不同的条件,来判断当前配置或者类是否生效
@ConditionalOnWebApplication(type = Type.SERVLET)
@ConditionalOnClass({CharacterEncodingFilter.class})
@ConditionalOnProperty(
   prefix = "server.servlet.encoding",
   value = {"enabled"},
   matchIfMissing = true
)
public class HttpEncodingAutoConfiguration {
  1. 对用的ServerProperties

@ConfigurationProperties(    prefix = "server",    ignoreUnknownFields = true)
public class ServerProperties {
   private Integer port;
   private InetAddress address;
   @NestedConfigurationProperty
   private final ErrorProperties error = new ErrorProperties();
   private ServerProperties.ForwardHeadersStrategy forwardHeadersStrategy;
   private String serverHeader;
   private DataSize maxHttpHeaderSize = DataSize.ofKilobytes(8L);
   private Shutdown shutdown;
   @NestedConfigurationProperty
   private Ssl ssl;
   @NestedConfigurationProperty
   private final Compression compression;
   @NestedConfigurationProperty
   private final Http2 http2;
   private final ServerProperties.Servlet servlet;
   private final ServerProperties.Reactive reactive;
   private final ServerProperties.Tomcat tomcat;
   private final ServerProperties.Jetty jetty;
   private final ServerProperties.Netty netty;
   private final ServerProperties.Undertow undertow;

对应的配置文件中server. ...

image-20211212221118945

 

结论:配置文件中可以配置什么,就看配置类里有什么,不然,配置文件中写了,配置类中也没法接收。

自动装配的原理:

  1. SpringBoot启动会加载大量的自动配置类

  2. 看我们需要的功能有没有在SpringBoot默认写好的自动配置类当中;

  3. 我们再来看这个自动配置类中到底配置了哪些组件:(只要我们用的组件在,就不用手动配置了)

  4. 给容器中的自动配置类添加组件的时候,会从properties类中获取某些属性。我们只需要在配置文件中指定这些属性的值即可;

xxxxAutoConfiguration:自动配置类;给容器中添加组件

xxxxProperties:封装配置文件中的相关属性

#开启springboot的调试类
debug=true

启动后看日志:

Positivematches:(自动配置类启用的:正匹配)

Negativematches:(没有启动的,,没有匹配成功的自动配置类)

Unconditional classes:(没有条件的类)

posted on 2021-12-12 22:37  lilele200706  阅读(681)  评论(0)    收藏  举报

导航