springboot基础学习springboot全局配置文件及配置文件属性值注入

blayn      2022-06-11     329

关键词:

全局配置文件

全局配置文件能够对一些默认配置值进行修改。SpringBoot 使用一个名为 application.properties 或者 application.yaml的文件作为全局配置文件,该文件会放在 src/main/resource 目录或者类路径的 /config 目录下,一般会选择 /resource。下面将讲解这两种配置文件:

(1)application.properties配置文件

使用Spring Initializr方式构建的SpringBoot项目会自动在 src/main/resource 目录下生成一个 application.properties 配置文件,SpringBoot项目启动时会自动加载 application.properties 配置文件。

我们可以在 application.properties 配置文件中定义SpringBoot项目的相关属性,包括系统属性、环境变量及命令参数等信息,也可以是自定义配置文件名称和位置,如下所示:

server.port=8081
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.config.additional-location=
spring.config.location=
spring.config.name=application

接下来,通过一个简单案例对SpringBoot项目中 application.properties 配置文件的使用进行讲解。

操作步骤:

1、先在项目的 com.hardy.springboot_demo 包下创建一个pojo包,并在该包下创建两个实体类 Pet和Person:

package com.hardy.springboot_demo.pojo;

/**
 * @Author: HardyYao
 * @Date: 2021/5/30
 */
public class Pet {

    private String type;

    private String name;

    public String getType() {
        return type;
    }

    public void setType(String type) {
        this.type = type;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @Override
    public String toString() {
        return "Pet{" +
                "type='" + type + '\'' +
                ", name='" + name + '\'' +
                '}';
    }
}
package com.hardy.springboot_demo.pojo;

/**
 * @Author: HardyYao
 * @Date: 2021/5/30
 */

import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

import java.util.Arrays;
import java.util.List;
import java.util.Map;

@Component // 用于将Person类作为Bean注入到Spring容器中
@ConfigurationProperties(prefix = "person") // 将配置文件中以person开头的属性注入到该类中
public class Person {

    private int id; // id

    private String name; // 姓名

    private List hobby; // 爱好

    private String[] family; // 家庭成员

    private Map map;

    private Pet pet; // 宠物

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public List getHobby() {
        return hobby;
    }

    public void setHobby(List hobby) {
        this.hobby = hobby;
    }

    public String[] getFamily() {
        return family;
    }

    public void setFamily(String[] family) {
        this.family = family;
    }

    public Map getMap() {
        return map;
    }

    public void setMap(Map map) {
        this.map = map;
    }

    public Pet getPet() {
        return pet;
    }

    public void setPet(Pet pet) {
        this.pet = pet;
    }

    @Override
    public String toString() {
        return "Person{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", hobby=" + hobby +
                ", family=" + Arrays.toString(family) +
                ", map=" + map +
                ", pet=" + pet +
                '}';
    }
}

@ConfigurationProperties(prefix = "person") 注解的作用是将配置文件中以person开头的属性值通过setXX()方法注入到实体类对应属性中。

@Component注解的作用是将当前注入属性值的Person类对象作为Bean组件放到Spring容器中,只有这样才能被@ConfigurationProperties注解进行赋值。

2、编写项目的 application.properties 配置文件,在该配置文件中编写需要对Person类设置的配置属性:

person.id=1
person.name=hardy
person.hobby=吃肉,看书,学习,写代码
person.family=爸爸,妈妈
person.map.k1=v1
person.map.k2=v2
person.pet.type=cat
person.pet.name=Hello Kitty

编写 application.properties 配置文件时,由于要配置为Person对象属性值是我们自己定义的,SpringBoot无法自动识别,所以不会有书写提示。在实际开发中,为了出现代码提示来提高配置效率,我们可以使用@ConfigurationProperties注解进行配置文件属性值注入,这需要在pom.xml文件中添加一个SpringBoot提供的配置器依赖:

<!-- 引入配置器依赖 -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-configuration-processor</artifactId>
    <optional>true</optional>
</dependency>

添加上述依赖后,需要重新运行项目启动类或者使用“Ctrl+F9”快捷键(即Build Project)重构当前SpringBoot项目即可。

3、在项目测试类中引入Person实体类Bean,进行测试:

package com.hardy.springboot_demo;

import com.hardy.springboot_demo.pojo.Person;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

@SpringBootTest // 标记为SpringBoot单元测试类,并加载项目的ApplicationContext上下文环境
class SpringbootDemoApplicationTests {

