学习在IDEA中使用SpringBoot(二)Spring Boot 配置

1.配置文件

Spring Boot使用一个全局配置文件,其名称是固定的

  • application.properties
  • application.yml

配置文件的作用:修改SpringBoot自动配置的默认值

标记语言:
以前配置的文件,大多是xml文件;
YAML:以数据为中心,yml结尾,比json、xml等更适合做配置文件
在这里插入图片描述

2.YAML语法
  1. 基本语法
    (1)k:(空格)v: 表示一对键值对(空格必须有);
    (2)以空格的缩进来控制层级关系,只要是左对齐的一列数据,都是同一层级
    (3)属性和值是大小写敏感的

  2. 值的写法
    (1)字面量:普通的值(数字,字符串,布尔):字面直接写
    字符串默认不用加上单引号或者双引号
    “”:双引号,不会转义字符串里面的特殊字符,特殊字符会作为本身字符所表达
    “\n”:作为换行符使用
    ‘’:单引号,会转义特殊字符,特殊字符最终只是一个普通的字符串数据
    ‘\n’:只表示 \n

    (2)对象、Map(属性和值)(键值对):
    K:V:对象还是K:V方式,在下一行写对象属性和值得关系,注意缩进

     friends:
     		name:hehe
     		age:20
    

    一行:
    friends: {name:hehe,age:20}
    (3)数组(List、Set):
    用 - 值表示数组中的一个元素

       pet:
     	- cat
     	- dog
     	- pig
    

    一行:
    pets:[cat,dog,pig]

  3. 配置文件注入
    使用yml:
    (1)配置文件:
    在这里插入图片描述
    (2)javaBean:
    在这里插入图片描述
    (3)导入配置文件处理器坐标
    在这里插入图片描述
    (4)在test中运行测试方法
    在这里插入图片描述
    (5)运行成功
    在这里插入图片描述
    使用properties:
    (1)修改settings防止中文乱码
    在这里插入图片描述
    (2)编写配置文件
    在这里插入图片描述
    (3)执行测试方法成功
    在这里插入图片描述

  4. @Value和@ConfigurationProperties区别

在这里插入图片描述
如果只是在某个业务逻辑中需要获取一下配置文件中的某项值急用@Value
如果专门编写了一个javaBean来和配置文件进行映射,我们就直接使用@ConfigurationProperties
在这里插入图片描述

3.@PropertySource&@ImportResource

@PropertySource:加载指定的配置文件

  1. 创建person.properties配置文件 在这里插入图片描述
  2. 添加注解 ,value添加值为数组
    在这里插入图片描述

@ImportResource:导入Spring的配置文件,让配置文件里面的内容生效

Spring Boot 里面没有Spring的配置文件,我们自己编写的配置文件也不能自动识别;要想让自己编写Sping的配置文件生效。需要用@ImportResource标注在主配置类(包含main方法的类)上
(1)创建配置Spring文件:
在这里插入图片描述
(2)添加注解
在这里插入图片描述
但是SpringBoot并不推荐上述方式添加组件,而是推荐使用@Bean给容器中添加组件
在这里插入图片描述

4. 配置文件占位符
  • RandoValuePropertySource:配置文件中可以使用随机数

    $ {random.value}、 $ {random.int}、$ {random.long}、$ {random.int(10)}、 $ { random.int[1024,65536]}

  • 属性配置占位符
    可以在配置文件中引用前面配置过的属性(优先级前面配置过的这里都能用)
    $ {app.name:默认值} 指定找不到属性时的默认值

5. Profile
  1. 我们在主配置文件编写的时候,文件名可以是application-{profile}.properties/xml,但是默认使用application.properties的配置

  2. yml支持多文档快方式
    在这里插入图片描述

  3. 激活指定profile

    • 在配置文件中指定 spring.profiles.cative=dev
    • 命令行 --spring.profiles.active=dev
    • jvm参数 -Dspring.profiles.active=dev
6. 配置文件加载位置

Spring Boot 会启动扫描一下位置的application.propertoes/yml作为SpringBoot的默认文件

  • file:./config/
  • file:./
  • classpath:./config/
  • classpath:./
  1. 按照优先级从高到低的顺序,所有位置的配置文件都会被加载;
  2. 高优先级的配置文件会覆盖低优先级配置的内容,如果有不同的内容会形成互补配置
  3. 我们也可以通过spring.comfig.location来改变默认配置文件位置,在项目打包好以后,我们可以使用命令行参数的形式,启动项目的时候来指定pei配置文件的新位置;指定配置文件和默认加载这些配置文件共同起作用形成互补配置
    在这里插入图片描述
7. 外部配置加载顺序

Spring Boot 也可以从以下位置加载配置,按照优先级从高到低;高优先级的配置覆盖低优先级配置

  1. 命令行参数
    修改端口和路径,多个配置使用空格分开; – 配置项=值
    在这里插入图片描述
  2. 来自java:comp/env的JNDI属性
  3. java系统属性(System.getProperties)
  4. 操作系统环境变量
  5. RandomValuePropertySource配置的random.*属性值

