Spring Boot的配置文件

1.使用Spring Initializer快速创建Spring Boot项目

1、IDEA:使用 Spring Initializer快速创建项目

IDE都支持使用Spring的项目创建向导快速创建一个Spring Boot项目;

选择我们需要的模块;向导会联网创建Spring Boot项目;

新建父工程:

Spring Boot的配置文件_第1张图片

 Spring Boot的配置文件_第2张图片

Spring Boot的配置文件_第3张图片 Spring Boot的配置文件_第4张图片

 

Spring Boot的配置文件_第5张图片 新建子模块:

Spring Boot的配置文件_第6张图片

Spring Boot的配置文件_第7张图片 

 Spring Boot的配置文件_第8张图片

后续操作同上 

 子模块的pom文件中的parent要修改为我们之前新建的父工程Spring Boot的配置文件_第9张图片

 Spring Boot的配置文件_第10张图片

继承关系-springboot maven项目 

1.使用spring initializer 新建一个父 maven    选择POM

2.使用spring initializer 新建一个子 maven    选择maven project

修改子项目中继承方式

springboot_initializer -->springboot_parent-->spring-boot-starter-parent

默认生成的Spring Boot项目;

Spring Boot的配置文件_第11张图片

 

  • 主程序已经生成好了,我们只需要我们自己的逻辑
  • resources文件夹中目录结构
    • static:保存所有的静态资源; js css images;
    • templates:保存所有的模板页面;(Spring Boot默认jar包使用嵌入式的Tomcat,默认不支持JSP页面);可以使用模板引擎(freemarker、thymeleaf)
    • application.properties:Spring Boot应用的配置文件;可以修改一些默认设置;

2.自定义SpringApplication

如果SpringApplication默认设置不符合您的喜好,则可以创建一个本地实例并对其进行自定义。例如,要关闭横幅,您可以编写:

public static void main(String[] args) {
    SpringApplication app = new SpringApplication(MySpringConfiguration.class);
    app.setBannerMode(Banner.Mode.OFF);
    app.run(args);
}

通过构造者模式流式构造SpringApplication:

new SpringApplicationBuilder()
        .bannerMode(Banner.Mode.OFF)
        .run(args);

官网关于SpringApplication的使用

3.配置文件的使用

3.1 配置文件介绍

SpringBoot使用一个全局的配置文件 核心配置文件,配置文件名在约定的情况下 名字是固定的

配置文件的作用:修改SpringBoot自动配置的默认值;SpringBoot在底层都给我们自动配置好;

•application.properties

•application.yml

•application.yaml

