Configuration Properties
调整自动配置
Environment abstraction
对于任何可配置属性来说,Spring的Enviroment abstraction就是一个一站式的仓库。它抽象出各种属性源以供bean使用。Spring从以下几个属性源中抽取属性:
- JVM system propterties
- 操作系统环境变量
- 命令行参数
- 应用的属性配置文件
Spring environment将这些属性整合起来放入一个单独的属性源中,这个源中的属性可以被注入到bean中。
配置DataSource
spring:
datasource:
url: jdbc:mysql://localhost/tacocloud
username: tacodb
password: tacopwd
driver-class-name: com.mysql.jdbc.Driver #一般情况下Spring会通过url自动识别driverclass
schema: # 默认值为schema.sql
- order-schema.sql
- ingredient-schema.sql
data: ingredients.sql #默认值为data.sql
jndi-name: java:/comp/env/jdbc/tacoCloudDS #如果配置了jndi,其他的数据源配置都会被忽略
配置被嵌入的服务
我们使用server.port
来配置应用的监听端口。若我们将server.port
的值设为0,那么应用不会监听端口0,而是随机的监听一个可用端口。当我们对组件进行并发测试时,使用随机端口就能避免同硬编码指定端口的组件测试发生冲突。同时一些微服务也不需要指定端口,因为我们会在服务注册机上查找这些服务。
开启HTTPS
1.使用JDK的keytool
命令行生成keystore:
$ keytool -keystore mykeys.jks -genkey -alias tomcat -keyalg RSA
如下图所示,创建keystore的过程中会被问几个问题,同时会要求创建秘钥库口令及秘钥口令,这两个密码要记住,在应用中需要设置。mykeys.jks会在用户的家目录下生成。
2. 配置ssl
server:
port:8443
ssl:
key-store: file:C:\Users\administrator\mykeys.jks #从文件系统中加载keystore文件,如果文件在应用的JAR文件中,则使用classpath:
key-store-password: 123456
key-password: 123456
配置日志
Spring Boot 默认使用Logback来记录日志。我们可以在classpath的根目录下(src/main/resources)创建一个名为logback.xml
的文件来配置logback。
对日志最常见的配置就是改变日志级别或者将日志输出到指定文件中,我们不用创建logback.xml
也能配置:
logging:
file:
#path和name只有一个会生效
path: /var/logs/ #会在/var/logs/目录下生成spring.log
name: /var/logs/TacoCloud.log
level:
root: WARN
org: :
springframework:
security: DEBUG
特殊的属性值
在配置属性值的时候,我们不仅可以直接指定字符串或者数字,我们还可以引用其它属性的值:
spring:
application:
name: TacoCloud
greeting:
welcome: ${spring.application.name}
使用${}
表达式就可以引用其它属性的值。
创建自己的配置属性
在任何的bean上使用@ConfigurationProperties
注解,使得该bean的属性可以从Spring environment中注入。
我们在application.yml
中定义:
taco:
order:
pageSize: 20
在OrderController
这个bean上做一下修改:
- 增加
@ConfigurationProperties(prefix="taco.order")
注解 - 为需要注解的属性添加setter方法。(必须)
@Controller
@RequestMapping("/orders")
@SessionAttributes("order")
@ConfigurationProperties(prefix="taco.order") //定义了属性前缀
public class OrderController{
private int pageSize; //配置文件中taco.order.pageSize属性值将会被注入
public void setPageSize(int pageSize) {
this.pageSize = pageSize;
}
@GetMapping
public String ordersForUser(@AuthenticationPrincipal User user, Model model){
}
}
创建Configuration property holder
@Component
@ConfigurationProperties(prefix = "taco.order")
@Data
public class OrderProps {
private int pageSize = 20;
}
我们将属性使用单独的类来管理,并将这个类注册为bean,那么OrderController
可以通过注入OrderProps
来获取pageSize。这样做使得Controller比较简洁,也提高了pageSize属性的重用性,同时我们可以在OrderProps
类中做许多专注于属性的工作,如属性值的约束校验等。
Profiles
使用application-{profile name}
命名格式创建.properties
或.yml
文件,从而定义不同profile的属性。也可以在YML配置文件中,使用---
和spring:profiles: {profile name}
来隔离两个不同profile的配置。
logging:
level:
tacos: DEBUG
---
spring:
profiles: prod
datasource:
url: jdbc:mysql://localhost/tacoCloud
username: tacouser
password: tacopassword
上面的配置被分成了两个部分,第二个部分是名为"prod"的profile,只有当"prod"被激活时,spring:profiles:prod
后面的配置才会生效。而第一部分没有指明profile,那么这部分就是公共部分,无论哪个profile被激活,这部分配置是有效的。
激活profiles
- 命令行
$ java -jar taco-cloud.jar --spring.profiles.active=dev
- 系统变量
$ export SPRING_PROFILES_ACTIVE=dev
任何部署在该机器上的应用的dev profile都将被激活
3. java系统参数
$ java -jar -Dspring.profiles.active=dev taco-cloud.jar
- 配置文件
spring:
profiles:
active: dev
以上4中配置方式优先级同其序号。同时存在多个激活配置,那么优先级最好的被采纳。
推荐使用命令行进行配置,灵活度最高。不推荐使用配置文件。
激活多个profiles
可以使用都好将各个profile隔开以达到激活多个profile,如:
$ java -jar taco-cloud.jar --spring.profiles.active=dev,audit,ha
或者:
spring:
profiles:
active:
- dev
- audit
- ha
有选择的创建bean
@Profile
注解将帮助我们有选择的创建bean
//只在dev被激活时创建
@Profile("dev")
@Controller
public class devController{}
//只在dev或者audit被激活时创建
@Profile({"dev","audit"})
@Controller
public class devController{}
//只要不是audit环境,就被创建
@Profile("!audit")
@Controller
public class devController{}
//只要不是audit或者qa环境,就被创建
@Profile({"!audit","!qa"})
@Controller
public class devController{}
我们还可以在配置类上进行这样的注解
//只有在dev环境下,该配置类中的配置才会生效
@Profile("dev")
@Configuration
public devConfiguration{
@Bean
....
}