javascript
在Spring Boot中使用配置元数据来配置您的配置
Spring Boot 1.3.0中發(fā)布了許多更新,但是其中一個(gè)對(duì)我很突出,因?yàn)槲乙郧安⒉涣私獯烁?#xff0c;它的狀態(tài)使其成為一項(xiàng)真正有用的功能(不幸的是,撰寫本文時(shí)僅在Spring Boot中可用)這個(gè))。 我正在談?wù)撆渲迷獢?shù)據(jù)以及與框架/應(yīng)用程序這一領(lǐng)域相關(guān)的處理。 正如我將進(jìn)一步演示的那樣,有幾種方法可以使用它,并且該框架還允許您利用自動(dòng)化處理的好處。 如果您覺(jué)得自己需要解決這些問(wèn)題,請(qǐng)不要擔(dān)心–如果您想使用某些功能來(lái)精確調(diào)整設(shè)置,也可以使用手動(dòng)輸入的方法。 讓我們談?wù)勁渲谩?
Spring Boot中的配置元數(shù)據(jù)
面對(duì)現(xiàn)實(shí)吧-我們都去過(guò)那里。 您正在處理的應(yīng)用程序必須是可配置的,但是,在涉及實(shí)際文檔時(shí),情況會(huì)有些奇怪。 團(tuán)隊(duì)通常有幾種方法來(lái)處理這項(xiàng)艱巨的任務(wù)。 無(wú)論是在項(xiàng)目Wiki中對(duì)其進(jìn)行描述和管理,還是在屬性文件中部分注釋,以Javadoc注釋形式記錄下來(lái),或者根本不存在,我們都可以認(rèn)為這與所需的事務(wù)狀態(tài)相去甚遠(yuǎn)。 這涉及到一些挑戰(zhàn),例如使文檔可供所有涉眾使用(例如devops團(tuán)隊(duì)),版本控制和保持最新(尤其是不向后兼容的更新),或者只是弄清楚哪些選項(xiàng)可用或已棄用,以及它們對(duì)應(yīng)用程序意味著什么。
項(xiàng)目設(shè)置
第一步是設(shè)置一切。 如前所述,您將需要使用Spring Boot 1.3.0或更高版本以及特殊依賴項(xiàng),以確保重新編譯包含元數(shù)據(jù)的文件,該文件稍后將由其他工具(如IDE)處理。 該工件稱為spring-boot-configruation-processor ,應(yīng)將其標(biāo)記為optional 。
pom.xml中的Spring Boot依賴關(guān)系
<parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>1.3.1.RELEASE</version><relativePath/> </parent><dependencies>...<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-configuration-processor</artifactId><optional>true</optional></dependency>... </dependencies>此設(shè)置的第二步是啟用配置屬性并實(shí)際創(chuàng)建一個(gè)包含它們的類。 這是一個(gè)相當(dāng)簡(jiǎn)單的任務(wù)(尤其是如果您有使用Spring Boot的經(jīng)驗(yàn))。 我們將此類稱為MyProperties 。
啟用配置屬性的配置類
@Configuration @EnableConfigurationProperties({MyProperties.class}) public class ApplicationConfiguration {@Autowiredprivate MyProperties myProperties;public MyProperties getMyProperties() {return myProperties;}public void setMyProperties(MyProperties myProperties) {this.myProperties = myProperties;} }開(kāi)箱即用的配置元數(shù)據(jù)
MyProperties類反映以單詞my開(kāi)頭的屬性。 現(xiàn)在我們已經(jīng)完成所有設(shè)置并準(zhǔn)備就緒,讓我們看一下該機(jī)制在兩種最基本情況下如何工作。 考慮這兩個(gè)配置屬性–單個(gè)String屬性( property )和使用enum值的屬性( copyOption )。 這兩個(gè)屬性都是使用標(biāo)準(zhǔn)Javadoc進(jìn)行描述的,如果使用StandardCopyOption ,則每個(gè)enum值都有其自己的Javadoc注釋。 Spring Boots對(duì)配置元數(shù)據(jù)的支持嘗試?yán)么a中的最大值,因?yàn)殚_(kāi)發(fā)人員希望它能正確注釋其配置屬性(在enum的情況下非常有用且方便)。
樣本配置屬性類
@ConfigurationProperties(prefix = "my") public class MyProperties {/*** String property used to configure my app.*/private String property;/*** Configuration for file operations.*/private StandardCopyOption copyOption;public String getProperty() {return property;}public void setProperty(String property) {this.property = property;}public StandardCopyOption getCopyOption() {return copyOption;}public void setCopyOption(StandardCopyOption copyOption) {this.copyOption = copyOption;}}現(xiàn)在該看魔術(shù)發(fā)生了。 前面提到的Spring依賴項(xiàng)可確保在項(xiàng)目構(gòu)建期間生成元數(shù)據(jù)。 為了從整個(gè)設(shè)置中獲得一些收益,您需要知道您的IDE如何支持此Spring Boot功能。 例如,據(jù)我所知,保存操作/事件上的Eclipse IDE觸發(fā)了一個(gè)構(gòu)建,該構(gòu)建負(fù)責(zé)保持元數(shù)據(jù)為最新。 對(duì)于IntelliJ IDEA,由于沒(méi)有保存/保存事件,您需要手動(dòng)觸發(fā)構(gòu)建。 構(gòu)建結(jié)束后,您可以瀏覽target文件夾(如果使用maven)并查找新添加的文件target\classes\META-INF\spring-configuration-metadata.json 。 給定上面的代碼,您應(yīng)該看到類似于以下內(nèi)容:
target \ classes \ META-INF \ spring-configuration-metadata.json的內(nèi)容
{"groups": [{"name": "my","type": "com.jakubstas.s3downloader.MyProperties","sourceType": "com.jakubstas.s3downloader.MyProperties"}],"properties": [{"name": "my.copy-option","type": "java.nio.file.StandardCopyOption","description": "Configuration for file operations.","sourceType": "com.jakubstas.s3downloader.MyProperties"},{"name": "my.property","type": "java.lang.String","description": "String property used to configure my app.","sourceType": "com.jakubstas.s3downloader.MyProperties"}],"hints": [] }現(xiàn)在,該文件可供讀取和處理的工具使用,也可供團(tuán)隊(duì)成員檢查以查看如何配置應(yīng)用程序。 就是說(shuō),一旦我在IntelliJ IDEA編輯器中打開(kāi)application.properties并開(kāi)始為每個(gè)屬性輸入前綴,就會(huì)被熟悉的自動(dòng)代碼完成窗口所歡迎,該窗口具有我的每個(gè)屬性用于什么的概念(基于在Javadoc注釋上):
對(duì)于enum屬性,我還可以看到每個(gè)enum的值及其各自的Javadoc注釋:
默認(rèn)值選擇
配置文檔的最基本用例之一是為您的配置屬性選擇一個(gè)合理的默認(rèn)值,以便盡可能容易地配置您的應(yīng)用程序。 讓我們看一下如何在此設(shè)置中實(shí)現(xiàn)這一目標(biāo)。 為了允許任何手動(dòng)輸入spring-configuration-metadata.json file ,開(kāi)發(fā)人員必須首先創(chuàng)建一個(gè)新的單獨(dú)文件,然后由構(gòu)建過(guò)程使用。 這是另一個(gè)名為Additional additional-spring-configuration-metadata.json json文件,應(yīng)該在META-INF文件夾中創(chuàng)建,并且必須遵循附錄B.配置元數(shù)據(jù)中描述的語(yǔ)法。
這樣,一旦確定了默認(rèn)值和可用選項(xiàng)(我想提供兩個(gè)預(yù)定義的選項(xiàng),但仍允許在String屬性中使用任何其他String值),就可以使用以下內(nèi)容創(chuàng)建該文件:
Additional-spring-configuration-metadata.json的內(nèi)容
{"properties": [{"name": "my.copy-option","type": "java.lang.String","sourceType": "java.nio.file.StandardCopyOption","defaultValue": "replace_existing"},{"name": "my.property","defaultValue": "something"}],"hints": [{"name": "my.property","values": [{"value": "nothing","description": "Does nothing."},{"value": "something","description": "Does something."}]}] }這幾乎可以達(dá)到預(yù)期的效果,并且已經(jīng)可以在某些Spring Boot依賴項(xiàng)中看到。 對(duì)于String屬性,兩個(gè)選項(xiàng)均帶有各自的描述。 默認(rèn)選項(xiàng)已鎖定。
enum屬性的行為略有不同,因?yàn)镮DE不會(huì)固定該選項(xiàng),而是將其放在列表的頂部。
最后,讓我們看一看尚未選擇任何特定屬性的內(nèi)容。 在這種情況下,這兩個(gè)屬性均顯示其對(duì)Javadoc的描述及其默認(rèn)值。
結(jié)論
這是對(duì)如何使配置更加出色的簡(jiǎn)短介紹。 這篇文章只是放棄了可能實(shí)現(xiàn)的目標(biāo),并且仍然設(shè)法顯示出此功能的巨大潛力。 我鼓勵(lì)您嘗試一下此功能,親自看看這種設(shè)置是否對(duì)您和您的團(tuán)隊(duì)都有效。 在下一篇文章中,我將詳細(xì)介紹此配置支持。 敬請(qǐng)關(guān)注!
翻譯自: https://www.javacodegeeks.com/2016/01/pimp-config-configuration-meta-data-spring-boot.html
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來(lái)咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)總結(jié)
以上是生活随笔為你收集整理的在Spring Boot中使用配置元数据来配置您的配置的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 宁国房产备案系统(宁国房产备案)
- 下一篇: gradle idea java ssm