由jar包外向jar包内进行寻找:优先加载带proflie,再加载不带profile

  1. jar包外部的application-{profile}.properties或application.yml(带Spring.profile)配置文件

  2. jar包内部的application-{profile}.properties或application.yml(带Spring.profile)配置文件

  3. jar包外部的application.properties或application.yml(不带Spring.profile)配置文件

  4. jar包内部的application.properties或application.yml(不带Spring.profile)配置文件

  5. @Configuration注解类上的@PropertySource

  6. 通过SpringApplication.setDefaultProperties指定的默认属性

8. 自动配置原理
1. 自动配置原理
  1. Spring Boot启动的时候加载主配置类,开启了自动配置功能 @EnableAutoConfiguration

    @EnableAutoConfiguration作用:

  • 利用AutoConfigurationImportSelector给容器中导入一些组件

  • 可以查看selectImports()方法的内容:

    1. List configurations = this.getCandidateConfigurations(annotationMetadata, attributes);
    2. SpringFactoriesLoader.loadFactoryNames():扫描所有jar包类路径下的 META-INF/spring.factories这个文件,
    3. 把扫描到这些文件的内容包装成properties对象
    4. 从properties中获取到EnableAutoConfiguration.class类对应的值,然后把它们添加到容器中

    将类路径下META-INF/spring.factories里面配置的所有EnableAutoConfiguration的值加入到了容器中
    在这里插入图片描述
    xxxAutoConfiguration:自动配置类,每一个这样的类 都是容器中的容器中的一个组件,都加入到容器中用来做自动配置

  1. 每一个自动配置类进行自动配置功能

  2. 具体案例分析:HttpEncodingAutoConfiguration以此为例解释自动配置原理

     @Configuration  //表示这个一个配置类,给容器中添加组件
     @EnableConfigurationProperties({HttpProperties.class})  //启用指定类的ConfigurationProperties功能
     @ConditionalOnWebApplication(  //spring底层@conditional注解,根据不同的条件,根据不同的条件,如果满足指定的条件,整个配置类里面的配置就会生效;当前是判断是否为web应用,如是则生效
         type = Type.SERVLET
     )
     @ConditionalOnClass({CharacterEncodingFilter.class}) //判断当前项目有没有这个类;当前是SpingMVC中解决乱码的过滤器
     @ConditionalOnProperty(  //判断配置文件中是否存在某个配置;
         prefix = "spring.http.encoding",
         value = {"enabled"},
         matchIfMissing = true  //即使我们配置文件中不配置为true,也是默认生效的
     )
     public class HttpEncodingAutoConfiguration {
    
      	  @Bean  //给容器中添加一个组件,这个组件的某些值需要从properties中获取
            @ConditionalOnMissingBean //判断容器中没有这个组件
             public CharacterEncodingFilter characterEncodingFilter() {
                 CharacterEncodingFilter filter = new OrderedCharacterEncodingFilter();
                 filter.s	
    
     		  etEncoding(this.properties.getCharset().name());
         		            filter.setForceRequestEncoding(this.properties.shouldForce(org.springframework.boot.autoconfigure.http.HttpProperties.Encoding.Type.REQUEST));	    		       filter.setForceResponseEncoding(this.properties.shouldForce(org.springframework.boot.autoconfigure.http.HttpProperties.Encoding.Type.RESPONSE));
         	  return filter;
    
  • @Configuration :表示这个一个配置类,给容器中添加组件
  • @EnableConfigurationProperties({HttpProperties.class}) :启用指定类的ConfigurationProperties功能;将配置文件中对应的值和HttpProperties绑定起来
    在这里插入图片描述
    在这里插入图片描述
    总结:根据当前不同的条件判断,决定这个配置类是否生效;
    一旦这个配置类生效,这个配置类就会给容器中添加各种组件;
    这些组件的属性是从对应的properties类中获取的,这些类里面的每一个属性又是和配置文件绑定的
  1. 所有在配置文件中能配置的属性都是xxxProperties类中封装这;配置文件能配置什么就可以参照某个功能对应的这个属性类
    • xxxAutoConfiguration:自动配置类
    • xxxProperties:属性配置类
    • yml/properties文件中能配置的值就来源于[属性配置类]

SpringBoot 的精髓:
1. SpringBoot启动会加载大量的自动配置类
2. 我们只需要看需要的功能有没有SpringBoot默认写好的配置类
3. 看这个自动配置类中到底配置了哪些组件;只要有我们需要的组件就不需要再配置
4. 给容器中自动配置类添加组件的时候,会从properties中获取某些属性。我们可以在配置文件中指定这些属性的值

2. 细节
  1. @CondiConditional派生注解(Spring注解版原生的@Conditional作用)
    作用:必须是@CondiConditional指定的条件成立,才给容器中添加组件,配置里面的内容才生效
    在这里插入图片描述
    自动配置类必须在一定的条件下才能生效
    可以通过debug=true确定自动配置类是否启动和是否匹配成功
    在这里插入图片描述
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值