    @Autowired
    private Person person;

    @Test
    void configurationTest() {
        System.out.println(person);
    }

}

注意:这里需要对IDEA进行一下编码设置,设置为UTF-8,不然,在控制台打印的中文内容会出现乱码的现象,具体配置如下所示:

打印测试结果:

可以看到,测试方法configurationTest()运行成功,也打印出了Person实体类对象。说明我们的 application.properties 配置文件配置正确,并通过相关注解自动完成了属性注入。

(2)application.yaml配置文件

YAML文件格式是SpringBoot支持的一种用于编写配置文件的序列化语言,它与JSON有些相似,被称为JSON的超集。YAML的设计是为了友好可读性,主要用于配置信息的编写,而JSON的设计目的则是为了简单和通用,主要用于存储数据和应用层数据通信使用。

application.yaml 配置文件的工作原理和 application.properties 配置文件是相同的,只不过 application.yaml 配置文件看起来更简洁一些。

  • YAML文件的拓展名可以用.yml或这.yaml。
  • application.yml文件使用“key: value”(注意,中间要有一个空格)格式配置属性,使用缩进控制层级关系。

这里,针对不同数据类型的属性值,介绍一下YAML。

1、value值为普通数据类型(例如数字、字符串、布尔等)

当YAML配置文件中配置的属性值为普通数据类型时,可以直接配置对应的属性值,同时对于字符串类型的属性值,不需要额外添加引号,示例代码如下:

server:
  port: 8080
  path: /demo

上述代码用于配置server的port和path属性,port和path属于同一个级别。

2、value值为数组和单列集合

当YAML配置文件中配置的属性值为数据或单列集合类型时,主要有两种编写方式:缩进式写法和行内式写法。

其中,缩进式写法还有两种表现形式,示例代码如下:

person:
  hobby:
    - eat
    - read
    - study
    - coding

或者使用如下方式:

person:
  hobby:
    eat,
    read,
    study,
    coding

上述代码中,在YAML配置文件中通过两种缩进式写法对person对象的单列集合(或数组)类型的hobby赋值为eat,read,study和coding。其中一种形式为“- 属性值”(注意,中间要有一个空格),另一种形式为多个属性值之间用逗号隔开(注意,最后一个属性值后面不能加逗号)。

行内式写法如下:

person:
  hobby: [eat,read,study,coding]

通过上述代码对比发现,YAML配置文件的行内式写法更加简洁和方便。此外,包含属性值的中括号“[]”还可以进一步省略,在进行属性赋值时,程序会自动匹配和校对。

3、value值为Map集合与对象

当YAML配置文件中配置的属性值为Map集合或对象类型时,YAML配置文件同样可以分为两种书写方式:缩进式写法和行内式写法。

其中,缩进式写法的示例代码如下:

person:
  map:
    k1: v1
    k2: v2

对应的行内式写法如下:

person:
  map: {k1: v1,k2: v2}

在YAML配置文件中,配置的属性值为Map集合或对象类型时,缩进式写法的形式按照YAML文件格式常规写法编写即可,而行内式写法的属性值要用大括号“{}”包含。

接下来,在Properties配置文件演示案例的基础上,通过配置 application.yaml配置文件 对Person对象进行赋值,具体使用如下:

(1)在项目的resources目录下,新建一个 application.yaml配置文件,在该配置文件中编写Person类的配置属性:

# 对实体类对象Person进行属性配置
person: id: 1 name: hardy hobby: [吃肉,读书,学习,写代码] family: [爸爸,妈妈] map: {k1: v1,k2: v2} pet: {type: cat,name: Hello Kitty}

注意:本次使用 application.yaml配置文件 进行测试时需要先将 application.properties配置文件 中编写的配置给注释掉,不然的话 application.properties配置文件 会覆盖掉 application.yaml配置文件 中的配置。

(2)再次进行测试

可以看到,测试方法configurationTest()同样运行成功,并正确打印出了Person实体类对象。

配置文件属性值的注入

使用SpringBoot全局配置文件设置属性时:

  • 如果配置属性是SpringBoot已有属性,例如服务端口server.port,那么SpringBoot内部会自动扫描、读取这些配置文件中的属性值并覆盖默认属性
  • 如果配置的属性是用户自定义属性,例如刚刚自定义的Person实体类属性,还必须在程序中注入这些配置属性方可生效

SpringBoot支持多种注入配置文件属性的方式,下面来介绍如何使用注解@ConfigurationProperties和@Value注入属性。

(1)使用@ConfigurationProperties注入属性

SpringBoot提供@ConfigurationProperties注解用于快速、方便地将配置文件中的自定义属性值批量注入到某个Bean对象的多个对应属性中。假设现在有一个配置文件,如果使用@ConfigurationProperties诸如配置文件的属性,示例代码如下:

@Component // 用于将Person类作为Bean注入到Spring容器中
@ConfigurationProperties(prefix = "person") // 将配置文件中以person开头的属性注入到该类中
public class Person {

    private int id;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

}

上述代码使用@Component和@ConfigurationProperties(prefix = “person”)将配置文件中的每个属性都映射到person类组件中。

(2)使用@Value注入属性

@Value注解是Spring框架提供的,用来读取配置文件中的属性值并逐个注入到Bean对象的对应属性中,SpringBoot框架从Spring框架中对@Value进行了默认继承,所以在SpringBoot框架中还可以使用该注解读取和注入配置文件属性值。使用@Value注入属性的示例代码如下:

@Component
public class Person {

    @Value("${person.id}")
    private int id;

}

在上述代码中,使用@Component和@Value注入Person实体类的id属性。其中@Value不仅可以将配置文件的属性注入Person的id属性,还可以直接给id属性进行赋值,这点是@ConfigurationProperties不支持的。

演示@Value注解读取并注入配置文件属性的使用:

(1)在项目的 com.hardy.springboot_demo.pojo 包下创建一个实体类 Student,并使用@Value注解注入属性:

package com.hardy.springboot_demo.pojo;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

/**
 * @Author: HardyYao
 * @Date: 2021/5/30
 */
@Component
public class Student {

    @Value("${person.id}")
    private int id;
    @Value("${person.name}")
    private String name; // 名称

    // 不需要set方法

    @Override
    public String toString() {
        return "Student{" +
                "id=" + id +
                ", name='" + name + '\'' +
                '}';
    }
}

Student类使用@Value注解将配置文件的属性值读取和注入。

从上述代码可以看出,使用@Value注解方式需要对每一个属性进行注入设置,同时又免去了属性的setXXX()方法。

(2)再次编写测试方法进行测试

package com.hardy.springboot_demo;

import com.hardy.springboot_demo.pojo.Student;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

@SpringBootTest // 标记为SpringBoot单元测试类,并加载项目的ApplicationContext上下文环境
class SpringbootDemoApplicationTests {

    @Autowired
    private Student student;

    @Test
    void studentTest() {
        System.out.println(student);
    }

}

打印结果:

可以看到,测试方法studentTest()运行成功,同时正确打印出了Student实体类对象。

注意:本示例中只是使用@Value注解对示例中Student对象的普通类型属性进行了赋值展示,而@Value注解对于包含Map集合、对象以及YAML文件格式的行内式写法的配置文件的属性注入都不支持,如果对其赋值会报错。

springboot基础学习(代码片段)

SpringBoot学习–基于springBoot2.5官方文档:https://spring.io/快速开始:引入依赖<parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><vers 查看详情

springboot基础学习

SpringBoot基础回顾JavaSE:OOPMySQL:持久化html+css+js+jquey+框架:JavaWeb:原始MVC框架SSM:框架,简化了开发流程,配置复杂war:Tomcat运行SpringBoot:内嵌tomcat,微服务架构微服务微服务是一种风格、要求我们在开发一个应用时,这个应... 查看详情

springboot之基础学习篇.

一、概念简介   SpringBoot的关键词是“约定俗成”,它根据长久以来的Spring开发配置经验,整理出一套适用、普遍、大家都认可的配置方案。所以SpringBoot的学习过程中心态一定要放宽,没必要太去钻牛角尖,重... 查看详情

springboot系列之入门篇

...言前面我们学习了Java基础和算法,接下来我们通过学习SpringBoot基础来强化代码书写能力,只有通过基础项目实践才能发现问题,在此过程中我们则可以进一步学习JVM虚拟机和线程知识,岂不两全其美,好了,话不多讲,我们开... 查看详情

springboot基础学习springboot全局配置文件及配置文件属性值注入

...配置文件全局配置文件能够对一些默认配置值进行修改。SpringBoot使用一个名为application.properties或者application.yaml的文件作为全局配置文件,该文件会放在 src/main/resource目录或者类路径的 /config目录下,一般会选择/resource。... 查看详情

springboot:基础学习一linux下后台启动springboot项目

