配置文件

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. SQL优化(子文章)(持续更新)

    -----> 总文章 入口 文章目录 [-----> 总文章 入口](https://blog.csdn.net/qq_37214567/article/details/90174445) ...

  2. 如何画好ER图

    快速阅读 了解ER图的基本组成,以及如何在viso中画ER图. 什么是ER图 是实体关系图,用矩形表示实体,用椭圆形表示属性,用棱形表示两实体之间的联系.相互用直接联接起来,是一种数据建模工具.用来描 ...

  3. mui openWindow方法详细说明

    mui.openWindow({ url: 'xxx.html', //String类型,要打开的界面的地址 id: 'id', //String类型,要打开的界面的id styles: { //We ...

  4. PHP如何解决网站大流量与高并发的问题(二)

    转载:https://zhyunfe.github.io/2017/10/02/php-interview-prepare-hc-2/ 数据库缓存 相关概念 什么是数据库缓存? 为什么使用缓存 使用M ...

  5. SQL Server 将查询结果集以XML形式展现 for xml path

    for xml path,其实它就是将查询结果集以XML形式展现 双击打开

  6. IM 简介

    LayIM - 打造属于你自己的网页聊天系统http://layim.layui.com/ 瓜子IM智能客服系统的数据架构设计(整理自现场演讲) - 知乎https://zhuanlan.zhihu. ...

  7. Andorid SQLite数据库开发基础教程(3)

    Andorid SQLite数据库开发基础教程(3) 数据库生成方式 数据库的生成有两种方式,一种是使用数据库管理工具生成的数据库,我们将此类数据库称为预设数据库,另一种是使用代码生成的数据库. 使用 ...

  8. CVAE-GAN论文学习-1

    CVAE-GAN: Fine-Grained Image Generation through Asymmetric Training 摘要 我们提出了一个变分生成对抗网络,一个包含了与生成对抗网络结 ...

  9. pytorch Containers的Module部分

    参考:https://pytorch.org/docs/stable/nn.html Containers Module CLASS torch.nn.Module 所有神经网络模块的基类 你定义的模 ...

  10. MyBatis原理总结(代码实现流程)

    我们在实际开发中,越简单越好,所以都是采用不写Dao实现类的方式.不管是使用xml还是直接配置. 但是MyBatis是支持写Dao实现类的 注意sqlSession是这里面的一个灵魂,有很多执行api ...