日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網站首頁 編程語言 正文

從零搭建開發腳手架 SpringBoot自定義配置的多種姿勢及Idea自動提示

作者:lakernote 更新時間: 2022-05-25 編程語言

文章目錄

    • 背景
    • 獲取配置方式
      • 方式一:@Value注解
      • 方式二:@ConfigurationProperties注解(建議)
      • 方式三:Environment接口
    • 自定義配置文件laker.properties
    • 自定義配置文件laker.yml
    • IDEA自動提示功能
      • 1.添加依賴
      • 2.添加配置類
      • 3.在application.yml中測試自動提示
      • 原理
    • 配置優先級

背景

日常開發中,經常會使用到自定義配置,例如在常用的application.yml中增加配置,在命令行中進行配置覆蓋,以及外部的自定義xxx.properties等。

  • 如果是工程管理的配置,IDEA會自動提示框架的相關配置,防止我們寫錯配置項。
  • 我們也常使用自定義外部文件配置,用來管理一些項目中重要的秘鑰、證書等。

獲取配置方式

假設在application.yml或者application.properties存在自定義配置。

laker:
  username: laker

方式一:@Value注解

@Component
public class LakerBean {
    @Value("${laker.username}")
    private String username;

}

方式二:@ConfigurationProperties注解(建議)

@Configuration //將該Bean放入spring容器中
@Data
@ConfigurationProperties(prefix = "laker") // 指定前綴
public class TestConfig {
    private String username;
    private String password;
}

@Component
public class LakerBean {
    @Autowired
    TestConfig testConfig ;
}

方式三:Environment接口

@Component
public class LakerBean {
    @Autowired
    Environment env;
    ...
    env.getProperty("laker.username")
}

大部分場景我們建議使用@ConfigurationProperties注解方式獲取配置。

自定義配置文件laker.properties

除了默認的application.yml配置文件,還支持自定義配置文件。例如新建個laker.properties

laker.username=laker
laker.password=123

我們使用的是@PropertySource注解。

注意:

  • 只支持propertiesxml格式文件,不支持yml格式
  • 支持classpathfileclasspath:app.properties or file:/path/to/file.xml.
@Data
@Configuration
@ConfigurationProperties(prefix = "laker", ignoreUnknownFields = true) 
@PropertySource("classpath:laker.properties")//指定配置文件位置
public class TestConfig {
    private String username;
    private String password;
}

自定義配置文件laker.yml

如果想自定義支持yml格式,只需要增加個自定義PropertySourcesPlaceholderConfigurer如下。

@Configuration
public class LakerYml {
    @Bean
    public static PropertySourcesPlaceholderConfigurer loadYaml(){
        PropertySourcesPlaceholderConfigurer configurer = new PropertySourcesPlaceholderConfigurer();
        YamlPropertiesFactoryBean yaml = new YamlPropertiesFactoryBean();
        //yaml.setResources(new FileUrlResource("/config/laker.yml"));
        yaml.setResources(new ClassPathResource("laker.yml"));
        configurer.setProperties(Objects.requireNonNull(yaml.getObject()));
        return configurer;
    }
}

其他同上面的laker.properties,@PropertySource("classpath:laker.yml"),指定配置文件位置.

laker.yml

laker:
  username: laker

IDEA自動提示功能

非常重要,如果沒有這個自動提示,那么很容易寫錯配置項。

1.添加依賴

<dependency>
    <groupId>org.springframework.bootgroupId>
    <artifactId>spring-boot-configuration-processorartifactId>
    <optional>trueoptional>
dependency>

2.添加配置類

@Configuration //將該Bean放入spring容器中
@Data
@ConfigurationProperties(prefix = "laker") // 指定前綴
public class TestConfig {
    /**
     * 用戶名
     */
    private String username;
    /**
     * 密碼
     */
    private String password;
}

3.在application.yml中測試自動提示

注意:要重新編譯項目,會在target\classes\META-INF目錄生成spring-configuration-metadata.json文件。

我們在application.yml中輸入laker效果如下:

