配置文件

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. 开放-封闭原则(OCP)

    怎样的升级才能面对需求的改变却可以保持相对稳定,从而使得系统可以在第一个版本以后不断推出新的版本呢?开放-封闭原则(The Open-Closed Principle, OCP)为我们提供了指引.软件 ...

  2. Linux远程传输文件免密码

    首先为什么Linux远程传输要免密码?手动使用scp命令传输每次都要输密码太过麻烦了. 开发中有一句话,能复制粘贴尽量不要手打. 运维中有一句话,能脚本化实现尽量不要手动执行. 远程传输文件免密码的目 ...

  3. 15.linux iptables防火墙规则vsftp服务

    一.服务所开启的端口号.          dhcp 67       samba 139 445       http 80  https 443       mysql 3306         ...

  4. QT文本转语音模块(TTS)QTextToSpeech

    QTextToSpeech是QT5.8以上的文本转语音模块. 使用方法: 在.pro工程文件中添加“QT += texttospeech”. 添加头文件 #include <QTextToSpe ...

  5. Unity3d 错误提示 GUI Error: You are pushing more GUIClips than you are popping. Make sure they are balanced

    程序出現這個問題的話,程序編譯時正確,運行時報錯,而且沒有報出是哪個代碼文件出處. 這個問題一般首先去檢查Level內有用到OnGUI,Debug結果發現某代碼文件在調試代碼時複製多了一行GUILay ...

  6. TLS整理(下):TLS如何保证安全

    明文 无法验证服务器的真实性 从而引出了TLS.本篇就来着重介绍下TLS. 说起TLS可能有些人还比较陌生,但如果说到SSL,那知道的人就更多了.TLS其实就是SSL发展而来,版本演进大体为SSL 2 ...

  7. java判断A字符串中是否包含B字符

    java.lang.String类提供的方法 public boolean contains(CharSequence s) 当且仅当此字符串包含指定的 char 值序列时,返回 true. 例如: ...

  8. Apollo的基本使用及常见问题

    1. 创建项目 在创建项目页面中填写相关项目信息,最后点击提交即可创建项目. 注意:应用Id必须唯一并且与客户配置的app.id一致. 2. 发布 进入对应项目可通过文本(批量)或者表格模式添加配置, ...

  9. PHP中Cookie与 Session

    在非常多时候,我们需要跟踪浏览者在整个网站的活动,对他们身份进行自动或半自动的识别(也就是平时常说的网站登陆之类的功能),这时候,我们常采用  Cookie与 Session 来跟踪和判断. Sess ...

  10. Flutter的运行环境标识

    Flutter的四种运行模式:Debug.Release.Profile和test ,在实际开发中,我们往往需要根据当前运行模式的不同,选择不同的操作,比如在Debug模式启用Log.在生产模式关闭L ...