小編給大家分享一下SpringBoot中@ConditionalOnProperty怎么用,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!
創(chuàng)新互聯(lián)公司憑借專業(yè)的設(shè)計(jì)團(tuán)隊(duì)扎實(shí)的技術(shù)支持、優(yōu)質(zhì)高效的服務(wù)意識(shí)和豐厚的資源優(yōu)勢(shì),提供專業(yè)的網(wǎng)站策劃、網(wǎng)站設(shè)計(jì)制作、成都做網(wǎng)站、網(wǎng)站優(yōu)化、軟件開發(fā)、網(wǎng)站改版等服務(wù),在成都10余年的網(wǎng)站建設(shè)設(shè)計(jì)經(jīng)驗(yàn),為成都上千多家中小型企業(yè)策劃設(shè)計(jì)了網(wǎng)站。
Spring Boot中的使用
在Spring Boot的源碼中,比如涉及到Http編碼的自動(dòng)配置、數(shù)據(jù)源類型的自動(dòng)配置等大量的使用到了@ConditionalOnProperty的注解。
HttpEncodingAutoConfiguration類中部分源代碼:
@Configuration(proxyBeanMethods = false)@EnableConfigurationProperties(HttpProperties.class)@ConditionalOnWebApplication(type = ConditionalOnWebApplication.Type.SERVLET)@ConditionalOnClass(CharacterEncodingFilter.class)@ConditionalOnProperty(prefix = "spring.http.encoding", value = "enabled", matchIfMissing = true)public class HttpEncodingAutoConfiguration { // 省略內(nèi)部代碼}
DataSourceConfiguration類中部分代碼:
@Configuration(proxyBeanMethods = false)@ConditionalOnClass(org.apache.tomcat.jdbc.pool.DataSource.class)@ConditionalOnMissingBean(DataSource.class)@ConditionalOnProperty(name = "spring.datasource.type", havingValue = "org.apache.tomcat.jdbc.pool.DataSource", matchIfMissing = true)static class Tomcat { // 省略內(nèi)部代碼}
很顯然,以上兩個(gè)自動(dòng)配置類中都通過@ConditionalOnProperty來控制自動(dòng)配置是否生效,下面我們來了解一下它的源碼和具體使用。
@ConditionalOnProperty源碼說明
@ConditionalOnProperty注解類源碼如下:
@Retention(RetentionPolicy.RUNTIME)@Target({ ElementType.TYPE, ElementType.METHOD })@Documented@Conditional(OnPropertyCondition.class)public @interface ConditionalOnProperty { // 數(shù)組,獲取對(duì)應(yīng)property名稱的值,與name不可同時(shí)使用 String[] value() default {}; // 配置屬性名稱的前綴,比如spring.http.encoding String prefix() default ""; // 數(shù)組,配置屬性完整名稱或部分名稱 // 可與prefix組合使用,組成完整的配置屬性名稱,與value不可同時(shí)使用 String[] name() default {}; // 可與name組合使用,比較獲取到的屬性值與havingValue給定的值是否相同,相同才加載配置 String havingValue() default ""; // 缺少該配置屬性時(shí)是否可以加載。如果為true,沒有該配置屬性時(shí)也會(huì)正常加載;反之則不會(huì)生效 boolean matchIfMissing() default false;}
其中在歷史版本中還存在一個(gè)relaxedNames屬性:
//是否可以松散匹配boolean relaxedNames() default true;
最新版本中已經(jīng)不存在該屬性了。
通過注解ConditionalOnProperty上的@Conditional(OnPropertyCondition.class)代碼,可以看出ConditionalOnProperty屬于@Conditional的衍生注解。生效條件由OnPropertyCondition來進(jìn)行判斷。
使用方法
關(guān)于@ConditionalOnProperty的使用方法,我們?cè)谏厦娴腟pring Boot中的使用已經(jīng)看到。
@ConditionalOnProperty的核心功能是通過屬性name以及havingValue來實(shí)現(xiàn)的。
首先看matchIfMissing屬性,用來指定如果配置文件中未進(jìn)行對(duì)應(yīng)屬性配置時(shí)的默認(rèn)處理:默認(rèn)情況下matchIfMissing為false,也就是說如果未進(jìn)行屬性配置,則自動(dòng)配置不生效。如果matchIfMissing為true,則表示如果沒有對(duì)應(yīng)的屬性配置,則自動(dòng)配置默認(rèn)生效。
下面看name屬性,name用來從application.properties中讀取某個(gè)屬性值。比如上面Tomcat的自動(dòng)配置在配置文件為:
spring.datasource.type=org.apache.tomcat.jdbc.pool.DataSource
在matchIfMissing為false時(shí),如果name值為空,則返回false;如果name不為空,則將該值與havingValue指定的值進(jìn)行比較,如果一樣則返回true,否則返回false。返回false也就意味著自動(dòng)配置不會(huì)生效。
但是如果看HttpEncodingAutoConfiguration類上的屬性配置發(fā)現(xiàn)并沒有完全按照上面所說的name和havingValue配合使用。它是通過“prefix+value”作為屬性的名稱來進(jìn)行配置:
spring.http.encoding.enabled=true
其中prefix指定了配置的統(tǒng)一前綴“spring.http.encoding”,而value指定了具體的屬性名稱為“enabled”。這里并沒有設(shè)置havingValue的值,如果havingValue未指定值,默認(rèn)情況下在屬性配置中設(shè)置的值為true則生效(如上配置),false則不生效。
以上是“SpringBoot中@ConditionalOnProperty怎么用”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對(duì)大家有所幫助,如果還想學(xué)習(xí)更多知識(shí),歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道!
新聞名稱:SpringBoot中@ConditionalOnProperty怎么用
分享路徑:http://chinadenli.net/article2/gidiic.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供靜態(tài)網(wǎng)站、面包屑導(dǎo)航、網(wǎng)站維護(hù)、商城網(wǎng)站、企業(yè)網(wǎng)站制作、企業(yè)建站
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)