1.2.3 Spring Boot配置体系
通过前面的分析,我们可以看到在开发Web应用程序时,使用Spring Boot比Spring WebMVC更为简单高效。你可能已经注意到了,以往在使用Spring WebMVC时需要指定的数据库访问、Web服务端点等一系列配置信息都不见了。我们只需要在Maven中添加一项spring-boot-starter-web依赖并实现一个Controller,就可以提供微服务架构中所推崇的RESTful风格的接口。这需要引入Spring Boot中最具创新性的一项功能,即自动配置机制。事实上,如果没有特殊的配置需求,开发人员完全可以基于Spring Boot内置的配置体系完成诸如数据库访问等功能的相关配置信息的自动集成。
在Spring Boot中,对配置信息的管理采用约定优于配置的设计理念。在这一理念下,开发人员所需要设置的配置信息数量比起使用传统Spring框架将大大减少。那么,Spring Boot是如何组织和管理这些配置信息的呢?
为了达到集中化管理的目的,Spring Boot对配置文件的命名也做了一定的约定,分别使用label和profile来指定配置信息的版本以及运行环境。其中label表示配置版本控制信息,而profile则用来指定该配置文件所对应的环境。在Spring Boot中,配置文件同时支持.properties和.yml两种文件格式,结合label和profile的概念,如下所示的配置文件命名都是常见和合法的:
/{application}.yml
/{application}-{profile}.yml
/{label}/{application}-{profile}.yml
/{application}-{profile}.properties
/{label}/{application}-{profile}.properties
Yaml这种标记语言的语法和其他高级语言类似,并且可以非常直观地表达各种列表、清单、标量等数据形态,特别适合用来表达或编辑数据结构和各种配置文件。例如,我们可以指定如代码清单1-5所示的数据源配置,这里使用了.yml文件。
代码清单1-5 基于.yml文件的数据源配置示例
spring: datasource: driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://127.0.0.1:3306/user username: root password: root
如果采用.properties配置文件,那么上述配置信息将表现为如代码清单1-6所示的形式。
代码清单1-6 基于.properties文件的数据源配置示例
spring.datasource.driverClassName=com.mysql.cj.jdbc.Driver spring.datasource.url=jdbc:mysql://127.0.0.1:3306/user spring.datasource.username=root spring.datasource.password=root
显然,类似这样的数据源通常会根据环境的不同而存在很多套配置。通常,推荐的做法是为每个不同的环境提供一个独立的配置文件。例如我们可以分别针对prod、test、uat等环境提供对应的配置文件,如下所示:
application-prod.properties
application-uat.properties
application-test.properties
application.properties
注意这里有一个没有添加任何环境后缀的application.properties配置文件。在Spring Boot中,这个application.properties就是主配置文件,是所有配置信息管理的入口。Spring Boot在获取配置信息时,会先从这个主配置文件中读取相应的配置。因此,我们可以把那些适用于所有环境的全局配置信息放在application.properties中。
另外,在Spring Boot中,我们可以在主配置文件中使用如代码清单1-7所示的配置方式来激活当前所使用的Profile。
代码清单1-7 激活当前所使用的Profile配置示例
spring.profiles.active = prod
上述配置项意味着系统在读取完application.properties中的全局配置信息之后会继续读取application-prod.yml配置文件中的配置内容。
如果我们不希望在全局配置文件中指定所需要激活的Profile,而是想把这个过程延迟到运行这个服务时,那么可以直接在java -jar命令中添加--spring.profiles.active参数,如代码清单1-8所示。
代码清单1-8 通过java -jar命令激活Profile代码示例
java -jar userservice-0.0.1-SNAPSHOT.jar --spring.profiles.active=prod
这种实现方案在通过脚本进行自动化打包和部署的场景下非常有用。
接下来,我们给出一些常见开发场景的配置示例。对于一个Web应用程序而言,最常见的配置可能就是指定服务暴露的端口地址,如代码清单1-9所示。
代码清单1-9 服务暴露的端口地址配置示例
server: port: 8080
同时,数据库访问也是Web应用程序的基本功能。因此,关于数据源的设置也是一种常见的配置场景,我们已经在前面给出了一个基本的示例。这里再以JPA为例,给出如代码清单1-10所示的一种配置方案。
代码清单1-10 数据源配置示例
spring: jpa: hibernate: ddl-auto: create show-sql: true
显然,这里使用了Hibernate作为JPA规范的实现框架,并设置了show-sql等相关属性。
最后,开发人员一般需要对日志级别和对象进行设置,代码清单1-11所示的就是一个典型的配置示例。
代码清单1-11 日志配置示例
logging.level.root=WARN logging.level.com.springboot.user=INFO
我们设置了系统的全局日志级别为WARN,而针对自定义的com.springboot.user包下的日志,则将其级别调整到INFO。