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配置方面的知识就算带大家入门了。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,835评论 4 364
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,598评论 1 295
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,569评论 0 244
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,159评论 0 213
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,533评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,710评论 1 222
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,923评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,674评论 0 203
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,421评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,622评论 2 245
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,115评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,428评论 2 254
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,114评论 3 238
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,097评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,875评论 0 197
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,753评论 2 276
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,649评论 2 271

推荐阅读更多精彩内容