關(guān)于@ConditionalOnProperty的作用及用法說明
@ConditionalOnProperty作用及用法
在spring boot中有時候需要控制配置類是否生效,可以使用@ConditionalOnProperty注解來控制@Configuration是否生效.
通過其兩個屬性name以及havingValue來實現(xiàn)的,其中name用來從application.properties中讀取某個屬性值。
- 如果該值為空,則返回false;
- 如果值不為空,則將該值與havingValue指定的值進行比較,如果一樣則返回true;否則返回false。
- 如果返回值為false,則該configuration不生效;為true則生效。
例子1
@Configuration @ConditionalOnProperty(prefix = "filter",name = "loginFilter",havingValue = "true") public class FilterConfig { ?? ?//prefix為配置文件中的前綴, ?? ?//name為配置的名字 ?? ?//havingValue是與配置的值對比值,當(dāng)兩個值相同返回true,配置類生效. ? ? @Bean ? ? public FilterRegistrationBean getFilterRegistration() { ? ? ? ? FilterRegistrationBean filterRegistration ?= new FilterRegistrationBean(new LoginFilter()); ? ? ? ? filterRegistration.addUrlPatterns("/*"); ? ? ? ? return filterRegistration; ? ? } }
例子2
? ? @Bean ? ? @ConditionalOnProperty(name="spring.redis.host") ? ? RedissonClient redissonSingle() { ? ? ? ? Config config = new Config(); ? ? ? ? SingleServerConfig serverConfig = config.useSingleServer() ? ? ? ? ? ? ? ? .setAddress("redis://" + redssionProperties.getHost() + ":" + redssionProperties.getPort()) ? ? ? ? ? ? ? ? .setTimeout(redssionProperties.getTimeout()) ? ? ? ? ? ? ? ? .setConnectionPoolSize(redssionProperties.getConnectionPoolSize()) ? ? ? ? ? ? ? ? .setConnectionMinimumIdleSize(redssionProperties.getConnectionMinimumIdleSize()); ? ? ? ? if(StringUtils.isNotBlank(redssionProperties.getPassword())) { ? ? ? ? ? ? serverConfig.setPassword(redssionProperties.getPassword()); ? ? ? ? } ? ? ? ? return Redisson.create(config); ? ? }
@ConditionalOnProperty使用注意事項
前幾天使用@ConditionalOnProperty注解配置多個過濾器的過程中碰到了一個問題,在這里記錄下
先簡單介紹下@ConditionalOnProperty注解的功能吧,之后筆者再描述自身遇到的那些問題的時候,會更好理解一些
@ConditionalOnProperty的功能
它主要是通過自身的兩個屬性來控制自動配置是否生效,這兩個屬性分別是name、havingValue。只有當(dāng)配置文件(application.properties或者bootstrap.yml)中和name相同的屬性的值和注解上havingValue的值相同時,該配置文件才會生效,如下方代碼:
配置類
@ConditionalOnProperty(value = "muyichen.auth.test", havingValue = "true") @Component public class AuthorizationFilterImpl implements AuthorizationFilter { ?? ?//具體的過濾邏輯 }
配置文件
muyichen.auth.test=true
使用過程中遇到的問題
當(dāng)筆者嘗試給兩個以上的過濾器添加該屬性時,應(yīng)用程序啟動報錯,如下圖:
***************************
APPLICATION FAILED TO START
***************************Description:
Parameter 0 of method authorizationFilter in com.muyichen.demo.config.WebConfiguration required a single bean, but 2 were found:
造成這個問題的主要原因是:AuthorizationFilter是筆者自己定義的一個過濾器接口,它繼承了Filter接口,但并沒有做任何實現(xiàn),當(dāng)servlet開始識別過濾器時,由于AuthorizationFilter接口并沒有做主從讀取邏輯的配置,所以servlet無法判別哪個是主要的過濾器配置,當(dāng)幾個容器間的配置出現(xiàn)沖突時,無法判別以誰為主。
解決辦法
可以給某個主要的配置類加上@Primary注解來標(biāo)示出該配置類是主配置類,當(dāng)其它配置類與該類沖突時,以該類為主。這樣就可以解決上述問題了
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
Idea進行pull的時候Your local changes would be
這篇文章主要介紹了Idea進行pull的時候Your local changes would be overwritten by merge.具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-11-11關(guān)于Spring Bean實例過程中使用反射和遞歸處理的Bean屬性填充問題
本文帶領(lǐng)大家一起學(xué)習(xí)下在Spring Bean實例過程中如何使用反射和遞歸處理的Bean屬性填充,需要在類 AbstractAutowireCapableBeanFactory 的 createBean 方法中添加補全屬性方法,具體操作方法跟隨小編一起學(xué)習(xí)下吧2021-06-06詳解Java中的有參構(gòu)造方法與無參構(gòu)造方法
這篇文章主要詳細介紹了Java中有參構(gòu)造方法與無參構(gòu)造方法,文中有詳細的代碼示例,讓大家清晰明了的了解到有參構(gòu)造方法與無參構(gòu)造方法、以及應(yīng)用,需要的朋友可以參考下2023-06-06詳解Java中的File文件類以及FileDescriptor文件描述類
在Java中File類可以用來新建文件和目錄對象,而FileDescriptor類則被用來表示文件或目錄的可操作性,接下來我們就來詳解Java中的File文件類以及FileDescriptor文件描述類2016-06-06Java讀取txt文件中的數(shù)據(jù)賦給String變量方法
今天小編就為大家分享一篇Java讀取txt文件中的數(shù)據(jù)賦給String變量方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-07-07Java多線程執(zhí)行處理業(yè)務(wù)時間太久解決方法代碼示例
這篇文章主要介紹了Java多線程執(zhí)行處理業(yè)務(wù)時間太久解決方法代碼示例的相關(guān)資料,具有一定借鑒價值,需要的朋友可以參考下。2017-12-12Mybatis-Plus自動填充更新操作相關(guān)字段的實現(xiàn)
數(shù)據(jù)庫表中應(yīng)該都要有create_time、update_time字段;那么在開發(fā)中,對于這些共有字段的處理應(yīng)該要進行統(tǒng)一,這樣就可以簡化我們的開發(fā)過程。那么本文就對Mybatis-Plus中的字段自動填充進行記錄2021-11-11Javaweb基礎(chǔ)入門HTML之table與form
HTML的全稱為超文本標(biāo)記語言,是一種標(biāo)記語言。它包括一系列標(biāo)簽.通過這些標(biāo)簽可以將網(wǎng)絡(luò)上的文檔格式統(tǒng)一,使分散的Internet資源連接為一個邏輯整體。HTML文本是由HTML命令組成的描述性文本,HTML命令可以說明文字,圖形、動畫、聲音、表格、鏈接等2022-03-03