yml文件(yml文件配置数据库配置)
单体Spring boot引入外部配置文件yml,properties
我们在做微服务项目时候会引入spring cloud框架,对于配置文件我们就会通过spring cloud config来配置,实现线上环境动态修改配置文件属性而不需要重新打jar 包。 但是对于单体的spring boot工程,我们又希望可以在生产环境中方案修改配置文件属性。
通过引入外部配置文件,应用启动时候设置配置文件的自动加载
1: 在单体工程的root目录下添加一个config目录,然后新建我们的properties, 如:jdbc-db.properties, redis.properties
2: 然后在我们的application启动类上添加@propertySources注解引入我们的外部文件
注意:因为PropertySources 默认只解析.properties文件,如果要解析yml文件,需要指定factory只需要实现org.springframework.core下的 PropertySourceFactory 接口就OK了。
简单的properties配置文件只需要按如下方式配置即可
只需要1,2步骤就可以完成外部文件的加载,如果涉及到线上修改配置就只需要手动修改配置文件,重新启动应用即可生效。
启动 jar 包时指定 yml 文件
把 application.yml 文件放在执行 java -jar 命令所在的目录中;
执行 java -jar xxx.jar 命令,此时 application.yml 应放在 xxx.jar 同级目录;
执行 java -jar /abc/xxx.jar 命令,此时 application.yml 应放在 / 目录;
需要注意的是,自动加载 application.yml 的位置并不与 jar 包相关,而是与 java 命令有关。
通过 --spring.config.location 参数可以指定配置文件的位置。
java -jar /abc/xxx.jar --spring.config.location=/abc/application.yml
yml | ${}的用法
yml文件配置如下:
${key:default_value} 这种表达方式是通过key来获取value,如果获取不到就使用后面默认值。
使用场景:
一些直接通过Jar包启动时,可以在启动时手动配置相关参数,如果没有配置,也会自动获取默认值进行启动,如
当然,${}这种形式本来也可以用来获取值,比如在本yml文件中去获取其他位置定义好的值,也可以去获取相关的环境变量。
YML格式文件用什么程序编辑打开?
YML文件格式是YAML (YAML Aint Markup Language)编写的文件格式,YAML是一种直观的能够被电脑识别的的数据数据序列化格式,他并且容易被人类阅读,容易和脚本语言交互的,可以被支持YAML库的不同的编程语言程序导入,比如: C/C++, Ruby, Python, Java, Perl, C#, PHP等。例如YML文件格式的用法:
文件,通常就是Ruby on Rails 用来保存连接数据库时使用的连接信息文件。
yml文件常见的几种读取方式
最常见的两种
接下来要讲的几种case要用到如下的yml文件
application.yml
application1.yml
借助Spring提供的一个类,org.springframework.core.env.Environment, 它继承了PropertyResolver, 所以可以当作属性解析器使用
Spring提供了YamlPropertiesFactoryBean可以读取自定义配置yml文件,不再拘泥于application.yml及其激活的其他配置文件
存在问题: 那就是只有在这个接口的请求中能够取到这个属性的值,如果再写一个接口,不使用YamlPropertiesFactoryBean读取配置文件,即使之前的方法已经读取过这个yml文件一次了,第二个接口取到的仍然还是空值。
解决方式: 配合PropertySourcesPlaceholderConfigurer使用,它实现了BeanFactoryPostProcessor接口,也就是一个bean工厂后置处理器的实现,可以将配置文件的属性值加载到一个Properties文件中。使用方法如下:
除了使用YamlPropertiesFactoryBean将yml解析成Properties外,其实我们还可以使用YamlMapFactoryBean解析yml成为Map
使用snakeYml,需要引入依赖
使用方式:
使用jackson,需要引入依赖
使用jackson读取yml也非常简单,这里用到了常用的ObjectMapper,在创建ObjectMapper对象时指定使用YAML工厂,之后就可以简单的将yml映射到实体:
jackson还可以生成yml文件
yml 文件中使用环境变量
Spring Boot 中可以用 spring.profiles.active 参数来指定系统环境,让系统加载不同的配置文件。
可以在程序启动的时候加上参数来指定需要的配置
当然我们也可以事先设置好系统的环境变量
然后在 yml 文件中用 active: ${SERVER_EVN} 来动态的获取系统已设置好的数据。这样这台 test 服务器中的再启动 Spring Boot 项目的时候就可以不用每次都去设置参数了。
同时 yml 也支持 ${SERVER_EVN:dev} 这样的方式来设置默认值,此时如果环境变量中没有 SERVER_EVN , active就会默认设置为"dev"。