YAML(YAML Ain't Markup Language)

YAML A Markup Language:是一个标记语言

YAML isn't Markup Language:不是一个标记语言;

两种配置文件的格式

在springboot框架中,resource文件夹里可以存放配置的文件有两种:properties和yml。

1、application.properties的用法:扁平的k/v格式。

server.port=8081
server.servlet.context-path=/springboot

2、application.yml的用法:树型结构。

server:
  port: 8088
  servlet:
    context-path: /springboot

两种前者是properties,而后者是yml的,建议使用后者,因为它的可读性更强。 可以看到要转换成YML我们只需把properies里按.去拆分即可。

3.2 yml基本语法

k:(空格)v:表示一对键值对(空格必须有);

空格的缩进来控制层级关系;只要是左对齐的一列数据,都是同一个层级的

属性和值也是大小写敏感;

如果有特殊字符% & 记得用单引号(‘)包起来

3.3 配置文件的加载顺序 :


  **/application*.yml
  **/application*.yaml
  **/application*.properties

如果同时存在不同后缀的文件按照这个顺序加载主配置文件;互补配置;

Spring Boot的配置文件_第12张图片

 

后续实测后发现各版本不一样优先级都不一样,比较混乱:

2.3.x

官方没有具体说明,实测以properties为准

2.4.0

所以这个版本我们看到的yml优先

Spring Boot的配置文件_第13张图片

2.4.4

Spring Boot的配置文件_第14张图片

 2.5.4

Spring Boot的配置文件_第15张图片

 

总结: 官网最后给出了说明建议整个应用程序使用一种格式,并且既然每个版本的优先级都有区别,我们就不要纠结这个后缀文件的优先级了。

3.4 外部约定配置文件加载顺序:

springboot 启动还会扫描以下位置的application.properties或者application.yml文件作为Spring boot的默认配置文件

Spring Boot的配置文件_第16张图片

 

低↓

1.classpath根目录下的

Spring Boot的配置文件_第17张图片

 

2.classpath根config/

Spring Boot的配置文件_第18张图片

 

3.项目根目录

Spring Boot的配置文件_第19张图片

如果当前项目是继承/耦合 关系maven项目的话,项目根目录=父maven项目的根目录

4.项目根目录/config

Spring Boot的配置文件_第20张图片

5.直接子目录/config

java -jar configuration_file-0.0.1-SNAPSHOT.jar --spring.config.location=D:\config/

高↓

优先级由底到高,高优先级的配置会覆盖低优先级的配置;互补配置;

官网:

Spring Boot的配置文件_第21张图片

optional:classpath:/
optional:classpath:/config/
optional:file:./
optional:file:./config/*/
optional:file:./config/
optional:classpath:custom-config/      --spring.config.location
optional:file:./custom-config/         --spring.config.location

 

3.5 Profile文件的加载

Profile的意思是配置,对于应用程序来说,不同的环境需要不同的配置。

SpringBoot框架提供了多profile的管理功能,我们可以使用profile功能来区分不同环境的配置。

1、多Profile文件

1.Spring官方给出的语法规则是application-{profile}.properties(.yaml/.yml)。

2.如果需要创建自定义的的properties文件时,可以用application-xxx.properties的命名方式, 根据实际情况,我创建了一个开发环境下使用的properties文件和一个生产环境下使用的properties文件,其中只对端口进行了配置,如下图所示:

a.开发环境如下:

Spring Boot的配置文件_第22张图片

b.生产环境如下:

Spring Boot的配置文件_第23张图片

3.若我们需要在两种环境下进行切换,只需要在application.properties中加入如下内容即可。

Spring Boot的配置文件_第24张图片

 

先按照位置来读取优先级, 在同一位置下profile优先级最高, 如果没有指定profile, 先yml--yaml--properties

bean也可以使用@Profile("dev")来区分环境

2、激活指定profile

  1. 在配置文件中指定 spring.profiles.active=dev
  2. 命令行:
java -jar configuration_file-0.0.1-SNAPSHOT.jar --spring.profiles.active=dev;
  • 还可以通过spring.config.location来改变默认的配置文件

使用spring.config.location 指定的配置文件, 是不会进行互补。

java -jar configuration_file-0.0.1-SNAPSHOT.jar --spring.config.location=D:/application.properties
  • 还可以通过spring.config.name来改变默认的配置文件
  • 是不会进行互补。
java -jar configuration_file-0.0.1-SNAPSHOT.jar --spring.config.name=application-prod

所有配置文件按以下顺序考虑: 优先级从低到高

  1. 打包在jar中配置文件
  2. 打包在jar中profile
  3. 打包的jar之外的配置文件
  4. 打包的jar之外的profile
java -jar configuration_file-0.0.1-SNAPSHOT.jar

jar包之外的配置文件            yml-->yaml-->properties
optional:classpath:/config/  yml-->yaml-->properties
optional:classpath:/         yml-->yaml-->properties
java -jar configuration_file-0.0.1-SNAPSHOT.jar --spring.profiles.active=dev

jar包之外的配置文件  ./config/         profile-dev -->  yml-->yaml-->properties
jar包之外的配置文件 ./config/*/          profile-dev -->  yml-->yaml-->properties
jar包之外的配置文件 ./          profile-dev -->  yml-->yaml-->properties
optional:classpath:/config/ profile-dev --> yml-->yaml-->properties
optional:classpath:/        profile-dev --> yml-->yaml-->properties
java -jar configuration_file-0.0.1-SNAPSHOT.jar --spring.config.location=D:/application.properties

优先级最大, 因为指定了具体的配置文件。 所以不会和默认的约定配置文件进行互补

Spring Boot的配置文件_第25张图片

3.6、配置文件读取方式 低---高 

Spring Boot的配置文件_第26张图片

1、@PropertySource你的@Configuration类的注释。请注意,Environment在刷新应用程序上下文之前,不会将此类属性源添加到。现在配置某些属性(例如在刷新开始之前读取的logging.*和)为时已晚spring.main.*。

@PropertySource("classpath:appSource.properties")

        会和约定的配置文件形成互补

        一定要指定.properties配置

2、默认属性(由 setting 指定SpringApplication.setDefaultProperties)。

        会和约定的配置文件形成互补

public static void main(String[] args) throws IOException {
    SpringApplication springApplication = new SpringApplication(ExternConfigurationApplication.class);

    // 创建Properties
    Properties properties = new Properties();
    // 通过当前类的ClassLoader
    InputStream is= ExternConfigurationApplication.class.getClassLoader()
            .getResourceAsStream("app.properties");
    // 将输入流读取成properties
    properties.load(is);

    springApplication.setDefaultProperties(properties);
    springApplication.run(args);
}

3、配置数据(如application.properties文件)

        约定配置文件

4、操作系统环境变量。

  • 会使约定配置文件失效
  • 1.idea

Spring Boot的配置文件_第27张图片

 

  • 2.windows
set spring.config.location=D:\config/
java -jar 03_extern_configuration-0.0.1-SNAPSHOT.jar

5、Java 系统属性 ( System.getProperties())。

会使约定配置文件失效

idea

Spring Boot的配置文件_第28张图片

命令行java属性

java -Dspring.config.location=D:\config\application-java.properti
es -jar 03_extern_configuration-0.0.1-SNAPSHOT.jar

6、JNDI 属性来自java:comp/env.

7、ServletContext 初始化参数。

ServletContext 的配置标签需要写到 web-app (根标签)中 ,具体如下:
		
			spring.config.location
			xxx.properties
		

8、ServletConfig 初始化参数。

ServletConfig 的配置标签需要写到 Servlet 标签中,标签如下:

			spring.config.location
			xxx.properties
		

9、来自SPRING_APPLICATION_JSON(嵌入在环境变量或系统属性中的内联 JSON)的属性。

10、命令行参数。

会使约定配置文件失效

java -jar configuration_file-0.0.1-SNAPSHOT.jar --spring.config.location=D:/application.properties

11、properties属性在您的测试中。可用于测试应用程序的特定部分@SpringBootTest的测试注释。

12、@TestPropertySource 测试中的注释。

用在单元测试上的

@TestPropertySource("classpath:appSource.properties")

13、$HOME/.config/spring-boot当 devtools 处于活动状态时,目录中的Devtools 全局设置属性。

4、配置文件值注入

将YAML映射到属性

  • 字面量:普通的值(数字,字符串,布尔)

k: v:字面直接来写;

字符串默认不用加上单引号或者双引号;

"":双引号;不会转义字符串里面的特殊字符;特殊字符会作为本身想表示的意思

name: "zhangsan \n lisi":输出;zhangsan 换行 lisi

'':单引号;会转义特殊字符,特殊字符最终只是一个普通的字符串数据

name: ‘zhangsan \n lisi’:输出;zhangsan \n lisi

  • 对象、Map(属性和值)(键值对):

k: v:在下一行来写对象的属性和值的关系;注意缩进

对象还是k: v的方式

friends:
    lastName: zhangsan
    age: 20

行内写法:

friends: {lastName: zhangsan,age: 18}
  • 数组(List、Set):

用- 值表示数组中的一个元素

pets:
    ‐ cat
    ‐ dog
    ‐ pig

行内写法

pets: [cat,dog,pig]

配置文件

person:
    lastName: hello
    age: 18
    boss: false
    birth: 2017/12/12
    maps: {k1: v1,k2: 12}
    lists:
        ‐ lisi
        ‐ zhaoliu
    dog:
        name: 小狗
        age: 12

javabean

可以通过@value('${}')一个一个注入

/**
* 将配置文件中配置的每一个属性的值,映射到这个组件中
* @ConfigurationProperties:告诉SpringBoot将本类中的所有属性和配置文件中相关的配置进行绑定;
* prefix = "person":配置文件中哪个下面的所有属性进行一一映射
*
* 只有这个组件是容器中的组件,才能容器提供的@ConfigurationProperties功能;
*
*/
@Component
@ConfigurationProperties(prefix = "person")
public class Person {
private String lastName;
private Integer age;
private Boolean boss;
private Date birth;
private Map maps;
private List lists;
private Dog dog; 
  

我们可以导入配置文件处理器,以后编写配置就有提示了


        
            org.springframework.boot
            spring-boot-configuration-processor
            true
        

Spring Boot的配置文件_第29张图片

 

松散绑定:

user:
  USERNAME: fztx
user:
  userName: fztx
 user:
  user_name: fztx
user:
  user-name: fztx
  
以上4种命名是可以自动绑定bean属性  User.username

@Value获取值和@ConfigurationProperties获取值比较

@ConfigurationProperties

@Value

绑定

批量注入配置文件中的属性

一个个指定

松散绑定(松散语法)

支持

支持有限

SpEL

不支持

支持

自动提示

支持

不支持

配置文件yml还是properties他们都能获取到值;

使用场景

如果说,我们只是在某个业务逻辑中需要获取一下配置文件中的某项值,使用@Value;

如果说,我们专门编写了一个javaBean来和配置文件进行映射,我们就直接使用@ConfigurationProperties;

配置文件注入值数据校验

Spring Boot的配置文件_第30张图片

@Component
@ConfigurationProperties(prefix = "person")
@Validated
public class Person {
/**
* 
* 
* 
*/
//lastName必须是邮箱格式
@Email
//@Value("${person.last‐name}")
private String lastName;
//@Value("#{11*2}")
private Integer age;
//@Value("true")
private Boolean boss;
private Date birth;
private Map maps;
private List lists;
private Dog dog; 
  

@PropertySource:加载指定的配置文件

/**
* 将配置文件中配置的每一个属性的值,映射到这个组件中
* @ConfigurationProperties:告诉SpringBoot将本类中的所有属性和配置文件中相关的配置进行绑定;
* prefix = "person":配置文件中哪个下面的所有属性进行一一映射
*
* 只有这个组件是容器中的组件,才能容器提供的@ConfigurationProperties功能;
* @ConfigurationProperties(prefix = "person")默认从全局配置文件中获取值;
*
*/
@PropertySource(value = {"classpath:person.properties"})
@Component
@ConfigurationProperties(prefix = "person")
//@Validated
public class Person {
/**
* 
* 
* 
*/
//lastName必须是邮箱格式
// @Email
//@Value("${person.last‐name}")
private String lastName;
//@Value("#{11*2}")
private Integer age;
//@Value("true")
private Boolean boss;

@ImportResource:导入Spring的配置文件,让配置文件里面的内容生效;

Spring Boot里面没有Spring的配置文件,我们自己编写的配置文件,也不能自动识别;

想让Spring的配置文件生效,加载进来;@ImportResource标注在一个配置类上

@ImportResource(locations = {"classpath:beans.xml"})
导入Spring的配置文件让其生效

配置文件占位符

1、随机数

${random.value}、${random.int}、${random.long}
${random.int(10)}、${random.int[1024,65536]}

2、占位符获取之前配置的值,如果没有可以是用:指定默认值

person.last‐name=张三${random.uuid}
person.age=${random.int}
person.dog.name=${person.hello:hello}_dog

你可能感兴趣的:(SpringBoot,spring,spring,boot)