《Spring in Action》第5章-Configuration Properties

Configuration Properties

调整自动配置

Environment abstraction

对于任何可配置属性来说,Spring的Enviroment abstraction就是一个一站式的仓库。它抽象出各种属性源以供bean使用。Spring从以下几个属性源中抽取属性:

  1. JVM system propterties
  2. 操作系统环境变量
  3. 命令行参数
  4. 应用的属性配置文件
    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上做一下修改:

  1. 增加@ConfigurationProperties(prefix="taco.order")注解
  2. 为需要注解的属性添加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

  1. 命令行
$ java -jar taco-cloud.jar --spring.profiles.active=dev
  1. 系统变量
$ export SPRING_PROFILES_ACTIVE=dev

任何部署在该机器上的应用的dev profile都将被激活
3. java系统参数

$ java -jar -Dspring.profiles.active=dev taco-cloud.jar
  1. 配置文件
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
	....
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值