配置文件

Spring Boot 默认自动加载 类路径 下面的名字为 application.yml | application.properties 的配置文件,它们为 全局配置文件

配置文件用于修改,Spring Boot 自动配置的默认值;

propertiesyml 文件都存在的时候,两个配置文件的内容都会得到加载,但是 properties 的优先级更高,也就是它的内容会覆盖掉 yml文件的同名内容 ;


YAML 语法

  • 基本语法

    • 使用 缩进表示层级关系
    • 缩进时不允许使用 tab,只允许使用 空格
    • 缩进的空格数目无所谓,只要相同层级的元素,左侧对齐即可
    • 大小写敏感

  • 支持的三种数据结构

    • 对象:键值对的集合

      键值对之间需要有个空格,K:(空格)V

      多行写法:

      person:
      name: yiaz
      age: 23

      单行写法:

      person: {name: yiaz,age: 23}
    • 数组:一组按次序排列的值

      多行写法:

      pets:
      - cat
      - dog

      单行写法:

      pets: [dog,cat]
    • 字面量:字面值

      字符串默认不需要加上单引号、双引号;双引号不会转义特殊字符,单引号会转义,将特殊字符,转义为普通的字符了,比如 ‘\n’ 就输出 ‘\n’ ,而不是换行了;

可以嵌套使用三种类型;


单元测试

Spring Boot 里面,单元测试不再使用 Junit,而是在测试类上标注下面两个注解:



可以使用属性注入功能:

@RunWith(SpringRunner.class)
@SpringBootTest
public class YiazSpringbootDemoApplicationTests { @Autowired
private Person person; @Test
public void contextLoads() {
System.out.println(person);
}
}

配置文件值自动注入

首先我们在 pom 里面配置一个依赖,配置文件处理器,这样在全局配置文件里面写属性,就会有提示:

<!--配置文件处理器-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>

然后,写出对应的 bean 类,我们将配置文件的属性,封装到这个bean 里面,

@Component
@ConfigurationProperties(prefix = "person")
public class Person {
...

使用 @ConfigurationProperties(prefix = "person") 注解,prefix = "person" 是告诉容器,这里注入 前缀是 person 的属性;

其中 @ConfigurationProperties bean中的所有属性与配置文件中的属性一一对应,注入到 bean 里面,也就是如果配置文件里有的属性,但是 bean 里面没有对应的属性,则该属性被忽略;

因为 @ConfigurationProperties 注解,只能为容器中的组件,提供注入功能,因此还需要 @Component 标识下 bean

在获取 properties 文件里面的属性值的时候,可能会有乱码,设置下:



支持松散绑定。比如bean 的属性名为 lastName ,则配置文件中对应的属性名可以是 lastNamelast-name

不支持 SPEL

支持 JSR303 数据校验,在 bean 上使用注解 @Validated,然后在需要检验的字段上,使用 注解进行检验,跟学 SpringMvc 的时候一样 ;

支持复杂类型封装;


@Value 获取配置文件属性的值

注解的值,可以是字面值、EL表达式、SPEL

不支持松散绑定、 JSR303 数据校验;

不支持复杂类型封装;

因此,如果只是在代码中,需要获取一下配置文件中的某个属性值,则可以使用 @Value,如果是需要将配置文件的值,封装到 bean 里面,则使用 @ConfigurationProperties

加载指定配置文件

@ConfigurationProperties 默认加载全局配置文件;

如果我们自己有配置文件,则可以通过 @PropertySource 来指定下文件的位置,然后让 @ConfigurationProperties 去加载 ;


优先级问题

自定义配置文件低于全局配置文件,yml 低于 properties 文件 ;

全局配置文件,Spring Boot 默认加载,然后如果我们加载我们自己的配置文件,然后两个文件中有相同的属性名,则属性值取优先级高的那个;

可以想成所有的配置文件,最后由于属性值覆盖问题,到内存里面都可以看成一张拼接的配置文件了;


加载Spring 的配置文件

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

@ImportResource(locations = {"classpath:xxx"})

将这个注解写在一个配置类上,可以就写在启动类上;


为容器中添加组件

定义一个配置类,在配置里面进行组件的添加;

使用 @Bean注解,其可以标注在方法上,或者当源注解使用,这里仅仅关注标注在方法上;

标注在方法上的作用是:将方法的返回值添加到容器中,在容器中的默认id 就是方法名;

@Configuration
public class Myconfig { @Bean
public Pet pet(){
return new Pet();
}
}

随机数 & 占位符


Profile

在开发的时候,可以写多个配置文件,分别给 生产、开发 环境使用,方便切换,不需要更改配置;

Spring Boot 默认使用 application.properties ,我们可以在里面激活其他配置文件;

但是激活的配置文件,名字不是随便取的,必须是 application-{profile}.properties/yml

激活的配置文件,优先级高于 默认的全局配置文件 ;

在全局配置文件中使用 spring.profiles.active=xxx 激活其他配置文件,其中 xxx{profile} 的值 ;

也可以使用 yml 的多文档方式;

yml 中通过 --- 划分文档块:

server:
port: 8081
spring:
profiles:
active: dev ---
spring:
profiles: prod server:
port: 8082 ---
spring:
profiles: dev server:
port: 8089

这样激活的就是 dev,端口号就使用 8089

还可以通过 命令行 指定,这样配置文件中的激活,就不会奏效;

通过在 java -jar xxxx.jar 后面添加 --spring.profiles.active=xx 来指定激活的配置文件 ;

还可以通过 虚拟机参数 这样配置文件中的激活,同样不会奏效:

通过传入 -Dspring.profiles.active=xxx 激活配置文件 ;


配置文件的位置

我们前面一直说,Spring Boot 会默认加载 类路径下面的 application.properties/yml 文件作为默认的全局配置文件;

其实 Spring Boot 在运行的时候,会依次从下面的四个地方,寻找 application.properties/yml ,当作默认配置文件 ;

