SpringBoot自定义配置文件

有趣的SpringBoot Config

实验环境
  • IntelliJ IDEA 2021.2
  • SpringBoot 2.6.3
  • Lombok
  • spring-boot-configuration-processor
  • 项目源码:neo/springbootdemo (gitee.com)
初始化一个SpringBoot项目

我这里是直接从Spring Initializr网站初始化并下载的。然后用IDEA打开,具体过程w不再赘述了。要注意的是,IDEA初次打开一个初始化的SpringBoot项目时,由于某些原因(你懂的),需要花点时间将依赖下载下来。

安装Lombok

Lombok可以简化Java实体类,免去编写 get set方法的困扰,使实体类更加清爽。安装Lombok分为两步。

  • 在IDEA中安装Lombok插件(不过我看新出的IDEA自带了该插件)

    File->Settings->Plugins

    image-20220216220109456
  • 在项目中引入Lombok包

    dependencies {
      compileOnly 'org.projectlombok:lombok:1.18.22'
      annotationProcessor 'org.projectlombok:lombok:1.18.22'
      
      testCompileOnly 'org.projectlombok:lombok:1.18.22'
      testAnnotationProcessor 'org.projectlombok:lombok:1.18.22'
    }
    
    
      
          org.projectlombok
          lombok
          1.18.22
          provided
      
    
    
安装 spring-boot-configuration-processor
dependencies {
    annotationProcessor "org.springframework.boot:spring-boot-configuration-processor"
}

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

编写Properties类
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

@Data
@Component
@ConfigurationProperties(prefix = "my")
public class MyEntityProperties {
    private String name;
}
在application.properties中配置
my.name=I am from application.properties
编写Properties测试类
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

@SpringBootTest
public class TestMyEntityProperties {
    @Autowired
    private MyEntityProperties myEntityProperties;

    @Test
    void initEntity() {
        System.out.println(myEntityProperties.getName());
    }
}
执行结果
  .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::                (v2.6.3)

2022-02-17 16:29:13.615  INFO 10452 --- [    Test worker] c.e.d.properties.TestMyEntityProperties  : Starting TestMyEntityProperties using Java 1.8.0_301 on DESKTOP-6POMD94 with PID 10452 (started by neo in D:\code\springbootdemo)
2022-02-17 16:29:13.616  INFO 10452 --- [    Test worker] c.e.d.properties.TestMyEntityProperties  : No active profile set, falling back to default profiles: default
2022-02-17 16:29:13.997  INFO 10452 --- [    Test worker] c.e.d.properties.TestMyEntityProperties  : Started TestMyEntityProperties in 0.573 seconds (JVM running for 1.663)
I am from application.properties # 这里便是执行的结果输出
BUILD SUCCESSFUL in 2s
4 actionable tasks: 2 executed, 2 up-to-date
16:29:14: Task execution finished ':test --tests "com.example.demo.properties.TestMyEntityProperties"'.
中文乱码解决

我们更改一下name的配置

my.name = my.name=我来自application.properties

执行的结果会变成

???application.properties

这是由于IDEA编码的问题这里我们设置一下 , 然后重新启动IDEA。

image-20220217165303375

IDEA冲洗启动后,application.properties会变成下面的样子,这里我们将修正一下

image-20220217165525558

改后的结果如下

image-20220217165718932

最周执行下来的结果是

image-20220217165754577

当然我们也可以将application.properties修改为application.yml

spring:
  messages:
    encoding: UTF-8
my:
  name: 我来自application.yml

同样可以正确执行。

自定义配置文件的名称

有些情况我们并不希望使用系统自带的application.propertiesapplication.yml配置文件,而是指定xxxx.properties或者xxx.yml作为配置文件。

  • 我们在resources文件夹下新增my.properties

    image-20220217170430388
  • MyEntityProperties实体类中指定使用这个文件作为配置文件

    package com.example.demo.properties;
    
    import lombok.Data;
    import org.springframework.boot.context.properties.ConfigurationProperties;
    import org.springframework.context.annotation.PropertySource;
    import org.springframework.stereotype.Component;
    
    @Data
    @Component
    @ConfigurationProperties(prefix = "my")
    @PropertySource(value = "classpath:my.properties")
    public class MyEntityProperties {
        private String name;
    }
    

    执行结果

    image-20220217172300486

    可以发现配置并没有生效,这是因为application.yml或application.properties的优先级比my.properties高。所以这里我们清除掉application.yml中重复的配置再执行一次

    image-20220217172447643

    但是my.properties并不能像application.yml或application.properties自动提示。这里需要设置一下

    • 同时按下Ctrl+Alt+Shift+S

    • image-20220217173147089
    • image-20220217173203484
    • image-20220217173229417
    • 操作完成后你会发现

      image-20220217173312408

      此时你会发现my.properties也可以自动提示了。

      自定义yaml文件

      SpringBoot官方目前仅支持自定义的properties文件,如果想使用自定义的yaml文件需要额外编写解析工具。

      import org.springframework.beans.factory.config.YamlPropertiesFactoryBean;
      import org.springframework.core.env.PropertiesPropertySource;
      import org.springframework.core.env.PropertySource;
      import org.springframework.core.io.support.EncodedResource;
      import org.springframework.core.io.support.PropertySourceFactory;
      
      import java.util.Objects;
      import java.util.Properties;
      
      public class YamlPropertySourceUtil implements PropertySourceFactory {
          @Override
          public PropertySource createPropertySource(String name, EncodedResource resource) {
              YamlPropertiesFactoryBean factory = new YamlPropertiesFactoryBean();
              factory.setResources(resource.getResource());
      
              Properties properties = factory.getObject();
      
              assert properties != null;
              return new PropertiesPropertySource(Objects.requireNonNull(resource.getResource().getFilename()), properties);
          }
      }
      

      然后在实体类中引入这个工具

      import com.example.demo.utils.YamlPropertySourceUtil;
      import lombok.Data;
      import org.springframework.boot.context.properties.ConfigurationProperties;
      import org.springframework.context.annotation.PropertySource;
      import org.springframework.stereotype.Component;
      
      @Data
      @Component
      @ConfigurationProperties(prefix = "my")
      @PropertySource(value = "classpath:my.properties", factory = YamlPropertySourceUtil.class)
      public class MyEntityProperties {
          private String name;
      }
      

      最后执行获取

      image-20220217174841161

      至此SpringBoot配置方面的知识就算带大家入门了。

你可能感兴趣的:(SpringBoot自定义配置文件)