配置文件

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 这样启动项目,控制台就出打印出哪些配置项被启用,哪些没有被启用;

(2)Spring Boot配置的更多相关文章

  1. Spring Boot -- 配置切换指南

    一般在一个项目中,总是会有好多个环境.比如: 开发环境 -> 测试环境 -> 预发布环境 -> 生产环境 每个环境上的配置文件总是不一样的,甚至开发环境中每个开发者的环境可能也会有一 ...

  2. Spring Boot 配置优先级顺序

    一般在一个项目中,总是会有好多个环境.比如: 开发环境 -> 测试环境 -> 预发布环境 -> 生产环境 每个环境上的配置文件总是不一样的,甚至开发环境中每个开发者的环境可能也会有一 ...

  3. spring boot 配置注入

    spring boot配置注入有变量方式和类方式(参见:<spring boot 自定义配置属性的各种方式>),变量中又要注意静态变量的注入(参见:spring boot 给静态变量注入值 ...

  4. Spring boot配置多个Redis数据源操作实例

    原文:https://www.jianshu.com/p/c79b65b253fa Spring boot配置多个Redis数据源操作实例 在SpringBoot是项目中整合了两个Redis的操作实例 ...

  5. spring boot配置springMVC拦截器

    spring boot通过配置springMVC拦截器 配置拦截器比较简单, spring boot配置拦截器, 重写preHandle方法. 1.配置拦截器: 2重写方法 这样就实现了拦截器. 其中 ...

  6. spring boot配置mybatis和事务管理

    spring boot配置mybatis和事务管理 一.spring boot与mybatis的配置 1.首先,spring boot 配置mybatis需要的全部依赖如下: <!-- Spri ...

  7. [转] Spring Boot配置多个DataSource

    [From]  https://www.liaoxuefeng.com/article/001484212576147b1f07dc0ab9147a1a97662a0bd270c20000 Sprin ...

  8. Spring boot 配置异步处理执行器

    示例如下: 1. 新建Maven 项目 async-executor 2.pom.xml <project xmlns="http://maven.apache.org/POM/4.0 ...

  9. Spring boot配置404、500页面

    Spring boot 配置404页面很简单,如果你访问的url没有找到就会出现spring boot 提示的页面,很明显Spring boot不用配置就可以显示404页面了. 在template下创 ...

  10. Spring Boot 配置元数据指南

    1. 概览 在编写 Spring Boot 应用程序时,将配置属性映射到 Java bean 上是非常有用的.但是,记录这些属性的最好方法是什么呢? 在本教程中,我们将探讨 Spring Boot C ...

随机推荐

  1. Spring MVC原理及配置

    Spring MVC原理及配置 1. Spring MVC概述 Spring MVC是Spring提供的一个强大而灵活的web框架.借助于注解,Spring MVC提供了几乎是POJO的开发模式,使得 ...

  2. 如何在wcf中用net tcp协议进行通讯

    快速阅读 如何在wcf中用net tcp协议进行通讯,一个打开Wcf的公共类.比较好好,可以记下来. 配置文件中注意配置 Service,binding,behaviors. Service中配置en ...

  3. Out of range value for column 'huid' at row

    遇到一个MySQL小问题 Data truncation: Out of range value for column 'huid' at row 1       在数据库某表中字段 “huid” 为 ...

  4. mysql命令行修改密码

    1.以管理员身份打开cmd窗口2.进入安装mysql的bin目录.3.命令net start mysql开启服务4.mysql -u root -p 管理员登陆5.输入旧密码后进入数据库6.输入ALT ...

  5. sass登陆页面实例

    sass登陆页面实例 一.总结 一句话总结: sass使用非常方便:使用就是将sass转化为css引入,并且动态监听让sass转化为css,可以很方便的所见即所得 1.sass安装? npm就可以按照 ...

  6. 北漂IT男返乡2年的三线楼市观察(宜昌夷陵篇)-原创

    一直想写点什么,这段时间总算有空,好嘞,正好有兴致来写一写楼市相关的文章以饕读者和粉丝朋友. 宜昌?说宜昌您可能不知道,但是说三峡大坝您就知道了 最近这两年,因为小宝的降临,我多半时间待在老家宜昌陪伴 ...

  7. Navicat Premium连接MySQL 1251错误和Mysql初始化root密码和允许远程访问

    Mysql初始化root密码和允许远程访问 在我们使用mysql数据库时,有时我们的程序与数据库不在同一机器上,这时我们需要远程访问数据库.缺省状态下,mysql的用户是没有远程访问的权限. 下面介绍 ...

  8. 使用cmi工具连接服务器远程装机exsi

    使用cmi工具连接服务器远程装机exsi 网宿机房有两台服务器磁盘坏掉了,后面换了磁盘需要重新初始化系统 访问:http://192.168.48.133/cgi/url_redirect.cgi?u ...

  9. 六、postman做ui测试

    一.思路 发请求去拿到网站的响应——>html 解析html标签,判断一些元素是否显示 二.目的 快速检查ui是否正确 三.用到的库 Cheerio https://cheerios.js.or ...

  10. java中 try catch的妙用

    程序开发中,格式转换的时候,经常由于字符串可能是其他的不可预知的符号导致,字符串转数值失败, 这个时候可以妙用try catch来解决,如下图所示.其实,很多其他不可预知的异常情况,也可以用它来处理. ...