SpringBoot中的配置文件详解(yml、properties全局配置和自定义配置、有趣的banner图配置)

举报
共饮一杯无 发表于 2022/07/22 09:18:20 2022/07/22
【摘要】 全局配置文件全局配置文件能够对一些默认配置值进行修改。Spring Boot使用一个application.properties或者application.yaml的文件作为全局配置文件,该文件存放在src/main/resource目录或者类路径的/config,一般会选择resource目录。接下来,将针对这两种全局配置文件进行讲解∶ application.properties配置文...

全局配置文件

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

application.properties配置文件

使用Spring lnitializr方式构建Spring Boot项目时,会在resource目录下自动生成一个空的application.properties文件,Spring Boot项目启动时会自动加载application.properties文件。我们可以在application.properties文件中定义Spring Boot项目的相关属性,当然,这些相关属性可以是系统属性、环境变量、命令参数等信息,也可以是自定义配置文件名称和位置。

server.port=17006
spring.config.name=zjq
spring.application.name=zjq-properties
spring.redis.host=localhost
spring.redis.port=6039
spring.redis.password=
spring.redis.database=0

接下来,通过一个案例对Spring Boot项目中application.properties配置文件的具体使用进行讲解。
演示:准备两个实体类文件,演示将application.properties配置文件中的自定义配置属性注入到PropertiesConfig实体类的对应属性中

  1. 创建两个实体类Goods和PropertiesConfig
@Data
public class Goods {

    private Integer id;
    private String name;
}

@ConfigurationProperties(prefix = "zjq-prop")
@Component
@Data
public class PropertiesConfig {

    private Integer id;
    private String username;
    private List hobby;
    private String[] family;
    private Map map;
    private Goods goods;
}

@ConfigurationProperties: 将配置文件中以zjqProp开头的属性通过setXxx方法注入到该类的属性中
@Component: 把PropertiesConfig类作为Bean到spring容器中,只有这样才能@ConfigurationProperties注解进行赋值

  1. 在resources目录下创建的application.properties文件配置如下:

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

<!--自定义配置提示-->
<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-configuration-processor</artifactId>
  <optional>true</optional>
</dependency>

在pom.xml中添加上述配置依赖后,还需要重新运行项目启动类或者使用“Ctrl+F9"快捷键(即BuildProject)重构当前Spring Boot项目方可生效。
效果如下:
image.png

  1. 查看application.properties配置文件是否正确,同时查看属性配置效果,创建项目测试类,在该测试类中引入PropertiesConfig实体类Bean,并进行输出测试。
@RunWith(SpringRunner.class) // 测试启动类,并加载Spring Boot测试注解
@SpringBootTest //标记为SpringBoot测试类,并加载ApplicationContext上下文环境
public class ConfigTest {

    @Autowired
    private PropertiesConfig propertiesConfig;
    @Test
    public void propertiesConfigTest(){
        System.out.println(propertiesConfig);
    }
}

输出如下:
image.png
至此,说明application.properties配置文件属性配置正确,并通过相关注解自动完成了属性注入。

application.yaml配置文件

YAML文件格式是Spring Boot支持的一种JSON超集文件格式,相较于传统的Properties配置文件,YAML文件以数据为核心,是一种更为直观且容易被电脑识别的数据序列化格式。application.yaml配置文件的工作原理和application.properties是一样的,只不过yaml格式配置文件看起来更简洁一些。我本人开发过程中一般用这种格式,更简洁更有层次感。
YAML文件的扩展名可以使用.yml或者.yaml。
application.yml文件使用“key:(空格)value"格式配置属性,使用缩进控制层级关系。这里,针对不同数据类型的属性值,介绍一下YAML

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

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

value值为数组和单列集合

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

zjq-yml:
  #缩进式写法1
  hobby:
    - 爬山
    - 羽毛球
    - 篮球
  #缩进式写法2
  hobby:
    爬山,
    羽毛球,
    篮球    
  #行内式写法
  hobby:[爬山,羽毛球,篮球]  

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

value值为Map集合和对象

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

zjq-yml:
  #缩进式写法
  map:
    name: 共饮一杯无
    feature: 相当哇塞
  #行内式写法
  map: {"name":"共饮一杯无","feature":"相当哇塞"}

在YAML配置文件中,配置的属性值为Map集合或对象类型时,缩进式写法的形式按照YAML文件格式编写即可,而行内式写法的属性值要用大括号“"包含。
接下来,在Properties配置文件演示案例基础上,通过配置application.yaml配置文件对YmlConfig对象(属性同上述PropertiesConfig类)进行赋值,具体使用如下

  1. 在项目的resources目录下,新建一个application.yml配置文件,在该配置文件中编写为YmlConfig类设置的配置属性。