  • file: ./config/
  • file: ./
  • classpath: ./config/
  • classpath: ./

他们的优先级,从上到下,优先级从高到低 ;

只要在特定位置上特定名字的配置文件都会被加载,也就是将四个属性,分开写成四份配置文件,分别放在四个地方,最后也会得到全部加载(互补配置);

如果属性名一样,会产生覆盖现象,高优先级的覆盖低优先级的 ;

我们也可以通过 spring.config.location 来改变默认位置 ;这个改变有点不一样,不是我们想象的改变;

它只在 命令行 有效,并且它指定的配置文件具有最高优先级;以前的四个地方的配置文件,还是会得到加载;

一般是用于运维的时候,项目已经打包好了,后期需要改变一些配置,我们只需要写个配置文件,里面写需要修改的配置,然后命令行启动项目,指定下配置文件的路径,即可覆盖掉想修改的属性;


外部配置文件加载顺序


@Coditional 扩展注解

当我们写配置类的时候,有时候需要判断下,在一定条件下使用,才希望配置生效,就可以使用 @Coditional 注解,它是 Spring 的原生注解;

Spring Boot@Coditional 进行了扩展:

注解可以用在方法或者类上;

同时这也是自动配置类的常用的注解,那么多的自动配置,都被加载,但是不是所以的自动配置都奏效,只有在一定条件下成立的才奏效;

可以在配置里面设置 debug=true 这样启动项目,控制台就出打印出哪些配置项被启用,哪些没有被启用;

最新文章

  1. 数据库多表连接方式介绍-HASH-JOIN
  2. hihoCoder#1121
  3. Win7下安装Centos7
  4. CocoaPods常用终端命令及Profile文件简单介绍
  5. arch linux 新版安装(转)
  6. SoundPool 音频播放 详解 示例
  7. 一些SQL语句的问题
  8. sizeof与类,继承,virtual的种种
  9. B实习面试
  10. ubuntu opengl 开发
  11. SpringBoot入门之简单配置
  12. 史上最污技术解读,让你秒懂IT术语(转载)
  13. slice的部分说明
  14. hive sql 里面的注释方式
  15. 调整Windows XP 输入法顺序
  16. CCConfiguration::sharedConfiguration()-&gt;loadConfigFile cocos2d-x 中文乱码问题及国际化解决方案
  17. jquery 滑动取值
  18. 第九章 对称加密算法--IDEA
  19. 机器学习入门-数值特征-数字映射和one-hot编码 1.LabelEncoder(进行数据自编码) 2.map(进行字典的数字编码映射) 3.OnehotEncoder(进行one-hot编码) 4.pd.get_dummies(直接对特征进行one-hot编码)
  20. Effective OC : 1-5

热门文章

  1. (大型网站之Nginx)图解正向代理、反向代理、透明代理
  2. 用sublime3编写运行16位汇编程序_详细教程
  3. Perl关于分椰子的趣味问题
  4. * resolve_conffiles: Existing conffile /etc/config/dhcp is different from the conffile in the new package. The new conffile will be placed at /etc/config/dhcp-opkg.
  5. RecyclerView 实现快速滚动 (转)
  6. mediacoder固定质量CRF
  7. VS2019,打开项目之后显示:System.NullReferenceException: 未将对象引用设置到对象的实例
  8. 使用Dapper.Contrib
  9. 关于PHP7的CURL上传文件
  10. org.slf4j:slf4j-api:添加日志管理