第01章 Spring-Boot 应用文件application配置

第01章 Spring-Boot 应用文件application配置

前言

  • 为什么要使用 Spring-Boot?

    可参考官方文档。

  • 什么是 Spring-Boot?

    可参考官方文档说明。

  • 官方地址

    https://spring.io/projects/spring-boot

目标

  • 完成 Jenkins 在 Docker 中的安装与配置。
  • 安装在 Docker 中的 Jenkins 能正常对外提供服务。
  • 在外部开发环境中能正常访问和使用 Jenkins 持续集成服务。

环境

  • **VMware:**VMware Workstation 14 Pro

  • **Linux:**CentOS7.4

  • **Docker:**18.06.0-ce, build 0ffa825

    扫描二维码关注公众号,回复: 14761115 查看本文章
  • **Jenkins:**Jenkins2.121.1

  • **JDK:**jdk1.8.0_172

  • **Spring-Boot:**2.0.4

  • **Eclipse:**Eclipse Neon.3 (4.6.3)

  • spring-tool-suite:

    Version: 3.8.4.RELEASE
    Build Id: 201703310825
    Platform: Eclipse Neon.3 (4.6.3)

  • **Maven:**3.5.0

随机值配置

xxx.secret=${random.value}
xxx.number=${random.int}
xxx.bignumber=${random.long}
xxx.number.less.than.ten=${random.int(10)}
xxx.number.in.range=${random.int[1024,65536]} 

在应用代码中可以使用注解读取:@Value(value = "${xxx.secret}")

注:出现黄点提示,是要提示配置元数据,可以不配置

属性占位符

当application.properties里的值被使用时,它们会被存在的Environment过滤,所以你能够引用先前定义的值(比如,系统属性)。

xxx.name=www.google.com
xxx.desc=${xxx.name} is a domain name

应用配置文件加载顺序

Application配置文件,加载按优先级排序,位置高的将覆盖位置低的

  1. 当前目录下的一个/config子目录

  2. 当前目录

  3. 一个classpath下的/config包

  4. classpath根路径(root)

这个列表是按优先级排序的(列表中位置高的将覆盖位置低的)

应用配置文件键值对覆盖

应用配置文件的加载顺序,相同的键值对会对值进行覆盖,后面的会覆盖前面的。

  1. @TestPropertySource 注解
  2. 命令行参数
  3. Java系统属性(System.getProperties())
  4. 操作系统环境变量
  5. 只有在random.*里包含的属性会产生一个RandomValuePropertySource
  6. 在打包的jar外的应用程序配置文件(application.properties,包含YAML和profile变量)
  7. 在打包的jar内的应用程序配置文件(application.properties,包含YAML和profile变量)
  8. 在@Configuration类上的@PropertySource注解
  9. 默认属性(使用SpringApplication.setDefaultProperties指定)

常用配置

应用端口配置

server.port=8090

时间格式化配置

spring: 
  jackson.time-zone: Asia/Shanghai
  jackson.date-format: yyyy-MM-dd HH:mm:ss

时区设置

spring: 
  jackson.time-zone: Asia/Shanghai

注意:使用YAML代替Properties写法,冒号后面加个空格

多环境配置

多环境配置的好处

1.不同环境配置可以配置不同的参数

2.便于部署,提高效率,减少出错

Properties 多环境配置

1.配置激活选项

spring.profiles.active=dev

2.添加其他配置文件

application-dev.properties
application-test.properties
application-prod.properties
application.properties

YAML多环境配置

1.配置激活选项

spring:
  profiles:
    active: dev

2.在配置文件添加三个英文状态下的短横线即可区分

---
spring:
  profiles: dev

两种配置方式的比较

  1. Properties配置多环境,需要添加多个配置文件,YAML只需要一个配件文件

    2.书写格式的差异,yaml相对比较简洁,优雅

  2. YAML的缺点:不能通过@PropertySource注解加载。如果需要使用@PropertySource注解的方式加载值,那就要使用properties文件。

如何使用

java -jar myapp.jar --spring.profiles.active=dev

配置高级篇

一、配置方式

1、Spring Boot 应用的配置内容都可以统一集中在src/main/resource/application.properties文件中进行配置。

根据我们引入的不同Starter模块,可以在这里定义容器端口号、数据库连接ixnxi、日志级别等各种配置信息。

2、支持现在被广泛推荐使用的YAML文件。

YAML(英语发音类似camel)是一个可读性高,用来表达资料序列的格式。

全称是:YAML Ain’t a Markup Language,不是一种标记语言。

YAML的意思其实是:Yet Another Markup Language(仍是一种标记语言),但为了强调这种语言以数据作为中心,而不是以标记语言为重点,而用反向缩略语重新命名。

YMAL设计参考了多种语言,包括C语言、python、perl,并从XML、电子邮件的数据格式(RFC 2822)中获得灵感。

YMAL特点:

YMAL的语法和其他高阶语言类似,并且可以简单地表达清单、散列表、标量等形态。

使用空白符号缩排和大量依赖外观的特色,特别适合来表达或编辑数据结构、各种设定文档、文件大纲。

比较适合表达阶层式的数据结构,也可以用精致的语法表示关联性(relational model)的资料。

YMAL使用空白符号和分行来分割资料,使得它特别适合用 grep/python/perl/ruby 操作。

巧妙避开各种封闭符号,如引号、各种括号等,这些符号在巢状结构时会变得复杂而难以辨认。

——维基百科

YAML 采用的配置格式不像properties的配置那样以单纯的键值对形式来表示,而是以类似大纲的缩进形式来表示。