zjq-yml:
  id: 666
  username: 共饮一杯无
  hobby:
    - 爬山
    - 羽毛球
    - 篮球
  family: [father,mother,wife]
  #缩进式写法
#  map:
#    name: 共饮一杯无
#    feature: 相当哇塞
  #行内式写法
  map: {"name":"共饮一杯无","feature":"相当哇塞"}
  goods: {"id":"666","name":"宇宙飞船"}
  1. 执行测试验证
    @Autowired
    private YmlConfig ymlConfig;

    @Test
    public void ymlConfigTest(){
        System.out.println(ymlConfig);
    }

输出如下:
image.png
💡注意:application.properties和application.yml如果配置相同属性,application.properties会覆盖application.yml的配置。

配置文件属性值的注入使用

Spring Boot全局配置文件设置属性时:
如果配置属性是Spring Boot已有属性,例如服务端口server.port,那么Spring Boot内部会自动扫描并读取这些配置文件中的属性值并覆盖默认属性。
如果配置的属性是用户自定义属性,例如刚刚自定义的Person实体类属性,还必须在程序中注入这些配置属性方可生效。
Spring Boot支持多种注入配置文件属性的方式,下面来介绍如何使用注解@ConfigurationProperties和@Value注入属性

使用@ConfigurationProperties注入属性

Spring Boot提供的@ConfigurationProperties注解用来快速、方便地将配置文件中的自定义属性值批量注入到某个Bean对象的多个对应属性中。上述全局配置properties和yml配置代码使用@Component和@ConfigurationProperties(prefix = “zjq-prop”)将配置文件中的每个属性映射到PropertiesConfig类组件中。此处不再赘述。

使用@Value注入属性

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

@Configuration
@Data
public class ValueConfig {

    @Value("${my.name}")
    private String name;

    @Value("${my.address}")
    private String address;


    @Value("${my.feature}")
    private String feature;
}

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

my:
  name: zjq-dev
  address: zjq-小溪
  feature: 帅的雅痞

测试验证:

    @Autowired
    private ValueConfig valueConfig;

    @Test
    public void valueConfigTest(){
        System.out.println(valueConfig);
    }

输出如下:
image.png
可以看出,测试方法valueConfigTest()运行成功,同时正确打印出了ValueConfig实体类对象。需要说明的是,本示例中只是使用@Value注解对实例中Student对象的普通类型属性进行了赋值演示,而@Value注解对于包含Map集合、对象以及YAML文件格式的行内式写法的配置文件的属性注入都不支持,如果赋值会出现错误。

自定义配置

spring Boot免除了项目中大部分的手动配置,对于一些特定情况,我们可以通过修改全局配置文件以适应具体生产环境,可以说,几乎所有的配置都可以写在application.peroperties文件中,Spring Boot会自动加载全局配置文件从而免除我们手动加载的烦恼。但是,如果我们自定义配置文件,Spring Boot是无法识别这些配置文件的,此时就需要我们手动加载。接下来,将针对Spring Boot的自定义配置文件及其加载方式进行讲解

使用@PropertySource加载配置文件

对于这种加载自定义配置文件的需求,可以使用@PropertySource注解结合@Configuration注解配置类的方式来实现。@PropertySource注解用于指定自定义配置文件的具体位置和名称。同时,为了保证Spring Boot能够扫描该注解,还需要类上添加@Configuration注解将实体类作为自定义配置类。当然,如果需要将自定义配置文件中的属性值注入到对应类的属性中,可以使用@ConfigurationProperties或者@Value注解进行属性值注入
演示:

  1. 打开Spring Boot项目的resources目录,在项目的类路径下新建一个zjq.properties自定义配置文件,在该配置文件中编写需要设置的配置属性。
zjq.name=詹先生
zjq.age=18
zjq.feature=
  1. 新创建一个配置类CustomPropertiesConfig,提供zjq.properties自定义配置文件中对应的属性,并根据@PropertySource注解的使用进行相关配置
/**
 * 自定义配置
 * @author zjq
 * @date 2021/9/11 23:03
 * <p>title:</p>
 * <p>description:</p>
 *
 *要使用@ConfigurationProperties需要在主类指定@EnableConfigurationProperties
 */
@ConfigurationProperties(prefix = "zjq")
@PropertySource("classpath:zjq.properties")
@Configuration
@Data
public class CustomPropertiesConfig {

    private String name;

    private Integer age;

    private String feature;
}

