最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Spring boot中PropertySource注解的使用方法詳解

 更新時間:2017年12月13日 16:13:38   作者:分享牛  
這篇文章主要給大家介紹了關(guān)于Spring boot中PropertySource注解的使用方法,文中通過示例代碼介紹的非常詳細,對大家學習或者使用Spring boot具有一定的參考學習價值,需要的朋友們下面來一起學習學習吧。

前言

本文將重點講解一下Spring中@PropertySource注解的使用,如何通過PropertySource注解加載指定的配置文件。以及PropertySource注解與@ConfigurationProperties兩個注解的配合使用。下面話不多說了,來隨著小編來一起學習學習吧。

1.1. PropertySource注解加載指定的屬性文件

Spring框架提供了PropertySource注解,目的是加載指定的屬性文件,接下來我們看一下如何使用該注解。首先我們定義一個配置類,并在類中添加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含義是當指定的配置文件不存在是否報錯,默認是false;比如上文中指定的加載屬性文件是jdbc-bainuo-dev.properties。如果該文件不存在,則ignoreResourceNotFound為true的時候,程序不會報錯,如果ignoreResourceNotFound為false的時候,程序直接報錯。實際項目開發(fā)中,最好設(shè)置ignoreResourceNotFound為false。該參數(shù)默認值為false。

value值是設(shè)置需要加載的屬性文件,可以一次性加載多個。name的值我們設(shè)置的是jdbc-bainuo-dev.properties。這個值在Springboot的環(huán)境中必須是唯一的,如果不設(shè)置,則值為:“class path resource [config/jdbc-bainuo-dev.properties] “。

可能很多人比較納悶,為什么是“class path resource [config/jdbc-bainuo-dev.properties] “呢?這個就涉及到了Spring中對資源文件的封裝類Resource。上文我們配置的value值為"classpath:config/jdbc-bainuo-dev.properties",因此Spring發(fā)現(xiàn)是classpath開頭的,因此最終使用的是Resource的子類ClassPathResource。如果是file開頭的,則最終使用的類是FileSystemResource。

了解了上文所述的Resource類之后。我們再次明確一點,如果@PropertySource中如果沒有設(shè)置name值,則name值的生成規(guī)則是:根據(jù)value值查找到最終封裝的Resource子類,然后調(diào)用具體的Resource子類實例對象中的getDescription方法,getDescription方法的返回值為最終的name值。

比如ClassPathResource類中的getDescription方法實現(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處理邏輯暫時先有個印象即可,后續(xù)會詳細地跟蹤源碼進行講解。

1.2. PropertySource注解加載指定的屬性文件測試

上文我們設(shè)置了PropertySource注解來加載"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屬性配置了當前使用的環(huán)境是dev。spring.datasource.shareniu.url只是一個普通的屬性,本身并沒有什么特殊的含義。

下面開始書寫Springboot的啟動類,如下所示:

@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);
}
}

運行上述的代碼,程序的輸出如下:

CustomerDataSourceConfig{url='null'}

奇怪了,怎么url是空呢?PropertySource注解不是已經(jīng)將jdbc-bainuo-dev.properties文件加載到當前的環(huán)境中了嗎?我們不妨試一下看看jdbc-bainuo-dev.properties中的spring.datasource.shareniu.url屬性是否可以獲取到,進而從側(cè)面驗證PropertySource注解已經(jīng)將jdbc-bainuo-dev.properties文件加載到當前的環(huán)境中。

修改上述啟動類的代碼如下:

@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);
}
}

運行上述的代碼,程序的輸出如下:

Shareniu

通過上述的代碼可以看出PropertySource確實是生效了。那么我們怎么將spring.datasource.shareniu.url屬性值自動注入到CustomerDataSourceConfig1 類中的url屬性中呢?

1.3. PropertySource注解讀取指定文件并將屬性注入到配置類

Spring中提供了@Value注解,用于將配置文件中的屬性值讀取出來并設(shè)置到相應(yīng)的屬性中。在這里我們學習一下如何使用@Value注解。同樣的還是以上文的兩個類為例進行詳細說明,首先需要修改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表達式為${spring.datasource.shareniu.url} 。再次運行springboot啟動類,控制臺的輸出為shareniu。表明確實可以通過@Value進行屬性值的注入。但是使用@Value注解方式有一個不太友好的地方就是,當項目中有大量的屬性進行配置的時候,我們需要一個個的在類的字段中增加@Value注解,這樣確實很費勁,不過我們可以通過Springboot提供的@ConfigurationProperties注解解決這個問題。

1.4. ConfigurationProperties注解使用

@ConfigurationProperties是類級別的注解,具體使用方式如下:

@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在處理的時候,會去掃描當前類中的所有字段并進行屬性的查找以及組裝。比如我們配置的prefix = "spring.datasource.shareniu" ,CustomerDataSourceConfig1類中有一個url字段,則url字段需要匹配的屬性是prefix+字段=spring.datasource.shareniu.url 。

那不僅有個疑問?如果指定的字段沒有找到屬性怎么辦呢?這個可以進行如下的配置:

@ConfigurationProperties(prefix = "spring.datasource.shareniu",ignoreUnknownFields=true,ignoreInvalidFields=true) 

ignoreUnknownFields:忽略未知的字段。

ignoreInvalidFields:是否忽略驗證失敗的字段。這個怎么理解呢?比如我們在配置文件中配置了一個字符串類型的變量,類中的字段是int類型,那肯定會報錯的。如果出現(xiàn)這種情況我們可以容忍,則需要配置該屬性值為true。該參數(shù)值默認為false。

本文暫且講解到這里,后續(xù)的文章我們來講解@PropertySource注解如何實現(xiàn)讀取不同環(huán)境中的配置文件,這個不同環(huán)境的文件動態(tài)切換讀取,PropertySource默認是不支持的,因此我們需要擴展該注解對應(yīng)的源碼。

總結(jié)

以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。

相關(guān)文章

  • Java實現(xiàn)同步枚舉類數(shù)據(jù)到數(shù)據(jù)庫

    Java實現(xiàn)同步枚舉類數(shù)據(jù)到數(shù)據(jù)庫

    這篇文章主要為大家詳細介紹了Java實現(xiàn)同步枚舉類數(shù)據(jù)到數(shù)據(jù)庫,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-08-08
  • java正則實現(xiàn)各種日期格式化

    java正則實現(xiàn)各種日期格式化

    本文給大家分享的是使用java結(jié)合正則表達式來實現(xiàn)各種日期的格式化功能,代碼非常的簡單,有需要的小伙伴可以參考下。
    2015-05-05
  • 圖解JVM垃圾內(nèi)存回收算法

    圖解JVM垃圾內(nèi)存回收算法

    這篇文章主要介紹了圖解JVM垃圾內(nèi)存回收算法,由于年輕代堆空間的垃圾回收會很頻繁,因此其垃圾回收算法會更加重視回收效率,下面小編就和大家來一起學習一下吧
    2019-06-06
  • mybatis-plus復(fù)合主鍵的使用

    mybatis-plus復(fù)合主鍵的使用

    本文主要介紹了mybatis-plus復(fù)合主鍵的使用,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • IDEA連接mysql數(shù)據(jù)庫報錯的解決方法

    IDEA連接mysql數(shù)據(jù)庫報錯的解決方法

    這篇文章主要介紹了IDEA連接mysql數(shù)據(jù)庫報錯的解決方法,文中有非常詳細的圖文示例,對出現(xiàn)Server returns invalid timezone. Go to ‘Advanced‘ tab and set ‘serverTimezone‘ prope報錯的小伙伴們很有幫助喲,需要的朋友可以參考下
    2021-05-05
  • AsyncHttpClient的ConnectionSemaphore方法源碼流程解讀

    AsyncHttpClient的ConnectionSemaphore方法源碼流程解讀

    這篇文章主要為大家介紹了AsyncHttpClient的ConnectionSemaphore方法源碼流程解讀,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-12-12
  • Springboot連接和操作mongoDB方式

    Springboot連接和操作mongoDB方式

    這篇文章主要介紹了Springboot連接和操作mongoDB方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-01-01
  • 聊一聊concurrenthashmap的size方法原理

    聊一聊concurrenthashmap的size方法原理

    這篇文章主要介紹了concurrenthashmap的size方法原理,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-02-02
  • 淺談Java安全之C3P0鏈利用與分析

    淺談Java安全之C3P0鏈利用與分析

    本文主要介紹了淺談Java安全之C3P0鏈利用與分析,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-01-01
  • 詳解如何使用Java編寫圖形化的窗口

    詳解如何使用Java編寫圖形化的窗口

    這篇文章主要介紹了如何使用Java編寫圖形化的窗口,是Java的本地GUI軟件開發(fā)的基礎(chǔ),需要的朋友可以參考下
    2015-10-10

最新評論

隆回县| 巴塘县| 新巴尔虎左旗| 临城县| 花莲市| 天柱县| 怀远县| 六盘水市| 徐闻县| 镇沅| 神池县| 白玉县| 隆昌县| 玉树县| 木兰县| 丹棱县| 澜沧| 贞丰县| 永宁县| 南华县| 天镇县| 林甸县| 宣化县| 杭锦旗| 宁德市| 宁晋县| 揭东县| 陇川县| 永修县| 邯郸市| 嘉鱼县| 泗水县| 兴国县| 温泉县| 台东县| 浮梁县| 油尖旺区| 石渠县| 侯马市| 理塘县| 山阴县|