SpringBoot自定义配置文件

有趣的SpringBoot Config

实验环境
初始化一个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'
    }
    
    <dependencies>
      <dependency>
          <groupId>org.projectlombok</groupId>
          <artifactId>lombok</artifactId>
          <version>1.18.22</version>
          <scope>provided</scope>
      </dependency>
    </dependencies>
    
安装 spring-boot-configuration-processor
dependencies {
    annotationProcessor "org.springframework.boot:spring-boot-configuration-processor"
}
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-configuration-processor</artifactId>
    <optional>true</optional>
</dependency>
编写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配置方面的知识就算带大家入门了。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容