在Spring Boot中,配置文件有两个不同的格式,一种是application.properties,另外一种是application.yml或者是.yaml
两者相比,application.properties比较常见,但是yaml格式的配置文件比较简洁,除了简洁,使用场景也比较多;还有一个重要的特点是,yaml配置文件中的数据,在加载过程是有序的,而properties配置文件是无序的。
那么首先我们,先看一下properties配置文件
一、application.properties配置文件
1、存放的位置
application.properties文件可以存放在四个位置,当我们创建一个Spring Boot工程的时候,默认是放在resources目录下的。除此以外,还可以放在其他三个位置下:
①当前项目根目录下的config目录
②当前项目根目录
③resources目录下的config目录
④resources目录
这四个位置,优先级是不一样的,如下图所示
当然,我们也可以在项目启动是自己自定义配置文件的位置。例如,现在在 resources 目录下创建一个 javaboy 目录,目录中存放一个 application.properties 文件,那么正常情况下,当我们启动 Spring Boot 项目时,这个配置文件是不会被自动加载的。我们可以通过 spring.config.location 属性来手动的指定配置文件位置,指定完成后,系统就会自动去指定目录下查找 application.properties 文件。
这是在开发工具中配置了启动位置,如果项目已经打包成 jar ,在启动命令中加入位置参数即可:
java -jar properties-0.0.1-SNAPSHOT.jar --spring.config.location=classpath:/javaboy/
2、配置文件命名问题
对于 application.properties 而言,它不一定非要叫 application ,但是项目默认是去加载名为 application 的配置文件,如果我们的配置文件不叫 application ,也是可以的,但是,需要明确指定配置文件的文件名,方式和指定路径一致,只不过此时的 key 是 spring.config.name 。
首先我们在 resources 目录下创建一个 app.properties 文件,然后在 IDEA 中指定配置文件的文件名:
指定完配置文件名之后,再次启动项目,此时系统会自动去默认的四个位置下面分别查找名为 app.properties 的配置文件。当然,允许自定义文件名的配置文件不放在四个默认位置,而是放在自定义目录下,此时就需要明确指定 spring.config.location 。
3、普通属性注入
由于 Spring Boot 源自 Spring ,所以 Spring 中存在的属性注入,在 Spring Boot 中一样也存在。由于 Spring Boot 中,默认会自动加载 application.properties 文件,所以简单的属性注入可以直接在这个配置文件中写。
自定义一个Book类:
public class Book { private Long id; private String name; private String author; //省略 getter/setter }
在 application.properties 文件中定义属性:
book.name=三国演义 book.author=罗贯中 book.id=1
通过@Value注解,将属性注入
@Component
public class Book {
@Value("${book.id}")
private Long id;
@Value("${book.name}")
private String name;
@Value("${book.author}")
private String author;
//省略getter/setter
}
这里要注意的是,必须将Book类交给spring容器管理,也就是要加上@Component注解。如果 Book 没有交给 Spring 容器,那么 Book 中的属性也无法从 Spring 容器中获取到值。
在日常开发过程中,application.properties配置文件主要是用来存放系统配置的,比如数据库配置、redis配置等等。我们需要将这些自定义的配置信息放到其他文件当中,那么在类中又怎么获取配置文件中的信息?
在xml文件中,我们是通过如下方式来引入的:
<context:property-placeholder location="classpath:book.properties"/>
如果是在Java配置类中,我们可以通过@PropertySource 注解来引入
@Component @PropertySource("classpath:book.properties") public class Book { @Value("${book.id}") private Long id; @Value("${book.name}") private String name; @Value("${book.author}") private String author; //getter/setter }
这个简单属性的注入方式,在spring和spring boot当中都可以使用。
4、类型安全的属性注入
当我们类中的属性过多时,采用上面的方式注入属性,工作量就会很大。在spring boot中引入了类型安全的属性注入,通过使用@ConfigurationProperties注解可以安全快速的将属性注入
@Component @PropertySource("classpath:book.properties") @ConfigurationProperties(prefix = "book") public class Book { private Long id; private String name; private String author; //省略getter/setter }
通过 @ConfigurationProperties(prefix = “book”) 注解,并且配置了属性的前缀,此时会自动将 Spring 容器中对应的数据注入到对象对应的属性中,就不用通过 @Value 注解挨个注入了,减少工作量并且避免出错。
二、application.yaml配置文件
application.yaml配置文件大部分都跟properties配置文件类似,只不过application.yaml现在不支持@PropertySource
除此以外,yaml配置文件也可以支持数组注入,如在application.yaml配置文件中:
my: servers: - dev.example.com - another.example.com
这段数据也可以绑定到bean当中,除了基本类型的数组之外,也支持对象数组的注入
redis: redisConfigs: - host: 192.168.66.128 port: 6379 - host: 192.168.66.129 port: 6380
三、profile问题
在日常开发过程中,我们会有生产环境和测试环境,而在这两种环境下,配置文件的配置是不同,那么我们要频繁的修改application.properties文件,那么将会非常的复杂。在spring boot中可以使用profile来解决这个问题。
可以通过application-{profile}.properties来命名相应环境下的配置文件,如生产环境可以将配置文件命名为:application-dev.properties,而测试环境则是application-test.properties。
在项目启动的过程默认是加载application.properties文件,那么我们通过在文件中加入spring.profiles.active=dev,就可以切换至生产环境下的配置文件,如果是测试环境,就改为test。