springboot使用一个全局配置文件

  • application.properties
  • application.yml

配置文件放在src/main/resources目录或者类路径/config下
.yml是YMAL语言的文件,以数据为中心,比json、xml等更适合作配置文件
全局配置文件的可以对一些默认配置值进行修改
配置文件的作用:修改springboot自动配置的默认值,因为springboot在底层都给我们自动配置好,所以通过配置文件修改默认值

Yaml基本语法:

1、key: value 表示一对键值对(空格必须有)
以空格的缩进控制层级关系,只要是左对齐的一列数据都是同一层级的

server:port: 8080

属性和值也是大小写敏感;
2、值的写法
字面量:普通的值(数字、字符串、布尔):
k: v:字面直接来写;
字符串默认不用加上单引号或者双引号
“”:双引号;不会转移字符串里面的特殊字符;特殊字符会作为本身想表示的意思
name:”zhangsan\nlisi”:输出 zhangsan 换行 lisi
‘’:单引号,回转仪特殊字符,特殊字符最终只是一个普通的字符串数据
name:‘zhangsan\nlisi’:输出zhangsan\nlisi
对象、map(属性和值):
k: v: 在下一行来写对象的属性和值的关系;注意缩进
对象还是k:v的方式

fridends:lastName: zhangsanage: 20

行内写法:

friends: {lastName: zhangsan, age: 18}

数组(List、Set):
用- 值表示数组中的一个元素

pets:- cat- dog

行内写法:

pets: [cat,dog]

获取配置文件值(配置文件注入)

1、使用yml配置文件注入
yml配置文件:

person:lastName: zhangsanage: 18boss: falsebirth: 2020/04/18maps: {k1: v1, k2: v2}list:- lisi- hahahadog:name: gougouage: 2

bean Person类:

/*** 将配置文件中的每一个属性中的值,映射到这个组件中* @ConfigurationProperties:告诉springboot将本类中的所有属性和配置文件中相关配置进行绑定*      perfix = "person" 配置文件中哪个下面的配置进行一一映射**  只有这个组件是容器中的组件,才能使用容器提供的@ConfigurationProperties功能*  @Component注入到容器中*/
@Component
@ConfigurationProperties(prefix = "person")
public class Person {private String lastName;private int age;private Boolean boss;private Date birth;private Map<String, Object> maps;private List<String> list;private Dog dog;

我们可以导入配置文件处理器,以后编写配置就会有提示了:

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-configuration-processor</artifactId><optional>true</optional>
</dependency>

2、用properties注入
改在properties中进行配置是一样可行的,但需要注意编码问题,idea默认使用utf-8编码,而properties需要ASCII编码,所以需要在idea的设置-file encoding中勾选将properties转为ascii

3、使用@Value注入:

@Value("${person.last-name}”)  //在配置文件中拿值
private String lastName;
@Value("#{11*2}")
private int age;
@Value("false")
private Boolean boss;

用@Value和@ConfigurationProperties 的区别

ConfigurationProperties @Value
功能 批量注入配置文件中的属性 一个个指定
松散绑定(松散语法) 支持 不支持
SpEL 不支持 支持
JSR303数据校验 支持 不支持
复杂类型封装 支持 不支持

配置文件yml还是properties都能获取到值;
如果只是在某个业务逻辑中获取某项值,可以用@Value,如果专门编写了JavaBean和配置文件进行映射,就要用ConfigurationProperties
4、数据校验

@Component
@ConfigurationProperties(prefix = "person")
@Validated
public class Person {//@Value("${person.last-name}")@Emailprivate String lastName;//@Value("#{11*2}")private int age;//@Value("false")private Boolean boss;private Date birth;private Map<String, Object> maps;private List<String> list;

@PropertySource和@ImportResource

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

@Component
@PropertySource(value="classpath:person.properties")
@ConfigurationProperties(prefix = "person")
//@Validated
public class Person {

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

SpringBoot里面没有Spring的配置文件,我们自己编写的配置文件,也不能自动识别;
想让Spring配置文件生效,要将@ImportResource标注在一个配置类上

@ImportResource(locations = {"classpath:bean.xml”})
//导入配置文件才能生效

原配置文件内容

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"><bean id="helloService" class="com.study.springbootconfig.service.HelloService"></bean>
</beans>

springboot推荐的给容器中添加组件的方式:推荐使用全注解的方式
1、配置类====使用配置文件
2、使用@Bean给容器中添加组件:

/*** @Configuration 指明当前类是一个配置类替代之前的spring配置文件* 在配置文件中用<bean></bean>标签添加组件*/
@Configuration
public class MyConfig {//将方法的返回值添加到容器中,容器中这个组件默认的id就是方法名@Beanpublic HelloService helloService(){System.out.println("配置类给容器中添加组件了");return new HelloService();}
}

配置文件占位符

1、随机数:

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

2、占位符获取之前配置的值,如果没有可以使用:指定默认值

person.last-name=张三${random.uuid}
person.age=${random.int(1,100)}
person.birth=2011/12/12
person.boss=false
person.maps.k1=v1
person.maps.k2=123
person.list=a,b,c
person.dog.name=${person.hello:hello}dog
person.dog.age=11

profile

profile是Spring对不同环境提供不同配置功能的支持,可以通过激活、指定参数等方式快速切换环境
1、多profile文件
我们在主配置文件编写的时候,文件名可以是 application-{profile}.properties/yml
2、yml支持多文档块方式

server:port: 8081
spring:profiles:active: prod
---
server:port: 8083
spring:profiles: dev
---
server:port: 8084
spring:profiles: prod

3、激活指定profile
1)在配置文件中指定:spring.profiles.active=dev
2)命令行方式:
在测试的时候传参指定

—spring.profiles.active=dev
打包的时候,使用spring.profiles.active指定
3)虚拟机参数:
-Dspring.profiles.active=prod

配置文件加载位置

springboot启动会扫描以下位置的application.properties/yml文件作为默认配置文件
加载顺序由高到低,高优先级配置覆盖低优先级:

  • file:./config/
  • file: ./
  • classpath:/config/
  • classpath:/
    springboot会在这四个位置全部记载配置文件,互补配置

还可以通过spring.config.location来改变默认的配置文件位置
不能再开发调试的时候用,是项目打包好以后,可以使用命令行的参数的方式,启动项目的时候指定配置文件的新位置;指定配置文件和默认加载的这些配置文件会共同起作用,互补配置

外部配置加载顺序

spring也可以从以下位置加载配置,优先级由高到低,覆盖并互补
1、命令行参数
2、来自java:conp/env的NDI属性
3、jsva系统属性(System.getProperties())
4、操作系统环境变量
5、RandomValuePropertySource配置的random.*属性值
优先加载带profile,再加载不带profile的,都是由jar包外向jar包内寻找
6、jar包外部的application-{profile}.properties或application.yml(带spring.profie)的配置文件
7、jar包内部的application-{profile}.properties或application.yml(带spring.profie)的配置文件
8、jar包外部的application.properties或application.yml(不带spring.profie)的配置文件
9、jar包内部的application.properties或application.yml(不带spring.profie)的配置文件

10、@Configuartion注解类上的@PropertySource
11、通过SpringApplication.setDefaultProperties指定的默认属性
所有的配置加载来源参考官网文档

自动配置原理

1、Springboot启动的时候加载主配置类,开启了自动配置功能 @EnableAutoConfiguration
2、@EnableAutoConfiguration作用:

  • 利用EnableAutoConfigurationImportSelector给容器中导入一些组件
  • 可以查看selectImports方法的内容
  • List configurations = this.getCandidateConfigurations(annotationMetadata, attributes) 获取候选的配置
SpringFactoriesLoader.loadFactoryNames(this.getSpringFactoriesLoaderFactoryClass(), this.getBeanClassLoader());
//扫描所有jar包路径 META-INF/spring.factories
//把扫描到的这些文件的内容包装成properties
//从properties中获取到EnableAutoConfiguration.class对应的值,然后把它们添加在容器中

即 将类路径下的 META-INF/spring.factories里面配置的所有EnableAutoConfiguration的值加到了容器中。
每一个 xxxAutoConfiguration类都是容器中的一个组件都计入到容器中,用他们做自动配置
3、每一个自动配置类进行自动配置功能
4、 以HttpEncodingAutoConfiguration为例解释自动配置原理

@Configuration(  //表示这是一个配置类,以前写的配置文件一样,也可以给容器中添加组件proxyBeanMethods = false
)
@EnableConfigurationProperties({HttpProperties.class})//启用ConfigurationProperties功能;将配置文件中对应的值和HttpProperties帮顶起来
@ConditionalOnWebApplication( //spring底层有一个Conditional注解,根据不同的条件,如果满足指定的条件,整个配置类里面的配置就会生效。 这个意思就是判断当前应用是否为web应用,如果是,当前配置类生效type = Type.SERVLET
)
@ConditionalOnClass({CharacterEncodingFilter.class})//判断当期项目有没有这个类 CharacterEncodingFilter;SpringMVC中进行乱码解决的过滤器
@ConditionalOnProperty(prefix = "spring.http.encoding",value = {"enabled"},matchIfMissing = true
) //配置文件中是否存在 spring.http.encoding.enabled;如果不存在,判断也是成立的,即使我们配置文件中不配置spring.http.encoding.enabled,也是生效的public class HttpEncodingAutoConfiguration {//他已经和springboot的配置文件映射了private final Encoding properties;//只有一个有参构造器,参数的值就会从容器中拿;并把HttpProperties加入到ioc容器中public HttpEncodingAutoConfiguration(HttpProperties properties) {this.properties = properties.getEncoding();}@Bean  //给容器中添加一个,这个组件的某些值需要从properties中获取@ConditionalOnMissingBeanpublic CharacterEncodingFilter characterEncodingFilter() {CharacterEncodingFilter filter = new OrderedCharacterEncodingFilter();filter.setEncoding(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;}

根据当前的条件判断,决定这个配置类是否生效
一旦这个配置类生效,这个配置类就会给容器添加各种组件;这些组件的属性是从对应的properties类中获取的,这些类里面的每一个属性又是和配置文件绑定的

5、所有在配置文件中能配置的属性都是在xxxProperties类中的封装者;配置文件能配置什么就可以参照某个功能对应的属性类

@ConfigurationProperties(   prefix = "spring.http"
) // 从配置文件中获取指定的值和bean的属性进行绑定
public class HttpProperties {private boolean logRequestDetails;private final HttpProperties.Encoding encoding = new HttpProperties.Encoding();

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

xxxAutoConfiguration:自动配置类,他会给容器中添加组件也会有对应的xxxProperties,封装配置文件中相关的属性
配置细节
1、@Conditional派生注解(Spring注解版原生的@Conditional作用)
作用:必须是@Conditional条件成立才给容器中添加组件,配置里面的所有内容才生效。
自动配置类必须在一定的条件下才能生效

怎么知道自动配置类是否生效:在配置文件中配置debug=true,开启debug模式,运行时控制台就会打印自动控制报告就可以知道哪些自动配置类生效

============================
CONDITIONS EVALUATION REPORT
============================Positive matches: //(自动配置类启用的)
-----------------AopAutoConfiguration matched:- @ConditionalOnProperty (spring.aop.auto=true) matched (OnPropertyCondition)Negative matches: //没有启动,没有匹配成功的自动配置类
-----------------ActiveMQAutoConfiguration:Did not match:- @ConditionalOnClass did not find required class 'javax.jms.ConnectionFactory' (OnClassCondition)

二、SpringBoot配置-简述配置加载原理相关推荐

  1. DB数据源之SpringBoot+MyBatis踏坑过程(三)手工+半自动注解配置数据源与加载Mapper.xml扫描...

    DB数据源之SpringBoot+MyBatis踏坑过程(三)手工+半自动注解配置数据源与加载Mapper.xml扫描 liuyuhang原创,未经允许禁止转载    系列目录连接 DB数据源之Spr ...

  2. Smart3D系列教程7之 《手动配置S3C索引加载全部的瓦片数据》

    一.前言 迄今为止,Wish3D已经出品推出了6篇系列教程,从倾斜摄影的原理方法.采集照片的技巧.Smart3D各模块的功能应用.小物件的照片重建.大区域的地形重建到DSM及正射影像的处理生产,立足于 ...

  3. axios 配置loading_vue axios配置 发起请求加载loading请求结束关闭loading

    axios带有请求拦截器,避免在每个请求里面加loading重复操作,可以封装进去,在请求开始时加载loading层,请求结束关闭,loading层用vux的loading加载 axios.js im ...

  4. webpack配置vue组件加载器

    前言 App.vue单文件组件代码 <template><div><h1>App根组件</h1></div> </template&g ...

  5. SpringMVC配置静态资源加载, 中文乱码处理,注解驱动

    常规配置(Controller加载控制) SpringMVC的处理器对应的bean必须按照规范格式开发,未避免加入无效的bean可通过bean加载过滤器进行包含设定或排除设定,表现层bean标注通常设 ...

  6. Spring:@AutoConfigurexxx注解-控制配置类的加载顺序

    1.美图 2.概述 控制配置类的加载顺序(@AutoConfigureAfter.@AutoConfigureBefore.@AutoConfigureOrder) AutoConfigureAfte ...

  7. 内嵌WEB服务器加载原理

    内嵌WEB服务器加载原理 理解里面的tomcat是如何启动的 Startup.bat Server.start() 1,概述 我们在使用springboot项目的时候并没有使用外部的tomcat,那么 ...

  8. 【Docker镜像文件加载原理生产中重新制作并提交镜像文件案例演示】

    一.知识回顾 之前的内容都帮你整理好了,在这里哟! [0.Docker相关目录文章整理,可自行查看,包含多节内容] [1.Docker详细安装部署&阿里镜像地址配置] [2.Docker架构& ...

  9. 一文了解 Java 中 so 文件的加载原理

    前言 无论是 Android 开发者还是 Java 工程师应该都有使用过 JNI 开发,但对于 JVM 如何加载 so.Android 系统如何加载 so,可能鲜有时间了解. 本文通过代码.流程解释, ...

最新文章

  1. 初学算法-快速排序与线性时间选择(Deterministic Selection)的C++实现
  2. 为了测试Writer的发图功能,也为了让girls现身。
  3. mvn 打包可执行包_如何用Maven打包可执行jar包
  4. 用python随机画多个圆_Python Pygame随机绘制不重叠的圆圈
  5. 怎么利用GitHub
  6. @configuration注解_超级全面的 SpringBoot 注解介绍,每一个用途都应该清晰
  7. vlc 在ubuntu 14下的linux版本编译
  8. 深度学习笔记(11) 超参数调试
  9. java与python反转Ture与False的方法
  10. idea 光标变粗 无法输入
  11. html屏幕3分,使用CSS3的background-size优化苹果的Retina屏幕的图像显示
  12. Bee 事务注解 @Tran 使用实例
  13. 由浅入深玩转华为WLAN—10安全认证配置(3)无线dot1 PEAP认证,基于微软IAS服务器
  14. 春风桃李花开夜,秋雨梧桐叶落时——python面向对象三大特征(封装、继承、多态)
  15. 学校计算机一级上网题,考试经验之谈:计算机一级考试上网题怎么操作?
  16. win10 Edge浏览器 触控板 快捷键
  17. python reserve函数_Python reversed函数及用法
  18. Servlet规范之转发请求
  19. 受限玻尔兹曼机(RBM)学习笔记(四)对数似然函数
  20. Web 服务寻址(WS-Addressing)对 SOAP 的隐式影响

热门文章

  1. 个人注册PowerBI账号申请
  2. Linux——孤儿进程|进程的优先级 用top命令去修改优先级 其他概念 环境变量 PATH 获取环境变量
  3. MySQL 的几种碎片整理方案总结(解决delete大量数据后空间不释放的问题)
  4. RFID固定资产管理系统,提高工作效率,节省时间-新导智能
  5. 多入库口、出库口的提升系统仿真测试案例
  6. excel2007计算机试题,巧用excel2007/2003进行拍照
  7. 太干了,全网最全的Matplotlib可视化教程
  8. React-Native 高仿“掘金”App 注册和登录界面
  9. 5G网络时代助推社交电商,小蜜蜂社交电商的新生态新发展
  10. bugku 我永远喜欢穹妹