Spring Boot中@ConditionalOnProperty的使用方法
前言
在Spring Boot的自動配置中經常看到@ConditionalOnProperty注解的使用,本篇文章帶大家來了解一下該注解的功能。下面話不多說了,來一起看看詳細的介紹吧。
Spring Boot中的使用
在Spring Boot的源碼中,比如涉及到Http編碼的自動配置、數據源類型的自動配置等大量的使用到了@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 {
// 省略內部代碼
}
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 {
// 省略內部代碼
}
很顯然,以上兩個自動配置類中都通過@ConditionalOnProperty來控制自動配置是否生效,下面我們來了解一下它的源碼和具體使用。
@ConditionalOnProperty源碼說明
@ConditionalOnProperty注解類源碼如下:
@Retention(RetentionPolicy.RUNTIME)
@Target({ ElementType.TYPE, ElementType.METHOD })
@Documented
@Conditional(OnPropertyCondition.class)
public @interface ConditionalOnProperty {
// 數組,獲取對應property名稱的值,與name不可同時使用
String[] value() default {};
// 配置屬性名稱的前綴,比如spring.http.encoding
String prefix() default "";
// 數組,配置屬性完整名稱或部分名稱
// 可與prefix組合使用,組成完整的配置屬性名稱,與value不可同時使用
String[] name() default {};
// 可與name組合使用,比較獲取到的屬性值與havingValue給定的值是否相同,相同才加載配置
String havingValue() default "";
// 缺少該配置屬性時是否可以加載。如果為true,沒有該配置屬性時也會正常加載;反之則不會生效
boolean matchIfMissing() default false;
}
其中在歷史版本中還存在一個relaxedNames屬性:
//是否可以松散匹配 boolean relaxedNames() default true;
最新版本中已經不存在該屬性了。
通過注解ConditionalOnProperty上的@Conditional(OnPropertyCondition.class)代碼,可以看出ConditionalOnProperty屬于@Conditional的衍生注解。生效條件由OnPropertyCondition來進行判斷。
使用方法
關于@ConditionalOnProperty的使用方法,我們在上面的Spring Boot中的使用已經看到。
@ConditionalOnProperty的核心功能是通過屬性name以及havingValue來實現的。
首先看matchIfMissing屬性,用來指定如果配置文件中未進行對應屬性配置時的默認處理:默認情況下matchIfMissing為false,也就是說如果未進行屬性配置,則自動配置不生效。如果matchIfMissing為true,則表示如果沒有對應的屬性配置,則自動配置默認生效。
下面看name屬性,name用來從application.properties中讀取某個屬性值。比如上面Tomcat的自動配置在配置文件為:
spring.datasource.type=org.apache.tomcat.jdbc.pool.DataSource
在matchIfMissing為false時,如果name值為空,則返回false;如果name不為空,則將該值與havingValue指定的值進行比較,如果一樣則返回true,否則返回false。返回false也就意味著自動配置不會生效。
但是如果看HttpEncodingAutoConfiguration類上的屬性配置發(fā)現并沒有完全按照上面所說的name和havingValue配合使用。它是通過“prefix+value”作為屬性的名稱來進行配置:
spring.http.encoding.enabled=true
其中prefix指定了配置的統(tǒng)一前綴“spring.http.encoding”,而value指定了具體的屬性名稱為“enabled”。這里并沒有設置havingValue的值,如果havingValue未指定值,默認情況下在屬性配置中設置的值為true則生效(如上配置),false則不生效。
總結
以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,謝謝大家對腳本之家的支持。
相關文章
Java concurrency之CountDownLatch原理和示例_動力節(jié)點Java學院整理
CountDownLatch是一個同步輔助類,在完成一組正在其他線程中執(zhí)行的操作之前,它允許一個或多個線程一直等待。 下面通過本文給大家分享Java concurrency之CountDownLatch原理和示例,需要的的朋友參考下吧2017-06-06
SpringBoot下無節(jié)制和數據庫建立連接的問題及解決方法
本文介紹了無節(jié)制建立MySQL連接的危害,包括數據庫服務端資源耗盡、應用端性能劣化和監(jiān)控與運維困境,提出了系統(tǒng)性解決方案,包括連接池標準化配置、代碼規(guī)范與防御式編程、全鏈路監(jiān)控體系和架構級優(yōu)化,感興趣的朋友一起看看吧2025-03-03
關于Java錯誤提示之找不到或無法加載主類的問題及正確處理方法
當我們在初學Java的是時候,類文件中是不設定包名(package)的,這種情況下注意classpath,基本上沒有問題,?本文主要說明classpath和系統(tǒng)環(huán)境變量PATH都沒問題的情況下出錯原因和正確處理方法,感興趣的朋友一起看看吧2022-01-01
SpringBoot整合Caffeine實現本地緩存的實踐分享
緩存是提升系統(tǒng)性能的一個不可或缺的工具,通過緩存可以避免大部分重復的請求到數據庫層,減少IO鏈接次數,提升整體的響應速率,本地緩存中比較常見的比如 Caffeine 緩存,這篇文章將結合具體的 Springboot 項目搭配 Caffeine 實現本地緩存的各種使用方式2024-07-07