主要是一个自定义配置类,通过相关注解引入了自定义的配置文件,并完成了自定义属性值的注入。针对示例中的几个注解,具体说明如下:

  • @Configuration注解表示当前类是一个自定义配置类,并添加为Spring容器的组件,这里也可以使用传统的@Component注解;
  • @PropertySource("classpath:zjq.properties")注解指定了自定义配置文件的位置和名称,此示例表示自定义配置文件为classpath类路径下的test.properties文件;
  • @ConfigurationProperties(prefix = "zjq")注解将上述自定义配置文件zjq.properties中以zjq开头的属性值注入到该配置类属性中。
  • 如果配置类上使用的是@Component注解而非@Configuration注解,那么@EnableConfigurationProperties注解还可以省略。
  1. 进行测试
    @Autowired
    private CustomPropertiesConfig customPropertiesConfig;

    @Test
    public void customPropertiesConfigTest(){
        System.out.println(customPropertiesConfig);
    }

可以正常输出配置。
image.png

使用@Configuration编写自定义配置类

在Spring Boot框架中,推荐使用配置类的方式向容器中添加和配置组件。
在Spring Boot框架中,通常使用@Configuration注解定义一个配置类,Spring Boot会自动扫描和识别配置类,从而替换传统Spring框架中的XML配置文件。
当定义一个配置类后,还需要在类中的方法上使用@Bean注解进行组件配置,将方法的返回对象注入到Spring容器中,并且组件名称默认使用的是方法名,当然也可以使用@Bean注解的name或value属性自定义组件的名称
演示:

  1. 新创建一个类MyService,该类中不需要编写任何代码
public class MyService {
}

创建了一个空的MyService类,而该类目前没有添加任何配置和注解,因此还无法正常被Spring Boot扫描和识别

  1. 新建一个配置类MyConfig,并使用@Configuration注解将该类声明一个配置类,内容如下:
@Configuration // 定义该类是一个配置类
public class MyConfig {
    @Bean // 将返回值对象作为组件添加到spring容器中,该组件id默认为方法名
    public MyService myService() {

        return new MyService();
    }
}

MyConfig是@Configuration注解声明的配置类(类似于声明了一个XML配置文件),该配置类会被Spring Boot自动扫描识别;使用@Bean注解的myService()方法,其返回值对象会作为组件添加到了Spring容器中(类似于XML配置文件中的标签配置),并且该组件的id默认是方法名myService。

  1. 进行测试
    @Autowired
    private ApplicationContext applicationContext;
    @Test
    public void iocTest() {
    System.out.println(applicationContext.containsBean("myService"));
    }

上述代码中,先通过@Autowired注解引入了Spring容器实例ApplicationContext,然后在测试方法iocTest()中测试查看该容器中是否包括id为myService的组件。
从测试结果可以看出,测试方法iocTest()运行成功,显示运行结果为true,表示Spirng的IOC容器中也已经包含了id为myService的实例对象组件,说明使用自定义配置类的形式完成了向Spring容器进行组件的添加和配置。

随机数设置及参数间引用

在Spring Boot配置文件中设置属性时,除了可以像前面示例中显示的配置属性值外,还可以使用随机值和参数间引用对属性值进行设置。下面,针对配置文件中这两种属性值的设置方式进行讲解。

随机值设置

在Spring Boot配置文件中,随机值设置使用到了Spring Boot内嵌的RandomValuePropertySource类,对一些隐秘属性值或者测试用例属性值进行随机值注入。
随机值设置的语法格式为${random.xx},xx表示需要指定生成的随机数类型和范围,它可以生成随机的整数、uuid或字符串,示例代码如下:

my:
  secret: ${random.value} # 配置随机值
  number: ${random.int} #配置随机整数
  bignumber: ${random.long} # 配置随机long类型数
  uuid: ${random.uuid} # 配置随机uuid类型数
  number:
    less:
      than:
        ten: ${random.int(10)} #配置小于10的随机整数
    in:
      range: ${random.int[1024,65536]} # 配置范围在[ 1024,65536]之间的随机整

上述代码中,使用RandomValuePropertySource类中random提供的随机数类型,分别展示了不同类型随机值的设置示例。

参数间引用

在Spring Boot配置文件中,配置文件的属性值还可以进行参数间的引用,也就是在后一个配置的属性值中直接引用先前已经定义过的属性,这样可以直接解析其中的属性值了。
使用参数间引用的好处就是,在多个具有相互关联的配置属性中,只需要对其中一处属性预先配置,其他地方都可以引用,省去了后续多处修改的麻烦
参数间引用的语法格式为${xx},xx表示先前在配置文件中已经配置过的属性名,示例代码如下