 我们知道启动springboot的项目有三种方式:运行主方法启动使用命令mvnspring-boot:run”在命令行启动该应用运行“mvnpackage”进行打包时,会打包成一个可以直接运行的JAR文件,使用“java-jar”命令就可以直接运行... 查看详情

springboot联结万物学习笔记--springboot微服务基础搭建篇--springboot中日志的使用(代码片段)

...会不定期回复,谢谢。gitee地址:https://gitee.com/woniurunfast/springbootwi 查看详情

springboot2从入门到入坟|基础入门篇:你会看springboot的官方文档吗?(代码片段)

开宗明义:如何学习SpringBoot呢?其实学习任何一门新技术,我们都应该以它的官方文档为准。接下来,我们就来熟悉一下SpringBoot官方文档的整个架构,因为我们未来学习很多技术时,都是要参照官方文档来学习的,这样的话,... 查看详情

springboot2从入门到入坟|基础入门篇:你会看springboot的官方文档吗?(代码片段)

开宗明义:如何学习SpringBoot呢?其实学习任何一门新技术,我们都应该以它的官方文档为准。接下来,我们就来熟悉一下SpringBoot官方文档的整个架构,因为我们未来学习很多技术时,都是要参照官方文档来学习的,这样的话,... 查看详情

springboot基础配置

  之前简单接触了一些SpringBoot,并且写了一个简单的Demo。本文就来简单学习一下SpringBoot的基础配置。一、SpringBoot项目入口  上文中有写到,SpringBoot项目需要一个入口类,并且入口类要使用@SpringBootApplication注解,项目启动... 查看详情

springboot学习前提

前言总结springboot的学习前提。正文1.spring程度(可以基本使用,我在学习springboot的时候,感觉到需要一些spring的基础)2.maven(这个是包管理,一定要学)3.工具intelliJIDEA下载地址:https://www.jetbrains.com/idea/download/#section=windows4.java程度... 查看详情

springboot学习09:aop

Springboot学习09:AOP 基础概念图 源码示例切点importorg.springframework.web.bind.annotation.*;@RestControllerpublicclassAopController{@GetMapping("/beforeAop")@AopBeforeAnnopublicStringbeforeAop(){System.o 查看详情

springboot学习笔记-整合mybatis

Springboot学习笔记(二)- 整合MyBatis SpringBoot中整合MyBatis,并通过注解方式实现映射。整合MyBatis以Springboot学习笔记(一)-Helloworld 为基础项目,在pom.xml中添加如下依赖 <dependency>  <groupId>org.mybatis.spring.b... 查看详情

springboot基础知识

SpringBoot基础知识SpringBoot课程笔记前言​很荣幸有机会能以这样的形式和互联网上的各位小伙伴一起学习交流技术课程,这次给大家带来的是Spring家族中比较重要的一门技术课程——SpringBoot。一句话介绍这个技术,应该... 查看详情

springboot学习总结(代码片段)

引言之前也没有深入学习过spring框架,最近SpringBoot流行起来后想补下这方面的知识,于是照着SpringBoot官网上的英文教程开始helloworld入门,踩到几个小坑,记录下学习流程。SpringBoot有哪些优点SpringBoot可以帮助我们快速搭建应用... 查看详情

springboot基础框架以及特性

SpringBoot工程参数解析HTTPMethodRequest/Response/SessionError/重定向LoggerIoCAOP/Aspect 1:SpringBoot工程 框架学习,首先接触看官方文档:(先看做什么,官方的文档细节先忽略,用到去查找)start.spring.io //controller演示publicclassIndex... 查看详情

springboot自定义配置文件

 前言:如果你一点spring的基础没有,建议你不要学习springboot,至少先有一个spring的项目经验或者自己搭建过spring的项目再学习springboot,这样你会发现在spring中搞不懂的,在springboot中得到一些答案。springboot的原则是“约定... 查看详情

springboot2核心技术(基础入门)-02springboot2入门安装配置

...:GettingStarted【Maven已安装】学习资料文档地址:SpringBoot2核心技术与响应式编程·语雀文档不支持旧版本IE、Edge浏览器,请使用chrome或者firefox视频地址:谷粒学苑-Jav 查看详情