第五章 使用配置属性
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打印)
<configuration debug="false">
<!-- 应用名称 -->
<property name="APP_NAME" value="logTest" />
<!--定义日志文件的存储地址 勿在 LogBack 的配置中使用相对路径-->
<property name="LOG_HOME" value="${log.dir:-logs}/${APP_NAME}" />
<!-- 控制台输出 -->
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符-->
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg %n</pattern>
</encoder>
</appender>
<!-- 按照每天生成日志文件 -->
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<!--日志文件输出的文件名-->
<FileNamePattern>${LOG_HOME}/runtime.%d{yyyy-MM-dd}.%i.log</FileNamePattern>
<!-- each file should be at most 5MB, keep 30 days worth of history, but at most 100MB -->
<maxFileSize>5MB</maxFileSize>
<!--日志文件保留天数-->
<MaxHistory>30</MaxHistory>
<!--用来指定日志文件的上限大小,那么到了这个值,就会删除旧的日志-->
<totalSizeCap>100MB</totalSizeCap>
</rollingPolicy>
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符-->
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
</encoder>
</appender>
<!-- 1. 输出SQL 到控制台和文件-->
<logger name="org.hibernate.SQL" additivity="false" >
<level value="DEBUG" />
<appender-ref ref="FILE" />
<appender-ref ref="STDOUT" />
</logger>
<!-- 2. 输出SQL 的参数到控制台和文件-->
<logger name="org.hibernate.type.descriptor.sql.BasicBinder" additivity="false" level="TRACE" >
<level value="TRACE" />
<appender-ref ref="FILE" />
<appender-ref ref="STDOUT" />
</logger>
<root level="info">
<appender-ref ref="STDOUT" />
<appender-ref ref="FILE" />
</root>
</configuration>
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可以与属性源协同使用,从而激活不同的配置