本篇文章給大家分享的是有關(guān)PropertySource注解怎么在Spring boot中使用,小編覺得挺實(shí)用的,因此分享給大家學(xué)習(xí),希望大家閱讀完這篇文章后可以有所收獲,話不多說(shuō),跟著小編一起來(lái)看看吧。
成都創(chuàng)新互聯(lián)是一家集網(wǎng)站建設(shè),崆峒企業(yè)網(wǎng)站建設(shè),崆峒品牌網(wǎng)站建設(shè),網(wǎng)站定制,崆峒網(wǎng)站建設(shè)報(bào)價(jià),網(wǎng)絡(luò)營(yíng)銷,網(wǎng)絡(luò)優(yōu)化,崆峒網(wǎng)站推廣為一體的創(chuàng)新建站企業(yè),幫助傳統(tǒng)企業(yè)提升企業(yè)形象加強(qiáng)企業(yè)競(jìng)爭(zhēng)力??沙浞譂M足這一群體相比中小企業(yè)更為豐富、高端、多元的互聯(lián)網(wǎng)需求。同時(shí)我們時(shí)刻保持專業(yè)、時(shí)尚、前沿,時(shí)刻以成就客戶成長(zhǎng)自我,堅(jiān)持不斷學(xué)習(xí)、思考、沉淀、凈化自己,讓我們?yōu)楦嗟钠髽I(yè)打造出實(shí)用型網(wǎng)站。1.1. PropertySource注解加載指定的屬性文件
Spring框架提供了PropertySource注解,目的是加載指定的屬性文件,接下來(lái)我們看一下如何使用該注解。首先我們定義一個(gè)配置類,并在類中添加PropertySource注解,如下所示:
@Component @PropertySource(value= {"classpath:config/jdbc-bainuo-dev.properties"},ignoreResourceNotFound=false,encoding="UTF-8",name="jdbc-bainuo-dev.properties",) public class CustomerDataSourceConfig1 { private String url; public String getUrl() { return url; } public void setUrl(String url) { this.url = url; } @Override public String toString() { return "CustomerDataSourceConfig{" + "url='" + url + '\'' + '}'; } }
上述的代碼目的是加載classpath路徑中config文件中的jdbc-bainuo-dev.properties
。其中encoding用于指定讀取屬性文件所使用的編碼,我們通常使用的是UTF-8;ignoreResourceNotFound含義是當(dāng)指定的配置文件不存在是否報(bào)錯(cuò),默認(rèn)是false;比如上文中指定的加載屬性文件是jdbc-bainuo-dev.properties
。如果該文件不存在,則ignoreResourceNotFound為true的時(shí)候,程序不會(huì)報(bào)錯(cuò),如果ignoreResourceNotFound為false的時(shí)候,程序直接報(bào)錯(cuò)。實(shí)際項(xiàng)目開發(fā)中,最好設(shè)置ignoreResourceNotFound為false。該參數(shù)默認(rèn)值為false。
value值是設(shè)置需要加載的屬性文件,可以一次性加載多個(gè)。name的值我們?cè)O(shè)置的是jdbc-bainuo-dev.properties
。這個(gè)值在Springboot的環(huán)境中必須是唯一的,如果不設(shè)置,則值為:“class path resource [config/jdbc-bainuo-dev.properties]
“。
可能很多人比較納悶,為什么是“class path resource [config/jdbc-bainuo-dev.properties]
“呢?這個(gè)就涉及到了Spring中對(duì)資源文件的封裝類Resource。上文我們配置的value值為"classpath:config/jdbc-bainuo-dev.properties
",因此Spring發(fā)現(xiàn)是classpath開頭的,因此最終使用的是Resource的子類ClassPathResource。如果是file開頭的,則最終使用的類是FileSystemResource。
了解了上文所述的Resource類之后。我們?cè)俅蚊鞔_一點(diǎn),如果@PropertySource中如果沒有設(shè)置name值,則name值的生成規(guī)則是:根據(jù)value值查找到最終封裝的Resource子類,然后調(diào)用具體的Resource子類實(shí)例對(duì)象中的getDescription方法,getDescription方法的返回值為最終的name值。
比如ClassPathResource類中的getDescription方法實(shí)現(xiàn)如下:
public String getDescription() { StringBuilder builder = new StringBuilder("class path resource ["); String pathToUse = path; if (this.clazz != null && !pathToUse.startsWith("/")) { builder.append(ClassUtils.classPackageAsResourcePath(this.clazz)); builder.append('/'); } if (pathToUse.startsWith("/")) { pathToUse = pathToUse.substring(1); } builder.append(pathToUse); builder.append(']'); return builder.toString(); }
上述的name處理邏輯暫時(shí)先有個(gè)印象即可,后續(xù)會(huì)詳細(xì)地跟蹤源碼進(jìn)行講解。
1.2. PropertySource注解加載指定的屬性文件測(cè)試
上文我們?cè)O(shè)置了PropertySource注解來(lái)加載"classpath:config/jdbc-bainuo-dev.properties"
文件。該文件的目錄結(jié)構(gòu)如下圖所示:
jdbc-bainuo-dev.properties文件內(nèi)容如下:
spring.datasource.shareniu.url=shareniu
application.properties文件內(nèi)容如下:
spring.profiles.active=dev
上面的配置文件中,spring.profiles.active
屬性配置了當(dāng)前使用的環(huán)境是dev。spring.datasource.shareniu.url
只是一個(gè)普通的屬性,本身并沒有什么特殊的含義。
下面開始書寫Springboot的啟動(dòng)類,如下所示:
@SpringBootApplication public class DemoApplication { public static void main(String[] args) { SpringApplication springApplication = new SpringApplication(DemoApplication.class); ConfigurableApplicationContext configurableApplicationContext = springApplication.run(args); CustomerDataSourceConfig1 customerDataSourceConfig = configurableApplicationContext .getBean(CustomerDataSourceConfig1.class); System.out.print(customerDataSourceConfig); } }
運(yùn)行上述的代碼,程序的輸出如下:
CustomerDataSourceConfig{url='null'}
奇怪了,怎么url是空呢?PropertySource注解不是已經(jīng)將jdbc-bainuo-dev.properties
文件加載到當(dāng)前的環(huán)境中了嗎?我們不妨試一下看看jdbc-bainuo-dev.properties
中的spring.datasource.shareniu.url
屬性是否可以獲取到,進(jìn)而從側(cè)面驗(yàn)證PropertySource注解已經(jīng)將jdbc-bainuo-dev.properties
文件加載到當(dāng)前的環(huán)境中。
修改上述啟動(dòng)類的代碼如下:
@SpringBootApplication public class DemoApplication { public static void main(String[] args) { SpringApplication springApplication = new SpringApplication(DemoApplication.class); ConfigurableApplicationContext configurableApplicationContext = springApplication.run(args); CustomerDataSourceConfig1 customerDataSourceConfig = configurableApplicationContext.getBean(CustomerDataSourceConfig1.class); String property = configurableApplicationContext.getEnvironment().getProperty("spring.datasource.shareniu.url"); System.out.println(property); System.out.print(customerDataSourceConfig); } }
運(yùn)行上述的代碼,程序的輸出如下:
Shareniu
通過(guò)上述的代碼可以看出PropertySource確實(shí)是生效了。那么我們?cè)趺磳?code>spring.datasource.shareniu.url屬性值自動(dòng)注入到CustomerDataSourceConfig1 類中的url屬性中呢?
1.3. PropertySource注解讀取指定文件并將屬性注入到配置類
Spring中提供了@Value注解,用于將配置文件中的屬性值讀取出來(lái)并設(shè)置到相應(yīng)的屬性中。在這里我們學(xué)習(xí)一下如何使用@Value注解。同樣的還是以上文的兩個(gè)類為例進(jìn)行詳細(xì)說(shuō)明,首先需要修改CustomerDataSourceConfig1類,修改部分如下所示:
@Component @PropertySource( name="jdbc-bainuo-dev.properties",value= {"classpath:config/jdbc-bainuo-dev.properties"},ignoreResourceNotFound=false,encoding="UTF-8") public class CustomerDataSourceConfig1 { @Value("${spring.datasource.shareniu.url}") private String url; }
上述的類中,在url字段中增加了@Value注解,并指定了SPEL表達(dá)式為${spring.datasource.shareniu.url}
。再次運(yùn)行springboot啟動(dòng)類,控制臺(tái)的輸出為shareniu。表明確實(shí)可以通過(guò)@Value進(jìn)行屬性值的注入。但是使用@Value注解方式有一個(gè)不太友好的地方就是,當(dāng)項(xiàng)目中有大量的屬性進(jìn)行配置的時(shí)候,我們需要一個(gè)個(gè)的在類的字段中增加@Value注解,這樣確實(shí)很費(fèi)勁,不過(guò)我們可以通過(guò)Springboot提供的@ConfigurationProperties注解解決這個(gè)問(wèn)題。
1.4. ConfigurationProperties注解使用
@ConfigurationProperties是類級(jí)別的注解,具體使用方式如下:
@Component @ConfigurationProperties(prefix = "spring.datasource.shareniu") @PropertySource( name="jdbc-bainuo-dev.properties",value= {"classpath:config/jdbc-bainuo-dev.properties"},ignoreResourceNotFound=false,encoding="UTF-8") public class CustomerDataSourceConfig1 { private String url; }
上述代碼中,在CustomerDataSourceConfig1類中增加了ConfigurationProperties注解,并且指明了屬性的前綴為spring.datasource.shareniu
。這樣Springboot在處理的時(shí)候,會(huì)去掃描當(dāng)前類中的所有字段并進(jìn)行屬性的查找以及組裝。比如我們配置的prefix = "spring.datasource.shareniu"
,CustomerDataSourceConfig1類中有一個(gè)url字段,則url字段需要匹配的屬性是prefix+字段=spring.datasource.shareniu.url
。
那不僅有個(gè)疑問(wèn)?如果指定的字段沒有找到屬性怎么辦呢?這個(gè)可以進(jìn)行如下的配置:
@ConfigurationProperties(prefix = "spring.datasource.shareniu",ignoreUnknownFields=true,ignoreInvalidFields=true)
ignoreUnknownFields:忽略未知的字段。
ignoreInvalidFields:是否忽略驗(yàn)證失敗的字段。這個(gè)怎么理解呢?比如我們?cè)谂渲梦募信渲昧艘粋€(gè)字符串類型的變量,類中的字段是int類型,那肯定會(huì)報(bào)錯(cuò)的。如果出現(xiàn)這種情況我們可以容忍,則需要配置該屬性值為true。該參數(shù)值默認(rèn)為false。
以上就是PropertySource注解怎么在Spring boot中使用,小編相信有部分知識(shí)點(diǎn)可能是我們?nèi)粘9ぷ鲿?huì)見到或用到的。希望你能通過(guò)這篇文章學(xué)到更多知識(shí)。更多詳情敬請(qǐng)關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。