文章目录

  • 前言
  • 一、两种配置文件
    • 1、加载顺序上的区别
    • 2、应用场景
  • 二、不同环境配置文件
  • 三、读取配置文件信息
    • 1、@Value注解读取文件
    • 2、Environment读取文件
    • 3、@ConfigurationProperties读取配置文件
  • 总结

前言

使用过Spring Boot的小伙伴都知道,他的配置参数必不可少,比如MySql的连接,端口号的配置等等,都需要Spring Boot的config参数配置,下面我们就来认识一下,我们工作开发中,常用的一些配置,以及获取配置参数的方式。

一、两种配置文件

首先我们知道SpringBoot中有以下两种配置文件bootstrap (.yml 或者 .properties),application (.yml 或者 .properties),那么他们各有什么区别呢?

1、加载顺序上的区别

bootstrap.yml(bootstrap.properties)先加载,application.yml(application.properties)后加载。

2、应用场景

2.1 bootstrap.yml 和application.yml 都可以用来配置参数。

2.2 bootstrap.yml 可以理解成系统级别的一些参数配置,这些参数一般是不会变动的。

2.3 applicationn.yml 可以用来定义应用级别的,主要用于 Spring Boot 项目的自动化配置。

bootstrap 配置文件有以下几个应用场景。

使用 Spring Cloud Config 配置中心时,这时需要在 bootstrap 配置文件中添加连接到配置中心的配置属性来加载外部配置中心的配置信息;
一些固定的不能被覆盖的属性
一些加密/解密的场景;

二、不同环境配置文件

在工作中,经常会遇到很多不同的环境,比如开发用的本地数据库,线上用的另一套数据库,线上环境用的又是另一套数据库,每次改端口,特别繁琐,怎么办呢?根据不同的环境,配置不同的文件即可。

spring.profiles.active  通过该属性来指定哪些配置文件处于活动状态。


切换不同的环境,使用不同的端口号:

三、读取配置文件信息

1、@Value注解读取文件

比如我们定义两个参数:name = DT辰白 age=24


通过@Value注解读取参数,这里@Configuration中也可以写成@Component ,从定义来看,@Configuration注解本质上还是@Component,后面会有文章讲解关于这两个主键的区别。

@Configuration
public class ConfigParamsConfiguration {@Value("${dt.name}")private String name;@Value("${dt.age}")private Integer age;public String getConfig() {return name+"/"+age;}
}

接口测试:

@RestController
@RequestMapping("api/test")
public class ConfigController {@Autowiredprivate ConfigParamsConfiguration configParamsConfiguration;@GetMapping("/getParams")public String getConfig(){return configParamsConfiguration.getConfig();}
}

2、Environment读取文件

新建config.yml文件,配置和上面一样的内容:


通过Environment实例读取config.yml文件里面的内容:

@Configuration
@PropertySource(value = {"classpath:config.yml"})
public class EnvironmentParamsConfiguration {@Autowiredprivate Environment environment;public String getConfig(){String name = environment.getProperty("dt.name");String age = environment.getProperty("dt.age");return name+"/"+age;}
}
@PropertySource(value = {"classpath:config.yml"})  // 配置文件地址

测试:

 @Autowiredprivate EnvironmentParamsConfiguration environmentParamsConfiguration;@GetMapping("/getEnvParams")public String getEnvParams(){return environmentParamsConfiguration.getConfig();}

3、@ConfigurationProperties读取配置文件

在有大量参数的时候,一个个添加 @Value 就显得麻烦了一点,Spring 提供了另一种方式。

oauth:clientId: qq_41107231clientSecret: secretredirectUri: https://blog.csdn.net/qq_41107231grantType: code

通过@ConfigurationProperties实例读取文件里面的内容:

@Data
@Component
@ConfigurationProperties(prefix = "oauth")
public class ConfigurationPropertiesParamsConfiguration {private String clientId;private String clientSecret;private String redirectUri;private String grantType;}