YMAL还可以在一个单个文件中通过使用 spring.profies 属性来定义多个不同的环境变量。比如默认、指定等形式。

server:

port: 8881

spring:

profiles: test

server:

    port: 8882

\---

spring:

    profiles: prod

server:

    port: 8883

注意:YMAL目前还有一些不足,它无法通过@PropertySource注解来加载配置。但是,YAML将属性加载到内存中保存的时候是有序的,所以当配置文件中的信息需要具备顺序含义的时候,YAML的配置方式比起properties配置文件更有优势。

二、如何实现多环境配置

在Spring Boot中,多环境配置的文件名需要满足application-{profile}.properties的格式,其中{profile}对应你的环境标识,比如:

application-dev.properties:开发环境

application-test.properties:测试环境

application-prod.properties:生产环境

至于具体哪个配置文件会被加载,需要在application.properties 文件中通过 spring.profiles.active 属性来设置。

可在启动时动态修改这个配置属性值:

java -jar xxx.jar --spring.profiles.active=prod

总结多环境的配置思路:

1、在application.properties 中配置通用内容,并设置 spring.profiles.active=dev,以开发环境为默认配置

2、在application-{profile}.properties 中配置各个环境布偶她能更多内容。

3、通过命令行方式去激活不同环境的配置。

三、配置信息的加载顺序

为了能够更加合理的重写各属性的值,Spring Boot 使用了下面这种较为特别的属性加载顺序:

1、在命令行中传入的参数。

2、SPRING_APPLICATION_JSON 中的属性。SPRING_APPLICATION_JSON是以JSON格式配置在系统环境变量中的内容。

3、java:com/env 中的 JNDI 属性。

4、Java的系统属性,可以通过 System.getProperties() 获得的内容。

5、操作系统的环境变量。

6、通过 random.* 配置的随机属性。

7、位于当前应用 jar包之外,针对不同{profile}环境的配置文件内容,例如application-{profile}.properties或是YMAL定义的配置文件。

8、位于当前应用jar包之内,针对不同{profile}环境的配置文件内容,例如application-{profile}.properties或是YMAL定义的配置文件。

9、位于当前应用 jar包之外的application.properties和YMAL配置内容。

10、位于当前应用 jar包之内的application.properties和YMAL配置内容。

11、在@Configuration注解修改的类中,通过@PropertySource注解定义的属性。

12、应用默认属性,使用SpringApplication.setDefaultProperties定义的内容。

优先级按上面的顺序由高到低,数字越小优先级越高。

可以看到,其中第7和第9项都是从应用jar包之外读取配置文件,所以,实现外部化配置的原理就是从此切入,为其制定外部配置文件的加载位置来取代jar包之内的配置内容。

这样,我们的工程在配置中就变得非常干净,只需要在本地放置开发需要的配置即可,而不用关系其它环境的配置,由其对应环境的负责人去维护即可。

四、自定义参数

除了可以在 Spring Boot 的配置文件中设置各个 Starter 模块中预定义的配置属性,也可以在配置文件中定义一些我们需要的自定义属性,在 application.properties中定义:

you.name=kony

you.age=18

在应用中可以通过@Value注解来加载这些自定义的参数。

@Service

public class person{

@Value("${you.name}")

private String name;

@Value("${you.age}")

private int age;

getter...

setter...

}

@Value注解加载属性值支持两种表达式来进行配置:

1、一种是PlaceHolder方式,格式为${…}。

2、另一种是使用 SpEL 表达式(Spring Expression Language),格式为 #{…}。

五、参数引用

在application.properties 中的各个参数之间可以直接通过使用 PlaceHolder 的方式来进行引用。

you.name=kony

you.age=18

person.desc=my name is ${you.name} and age ${you.age}

六、使用随机数

在一些特殊情况下,希望有些参数每次被加载的时候不是一个固定的值,比如密码、服务端口等。在Spring Boot的属性文件中,可以通过使用¥{random}配置来阐释随机的int、long、string值。而不需要在程序中通过编码来实现这些逻辑。

配置方式有以下几种:

#随机字符串

you.name=${random.value}

#随机 int

you.age=${random.int}

#随机long

you.long=${random.long}

#10以内的随机数

you.random.scope1=${random.int(10)}

#10-20的随机数

you.random.scope2=${random.int(10,20)}

该配置可以设置应用端口场景,避免端口冲突。

七、命令行参数

如何启动Spring Boot 应用?

使用命令:java -jar,该命令除了启动应用之外,还可以在命令行中指定应用的参数,比如 java -jar xxx.jar --server.port=8080,直接以命令行的方式来设置server.port属性。

连续两个减号–就是对application.properties 中的属性值进行赋值的标识,相当于在文件中添加属性server.port=8080。

you.age=${random.int}

#随机long

you.long=${random.long}

#10以内的随机数

you.random.scope1=${random.int(10)}

#10-20的随机数

you.random.scope2=${random.int(10,20)}

该配置可以设置应用端口场景,避免端口冲突。

七、命令行参数

如何启动Spring Boot 应用?

使用命令:java -jar,该命令除了启动应用之外,还可以在命令行中指定应用的参数,比如 java -jar xxx.jar --server.port=8080,直接以命令行的方式来设置server.port属性。

连续两个减号–就是对application.properties 中的属性值进行赋值的标识,相当于在文件中添加属性server.port=8080。

通过命令行来修改属性值是 Spring Boot 非常重要的一个特性。

猜你喜欢

转载自blog.csdn.net/pointdew/article/details/108541332