Spring Boot中@ConditionalOnProperty的使用方法
前言
在Spring Boot的自動(dòng)配置中經(jīng)常看到@ConditionalOnProperty注解的使用,本篇文章帶大家來(lái)了解一下該注解的功能。下面話不多說(shuō)了,來(lái)一起看看詳細(xì)的介紹吧。
Spring Boot中的使用
在Spring Boot的源碼中,比如涉及到Http編碼的自動(dòng)配置、數(shù)據(jù)源類(lèi)型的自動(dòng)配置等大量的使用到了@ConditionalOnProperty的注解。
HttpEncodingAutoConfiguration類(lèi)中部分源代碼:
@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類(lèi)中部分代碼:
@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)配置類(lèi)中都通過(guò)@ConditionalOnProperty來(lái)控制自動(dòng)配置是否生效,下面我們來(lái)了解一下它的源碼和具體使用。
@ConditionalOnProperty源碼說(shuō)明
@ConditionalOnProperty注解類(lèi)源碼如下:
@Retention(RetentionPolicy.RUNTIME) @Target({ ElementType.TYPE, ElementType.METHOD }) @Documented @Conditional(OnPropertyCondition.class) public @interface ConditionalOnProperty { // 數(shù)組,獲取對(duì)應(yīng)property名稱(chēng)的值,與name不可同時(shí)使用 String[] value() default {}; // 配置屬性名稱(chēng)的前綴,比如spring.http.encoding String prefix() default ""; // 數(shù)組,配置屬性完整名稱(chēng)或部分名稱(chēng) // 可與prefix組合使用,組成完整的配置屬性名稱(chēng),與value不可同時(shí)使用 String[] name() default {}; // 可與name組合使用,比較獲取到的屬性值與havingValue給定的值是否相同,相同才加載配置 String havingValue() default ""; // 缺少該配置屬性時(shí)是否可以加載。如果為true,沒(méi)有該配置屬性時(shí)也會(huì)正常加載;反之則不會(huì)生效 boolean matchIfMissing() default false; }
其中在歷史版本中還存在一個(gè)relaxedNames屬性:
//是否可以松散匹配 boolean relaxedNames() default true;
最新版本中已經(jīng)不存在該屬性了。
通過(guò)注解ConditionalOnProperty上的@Conditional(OnPropertyCondition.class)代碼,可以看出ConditionalOnProperty屬于@Conditional的衍生注解。生效條件由OnPropertyCondition來(lái)進(jìn)行判斷。
使用方法
關(guān)于@ConditionalOnProperty的使用方法,我們?cè)谏厦娴腟pring Boot中的使用已經(jīng)看到。
@ConditionalOnProperty的核心功能是通過(guò)屬性name以及havingValue來(lái)實(shí)現(xiàn)的。
首先看matchIfMissing屬性,用來(lái)指定如果配置文件中未進(jìn)行對(duì)應(yīng)屬性配置時(shí)的默認(rèn)處理:默認(rèn)情況下matchIfMissing為false,也就是說(shuō)如果未進(jìn)行屬性配置,則自動(dòng)配置不生效。如果matchIfMissing為true,則表示如果沒(méi)有對(duì)應(yīng)的屬性配置,則自動(dòng)配置默認(rèn)生效。
下面看name屬性,name用來(lái)從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類(lèi)上的屬性配置發(fā)現(xiàn)并沒(méi)有完全按照上面所說(shuō)的name和havingValue配合使用。它是通過(guò)“prefix+value”作為屬性的名稱(chēng)來(lái)進(jìn)行配置:
spring.http.encoding.enabled=true
其中prefix指定了配置的統(tǒng)一前綴“spring.http.encoding”,而value指定了具體的屬性名稱(chēng)為“enabled”。這里并沒(méi)有設(shè)置havingValue的值,如果havingValue未指定值,默認(rèn)情況下在屬性配置中設(shè)置的值為true則生效(如上配置),false則不生效。
總結(jié)
以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,謝謝大家對(duì)腳本之家的支持。
相關(guān)文章
java不解壓直接讀取壓縮包中文件的實(shí)現(xiàn)方法
這篇文章主要介紹了java不解壓直接讀取壓縮包中文件的實(shí)現(xiàn)方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-04-04SpringMVC REST風(fēng)格深入詳細(xì)講解
這篇文章主要介紹了SpringMVC REST風(fēng)格,Rest全稱(chēng)為Representational State Transfer,翻譯為表現(xiàn)形式狀態(tài)轉(zhuǎn)換,它是一種軟件架構(gòu)2022-10-10解決SpringBoot在后臺(tái)接收前臺(tái)傳遞對(duì)象方式的問(wèn)題
這篇文章主要介紹了解決SpringBoot在后臺(tái)接收前臺(tái)傳遞對(duì)象方式的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2021-01-01spring單元測(cè)試下模擬rabbitmq的實(shí)現(xiàn)
這篇文章主要介紹了spring單元測(cè)試下模擬rabbitmq的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-05-05使用lombok注解導(dǎo)致mybatis-plus TypeHandler失效的解決
這篇文章主要介紹了使用lombok注解導(dǎo)致mybatis-plus TypeHandler失效的解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-07-07java中ThreadLocal的應(yīng)用場(chǎng)景實(shí)例分析
在本篇文章里小編給大家整理的是一篇關(guān)于java中ThreadLocal的應(yīng)用場(chǎng)景實(shí)例分析,對(duì)此有興趣的朋友們可以學(xué)習(xí)參考下。2021-02-02IntelliJ IDEA本地代碼覆蓋后恢復(fù)原來(lái)的代碼圖解
今天小編就為大家分享一篇關(guān)于IntelliJ IDEA本地代碼覆蓋后恢復(fù)原來(lái)的代碼圖解,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧2018-10-10JAVA WSIMPORT生成WEBSERVICE客戶端401認(rèn)證過(guò)程圖解
這篇文章主要介紹了JAVA WSIMPORT生成WEBSERVICE客戶端401認(rèn)證過(guò)程圖解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-10-10