1、@ConfigurationProperties 可以添加前缀,然后其属性就会按照变量的名称默认在 application.* 中寻找指定的变量。
2、必须要加@Data,因为这样可以自动的帮助添加默认的属性的 setter 方法,然后通过getter方法获取变量。

如果我们的变量采用下划线的方式,或者横线的方式配置,还能不能读取到呢?



依然可以读取到,配置方式比较灵活。

另外@ConfigurationProperties 也可以和 validation 注解一起使用的,能够避免我们在开发环境中产生不必要的错误。加入validation 依赖包:

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-validation</artifactId>
</dependency>

我们把配置文件里面的变量配置不规:

修改配置,加入validation 注解:

当我们启动程序,会发现直接报错了,无法启动,控制台打印如下信息:


特别适用,配置十分灵活和安全。

那如果我想要将oauth的信息单独放在其他配置文件里呢,可以配合这个注解一起使用,@PropertySource(value ={""}) 卧槽嘞?这里小编发现了一个坑。

我的配置文件这样写,可以吗?没毛病啊!!!!!!!!!!!!!



启动直接炸掉,根本在oauth.yml配置文件里面读取不到,我炸了。


然后一波操作,还能干啥?找度娘吧,哎!

2.5.2. Directly Loading YAML
Spring Framework provides two convenient classes that can be used to load YAML documents. The YamlPropertiesFactoryBean loads YAML as Properties and the YamlMapFactoryBean loads YAML as a Map.
You can also use the YamlPropertySourceLoader class if you want to load YAML as a Spring PropertySource.
Spring Framework提供了两个方便的类,可用于加载YAML文档。 YamlPropertiesFactoryBean将YAML作为属性加载,而YamlMapFactoryBean将YAML作为Map加载。
如果要将YAML加载为Spring PropertySource,也可以使用YamlPropertySourceLoader类。

翻译成人话:Spring Boot对外部化配置提供了强大的支持。 另外,可以使用不同的方式和格式直接读取Spring Boot应用程序中的属性。但是,默认情况下,@PropertySource不会加载YAML文件。

这不废话吗?难道换个后缀名就ok了,换成oauth.properties?我怀着揣测的心情再尝试了一波,如果再失败,以下文字将不会出现在本文!!!!


我不服,我不服,有解决方式吗》我有强迫症,就想用yml,我爱得深沉啊!!!


你管我,就不服,操作一波。自定义PropertySourceFactory,从Spring 4.3开始,@PropertySource带有factory属性。 可以利用它来提供PropertySourceFactory的自定义实现,该实现将处理YAML文件处理。

实现思路:

定义一个YamlPropertySourceFactory,实现PropertySourceFactory,重写createPropertySource方法。

public class YamlPropertySourceFactory implements PropertySourceFactory {@Overridepublic PropertySource<?> createPropertySource(String name, EncodedResource resource) throws IOException {YamlPropertiesFactoryBean factory = new YamlPropertiesFactoryBean();factory.setResources(resource.getResource());Properties properties = factory.getObject();assert properties != null;return new PropertiesPropertySource(Objects.requireNonNull(resource.getResource().getFilename()), properties);}
}

将自定义生成的Properties对象传入PropertiesPropertySource中产出一个新的PropertySource对象,结束!!!

再次启动测试:

总结

Spring Boot的注解绑定类型安全的 Java Bean 是非常强大的,在开发中经常会用到,选择一种适合项目的方式,注解编程,无比强大,赞啊!!!!!!!!!!!!!!!!