app.name=MyApp
app.description=$ {app.name} is a Spring Boot application

上述参数间引用设置示例中,先设置了"app.name=MyApp",将app.name属性的属性值设置为了MyApp;接着,在app.description属性配置中,使用${app.name}对前一个属性值进行了引用
接下来,通过一个案例来演示使用随机值设置以及参数间引用的方式进行属性设置的具体使用和效果,具体步骤如下

  1. 打开Spring Boot项目resources目录下的application.properties配置文件,在该配置文件中分别通过随机值设置和参数间引用来配置两个测试属性,示例代码如下
spring:
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848
        namespace: f70bfdsfb-6fdsf3-43fd-9eba-8a5dsfsge81
      config:
        server-addr: ${spring.cloud.nacos.discovery.server-addr}
        namespace: ${spring.cloud.nacos.discovery.namespace}
  1. 测试类验证
    @Value("${spring.cloud.nacos.config.server-addr}")
    private String addr;
    @Value("${spring.cloud.nacos.config.namespace}")
    private String namespace;

    @Test
    public void placeholderTest() {
        System.out.println("addr:"+addr);
        System.out.println("namespace:"+namespace);
    }

输出如下:
image.png

banner图定义

在resources目录下创建banner.txt文件,项目启动的时候会加载里面的banner图。
还可以配置一些属性信息:

  • ${AnsiColor.BRIGHT_RED}:设置控制台中输出内容的颜色
  • ${application.version}:用来获取MANIFEST.MF文件中的版本号
  • ${application.formatted-version}:格式化后的${application.version}版本信息
  • ${spring-boot.version}:Spring Boot的版本号
  • ${spring-boot.formatted-version}:格式化后的${spring-boot.version}版本信息

我的banner.txt文件配置如下:

${AnsiColor.BRIGHT_BLUE}
${spring-boot.version}

                          /$$$$$$             /$$$$$$                      /$$
                         /$$__  $$           /$$__  $$                    | $$
 /$$$$$$$$ /$$  /$$$$$$ | $$  \__/  /$$$$$$ | $$  \__/  /$$$$$$   /$$$$$$ | $$
|____ /$$/|__/ /$$__  $$|  $$$$$$  /$$__  $$| $$       /$$__  $$ /$$__  $$| $$
   /$$$$/  /$$| $$  \ $$ \____  $$| $$  \ $$| $$      | $$  \ $$| $$  \ $$| $$
  /$$__/  | $$| $$  | $$ /$$  \ $$| $$  | $$| $$    $$| $$  | $$| $$  | $$| $$
 /$$$$$$$$| $$|  $$$$$$$|  $$$$$$/|  $$$$$$/|  $$$$$$/|  $$$$$$/|  $$$$$$/| $$
|________/| $$ \____  $$ \______/  \______/  \______/  \______/  \______/ |__/
     /$$  | $$      | $$
    |  $$$$$$/      | $$
     \______/       |__/

////////////////////////////////////////////////////////////////////
//                          _ooOoo_                               //
//                         o8888888o                              //
//                         88" . "88                              //
//                         (| ^_^ |)                              //
//                         O\  =  /O                              //
//                      ____/`---'\____                           //
//                    .'  \\|     |//  `.                         //
//                   /  \\|||  :  |||//  \                        //
//                  /  _||||| -:- |||||-  \                       //
//                  |   | \\\  -  /// |   |                       //
//                  | \_|  ''\---/''  |   |                       //
//                  \  .-\__  `-`  ___/-. /                       //
//                ___`. .'  /--.--\  `. . ___                     //
//              ."" '<  `.___\_<|>_/___.'  >'"".                  //
//            | | :  `- \`.;`\ _ /`;.`/ - ` : | |                 //
//            \  \ `-.   \_ __\ /__ _/   .-` /  /                 //
//      ========`-.____`-.___\_____/___.-`____.-'========         //
//                           `=---='                              //
//      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^        //
//            佛祖保佑       永不宕机     永无BUG                  //
////////////////////////////////////////////////////////////////////

更多banner参考网站:
http://patorjk.com/software/taag/#p=display&f=Graffiti&t=zjq
https://www.degraeve.com/img2txt.php#sample

效果如下:
image.png
😄😄😄可以用来镇压bug。

本文内容到此结束了,
如有收获欢迎点赞👍收藏💖关注✔️,您的鼓励是我最大的动力。
如有错误❌疑问💬欢迎各位大佬指出。

保持热爱,奔赴下一场山海。🏃🏃🏃

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。