项目源码位置 https://github.com/AganRun/SpringInAction
第五章 使用配置属性
5.1 细粒度的自动配置
带有@Bean注解的方法一般会同时初始化Bean并立即为它的属性设置值。
Spring获取属性源的方式有:
举个栗子:
想要把端口设置为8080
- 在application.properties/yml中加入server.port属性
- 运行jar包时命令行参数
$ java -jar tacocloud.jar --server.port=8080
- 声明环境变量
export SERVER_PORT=8080
配置数据源
spring:
datasource:
url: jdbc:postgresql://localhost:5432/spring-action-jpa
username: postgres
password: 123456
driver-class-name: org.postgresql.Driver
如果存在连接池,会自动使用配置的数据源
如果想让程序启动时执行数据库SQL,可以配置
spring.datasource.schema
和spring.datasourcce.data
属性
spring:
datasource:
schema:
- order-schema.sql
配置嵌入式服务器
- 端口号
如果server.port属性被设置为了0,服务器选择任选一个可用的端口,保证并发运行的测试不会与硬编码的端口号冲突。 - HTTPS
可以使用JDK的keytool命令行工具生成keystore
keytool -keystore mykeys.jks -genkey -alias tomcat -keyalg RSA
过程中出了密码,其余无关紧要,比如使用letmein作为密码,则在配置文件中使用如配置
server:
ssl:
key-store: mykeys.jks
key-store-password: letmain
key-password: letmain
配置日志
默认情况下,SpringBoot通过Logback配置日志,日志会以INFO级别写入控制台。
可以加入logback的xml文件后,在配置文件中声明
以下是logback的内容(控制台和文件同时打印+JPA的SQL打印)
%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg %n
${LOG_HOME}/runtime.%d{yyyy-MM-dd}.%i.log
5MB
30
100MB
%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n
Spring配置文件加入如下配置
spring:
# 打印SQL
show-sql: true
# 配置日志
logging:
config: classpath:logback.xml
如果只是简易版,可以直接在配置文件中配置
logging:
path: /var/logs/
file: TacoCloud.log
level:
root: WARN
将日志写入/var/logs/TacoCloud.log文件,默认日志文件达到10MB轮换。
5.2 自定义配置属性
需求:用户订单列表接口的分页大小,由配置文件给出
- 先在配置文件中加入pageSize配置
taco: orders: pageSize: 20
- 加入@ConfigurationProperties
一般,特定的配置细节会从控制器和其他应用程序中抽离出来//@ConfigurationProperties(prefix = "taco.orders") public class OrderController { private int pageSize = 20; public void setPageSize(int pageSize) { this.pageSize = pageSize; }
- 通用的配置类,提升复用性
其他类注入OrderProperties即可@Component @Data @ConfigurationProperties(prefix = "taco.orders") public class OrderProperties { private int pageSize = 20; }
声明配置属性元数据
在IDEA等编辑器中,发现自定义的配置属性会被提示unknown property 'taco'
消除警告的方法就是创建自定义配置属性的元数据。在META-INF下创建一个名为additional-spring-configuration-metadata.json的文件
这个操作可以通过编辑器快捷操作完成。
{
"properties": [
{
"name": "taco.orders.pageSize",
"type": "java.lang.String",
"description": "Description for taco.orders.pageSize."
}
]
}
5.3 使用Profile进行配置
需求:应用部署到不同的环境上,通常配置的细节有不同。比如数据库、日志级别
可以使用SpringProfile。profile是一种条件化的配置,可以觉得运行时哪些profile处于激活状态。可以使用或忽略不同的bean、配置类和配置属性。
- 定义特定的profile属性
- 可以创建不同的配置文件,遵循application-{profile}.properties/yml的方式
例如:application-dev.yml、application-prod.yml - 也可以定义相关属性。(仅适用于yaml配置)
logging: # 没有配置profile属性代表通用 level: tacos: DEBUG --- # 通过三个中划线分割不同的profile spring: profile: prod # 代表这是prod环境 logging: level: tacos: WARN
- 激活profile
- 配置application.yml
但是这个可能是最糟糕的方式spring: profiles: active: - prod
- 环境变量的方式(推荐)
export SPRING_PROFILES_ACTIVE=prod
- 命令行的方式
java jar -taco-cloud.jar --spring.profiles.active=prod
可以同时激活多个profile,配置文件可以另起一行,命令行用逗号分隔
5.3.3 使用Profile条件化创建Bean
可以通过@Profile注解将某些Bean设置到指定的profile。这是几种写法。
@Profile("dev")
@Profile({"dev", "qa"})
@Profile("!prod")
第五章总结
- 可添加@ConfigurationProperties,从多个属性源获取配置
- 配置属性来源有命令行参数、环境变量、JVM系统属性、属性文件、YAML文件等
- 配置属性可以覆盖自动配置的设置,例如数据源URL
- Profile可以与属性源协同使用,从而激活不同的配置