最全Spring Boot2.x系列Config配置集成篇-1参数配置相关推荐

  1. Spring Cloud Alibaba系列四:集成 seata 实现分布式事务

    文章目录 Spring Cloud Alibaba系列四:集成 seata 实现分布式事务 前言 Seata 是什么? Seata 术语 安装 seata 1.创建 seata 数据库,并添加对应的表 ...

  2. Spring Boot干货系列:数据存储篇-SQL关系型数据库之MyBatis的使用

    Spring Boot干货系列:数据存储篇-SQL关系型数据库之MyBatis的使用 前言 上篇我们介绍了Spring Boot对传统JdbcTemplate的集成,这次换一下,介绍下Spring B ...

  3. JVM优化系列-详解JDK1.8 Metaspace 参数配置

    导语   在JVM中除了有堆内存参数配置以外,还有一些其他内存例如方法区.线程栈直接内存等等.他们与堆内存来说是相对比较独立的内存空间.与堆内存相比较这些内存与应用程序本身的关系不大,但是如果将其放到 ...

  4. php6 配置,thinkphp6路由可选参数配置

    thinkphp6 路由可选参数配置后#0 [0]InvalidArgumentException in Container.php line 455 方法参数错误:id 路由配置参考手册如下 可选变 ...

  5. Redis笔记系列(特别总结篇)——常见配置redis.conf知识点总结

    2019独角兽企业重金招聘Python工程师标准>>> 由于前几篇说的redis配置信息量有点杂,很多是循序渐进把各个点引出的,不太方便我自己和其他小伙伴日后拿出来瞄一眼,所以,本文 ...

  6. 高通平台开发系列讲解(外设篇)TDM配置

    文章目录 一.配置设备树 二.修改machine驱动 三.channel/bit format的set和put函数 沉淀.分享.成长,让自己和他人都能有所收获!

  7. druid mysql配置详解_druid 参数配置详解

    spring.datasource.type=com.alibaba.druid.pool.DruidDataSource #驱动配置信息 spring.datasource.driver-class ...

  8. Spring Boot2 + Activiti6 集成在线流程设计器 Activiti modoler(3)

    前言 上篇文章介绍了如何在Spring Boot2集成activiti6 接下来,小编会一步一步的介绍如何集成在线设计器 Activiti Modoler 介绍 什么是 Activiti Modole ...

  9. 华为荣耀9青春版系统像鸿蒙,荣耀9青春版参数配置

    荣耀9青春版参数配置:千元手机性能与颜值二者不可兼得?千元手机难道就不能要自行车?当你上手了荣耀9青春版后,你一定会为明哥在荣耀9青春版发布会上说的那句"荣耀9青春版,再一次定义实力颜值王& ...

最新文章

  1. 和Leo一起做爱字符串的好孩子量子纠缠
  2. 【学术相关】研究生第一篇学术论文常犯问题总结
  3. 面向知识图谱的信息抽取
  4. udp怎么保证不丢包_在 Flink 算子中使用多线程如何保证不丢数据?
  5. SpringBoot+MyBatis+Redis实现SSO单点登录系统(一)
  6. mysql修改表结构 删除字段_mysql更改表结构:添加、删除、修改字段、调整字段顺序...
  7. Windows 7 God Mode
  8. 最新服装零售软件管理排名
  9. 火力发电厂卸料车系统无线改造
  10. PJzhang:左耳朵耗子-陈皓
  11. 7大浏览器颜值代表,谁才是真正的浏览器颜值之王呢?
  12. 【LeetCode】75. Sort Colors(颜色排序)-C++实现的两种方法及超详细图解
  13. codeforces 1183H 动态规划
  14. Docker容器镜像加速器
  15. python爬虫-批量下载qq音乐
  16. 关于先有鸡还是先有蛋,终于有正确答案了 1
  17. shields 徽标_纽约公共图书馆的新徽标
  18. linux 内功修炼之一 cpu
  19. 莫队算法二(树上莫队cot2,Haruna’s Breakfast)
  20. 以太网帧格式 IP数据报格式 TCP数据报格式 MTU MSS

热门文章

  1. 为什么vsdebug没有生成obj文件_用iPad实时扫描生成模型??两款实用App
  2. 洛谷 P1115 最大子段和
  3. 种树(信息学奥赛一本通-T1423)
  4. 训练日志 2019.1.23
  5. 机器分配(信息学奥赛一本通-T1266)
  6. 膨胀的木棍(信息学奥赛一本通-T1246)
  7. 取余运算(信息学奥赛一本通-T1326)
  8. 计算邮资(信息学奥赛一本通-T1052)
  9. 33 SD配置-销售凭证设置-定义销售凭证的号码范围
  10. 日语学习-多邻国-兴趣爱好