注意:對于上面我們自定義的laker.yml默認是沒有提示的,我們需要把自定義配置文件加入到SpringBoot工程環境即可。

選擇項目結構把自定義文件加入到config files中,然后保存-應用。

原理

以下內容來自:https://blog.csdn.net/u013202238/article/details/117407129

依賴spring-boot-configuration-processor,其作用能夠解析我們的配置類,生成spring-configuration-metadata.json文件

  • 掃描以@ConfigurationProperties 注解的類

  • 如果我們不添加該依賴,按照同樣的格式、文件名稱手寫編寫這個json文件,也可以實現提示功能

  • SpringBoot給我們規定了名為additional-spring-configuration-metadata.json的文件,便于我們手動編寫一些特殊的配置項,在生成json文件里面的內容時,會將additional-spring-configuration-metadata.json里面的內容追加到spring-configuration-metadata.json

SpringBoot只是給出了json格式的配置文件,由Idea插件讀取該文件實現提示,而且只有idea Ultimate版本才會有這個功能,Community社區版本無法提示。當然eclipse中也有插件可以來實現配置項的自動提示。

spring-boot-configuration-processor工作原理
在自動生成配置提示的json文件時,最后一步就是編譯項目。就是為了讓spring-boot-configuration-processor執行,其實就是利用了java的編譯時期的spi擴展機制。javax.annotation.processing.Processor(注解處理器)

注解處理器(Annotation Processor)是javac內置的一個用于編譯時掃描和處理注解(Annotation)的工具,在程序編譯階段工作,所以我們可以在編譯期間通過注解處理器進行我們需要的操作。

比較常用的用法就是在編譯期間獲取相關注解數據,然后動態生成.java源文件(讓機器幫我們寫代碼),通常是自動產生一些有規律性的重復代碼,解決了手工編寫重復代碼的問題,大大提升編碼效率。

實際上我們常用的Lombok這個jar,通過@Getter/@Setter生成字段的getter/setter方法也是利用了同樣的原理.

配置優先級

Spring Boot能從多種屬性源獲得屬性,包括

  • 命令行參數(–server.port=9000)
  • java:comp/env里的JNDI屬性
  • Java 系統屬性(System.getProperties())
  • 操作系統環境變量
  • RandomValuePropertySource 配置的 random.* 屬性值
  • 配置文件(application-{profile}.properties和YAML變體)
  • 配置文件(YAML 文件、Properties 文件)
  • 通過@PropertySource標注的屬性源
  • 默認屬性

這個列表按照優先級排序,也就是說,任何在高優先級屬性源里設置的屬性都會覆蓋低優先級的相同屬性。例如,命令行參數會覆蓋其他屬性源里的屬性。

配置文件(YAML 文件、Properties 文件)說明

SpringBoot啟動會掃描以下位置的application.properties/yml文件作為spring boot的默認配置文件:

file:./config/
file:./
classpath:/config/
classpath:/
  • 外置,在相對于應用程序運行目錄的/config子目錄里。
  • 外置,在應用程序運行的目錄里。
  • 內置,在config包內。
  • 內置,在Classpath根目錄。

同樣,這個列表按照優先級排序。也就是說,/config子目錄里的application.properties會覆蓋應用程序Classpath里的application.properties中的相同屬性。
此外,如果你在同一優先級位置同時有application.properties和application.yml,那么application.yml里的屬性會覆蓋application.properties里的屬性

yml > yaml > properties

以上只列了常用的外部配置,具體請參考SpringBoot官方文檔。

參考

  • https://blog.csdn.net/u013202238/article/details/117407129

  • https://docs.spring.io/spring-boot/docs/2.4.5/reference/html/appendix-configuration-metadata.html#configuration-metadata-providing-manual-hints

  • https://docs.spring.io/spring-boot/docs/2.4.5/reference/html/spring-boot-features.html#boot-features-external-config

原文鏈接:https://blog.csdn.net/abu935009066/article/details/124905781

欄目分類
最近更新