SpringBoot中選擇性加載Bean的幾種方式小結(jié)
@ConditionalOnProperty
@ConditionalOnProperty,根據(jù)配置文件中指定的值決定是否加載,如下:
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.stereotype.Component; /** * 根據(jù)配置文件中指定的值決定是否加載; */ @Component @ConditionalOnProperty(name = "dev.name", havingValue = "hezy", matchIfMissing = true) public class OnProperty { }
參數(shù),其中:
- name/value:配置項(xiàng)名稱;
- havingValue:配置值;
- matchIfMissing:表示不存在該配置項(xiàng)時(shí),是否加載Bean,默認(rèn)false,需要注意,這里說(shuō)的是沒(méi)有該配置項(xiàng),而不是配置值對(duì)應(yīng)不上;
如上面的代碼,表示配置文件中存在dev.name配置項(xiàng),且值為hezy時(shí)加載Bean,沒(méi)有配置項(xiàng)的話加載;
application.yml,如下:
server: port: 7084 dev: name: "dev"
啟動(dòng)項(xiàng)目,不加載該Bean,因?yàn)榕渲庙?xiàng)的值對(duì)不上
@ConditionalOnJava
@ConditionalOnJava,根據(jù)Java版本決定是否加載,如下:
import org.springframework.boot.autoconfigure.condition.ConditionalOnJava; import org.springframework.boot.system.JavaVersion; import org.springframework.stereotype.Component; /** * 根據(jù)Java版本決定是否加載 */ @Component @ConditionalOnJava(JavaVersion.SEVENTEEN) public class OnJava { }
注解的參數(shù)只有一個(gè),即Java版本,如我IDEA中加載的JDK11,填JavaVersion.SEVENTEEN
,Java17,不會(huì)加載該Bean。但是如果設(shè)置的是JavaVersion.EIGHT
,則會(huì)加載Bean,也就說(shuō)這里向下兼容了。
(Java11)
(代碼設(shè)置的Java8)
import org.springframework.boot.autoconfigure.condition.ConditionalOnJava; import org.springframework.boot.system.JavaVersion; import org.springframework.stereotype.Component; /** * 根據(jù)Java版本決定是否加載 */ @Component @ConditionalOnJava(JavaVersion.EIGHT) public class OnJava { }
啟動(dòng)項(xiàng)目,加載了Bean
@ConditionalOnBean
@ConditionalOnBean,根據(jù)Spring容器中是否存在指定的Bean決定是否加載。有以下三種配置:
- 指定類:@ConditionalOnBean(OnJava.class)
- 指定Bean:@ConditionalOnBean(name = “onProperty”)
- 指定多個(gè)類:@ConditionalOnBean({OnProperty.class, OnJava.class})
如下,表示只有容器中存在OnJava.class的Bean時(shí)才加載
import org.springframework.boot.autoconfigure.condition.ConditionalOnBean; import org.springframework.stereotype.Component; /** * 根據(jù)Spring容器中是否存在指定的Bean決定是否加載 */ @Component @ConditionalOnBean(OnJava.class) public class OnBean { }
因?yàn)槿萜髦杏蠴nJava,所以O(shè)nBean也加載了;
@ConditionalOnMissingBean
@ConditionalOnMissingBean,根據(jù)Spring容器中是否不存在指定的Bean決定是否加載,與@ConditionalOnBean相反。也有以下三種配置方式:
- 指定類:@ConditionalOnMissingBean(OnJava.class)
- 指定Bean:@ConditionalOnMissingBean(name = “onProperty”)
- 指定多個(gè)類:@ConditionalOnMissingBean({OnProperty.class, OnJava.class})
如下,表示容器中OnJava、OnClass都不存在時(shí)才加載。注意如果指定多個(gè)類,它們的條件是 And 的關(guān)系,@ConditionalOnBean 也一樣。
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; import org.springframework.stereotype.Component; /** * 根據(jù)Spring容器中是否不存在指定的Bean決定是否加載 */ @Component @ConditionalOnMissingBean({OnJava.class, OnProperty.class}) public class OnMissingBean { }
如下,容器中沒(méi)有OnProperty,但是OnJava有,所以O(shè)nMissingBean也不加載,需要都不存在才加載
@ConditionalOnClass
@ConditionalOnClass,根據(jù)類是否存在指定的類來(lái)決定是否加載,有以下三種配置:
- 指定類:@ConditionalOnClass(OnJava.class);
- 指定類的全限定類名:@ConditionalOnClass(name = “com.hezy.bean.OnJava”)
- 指定多個(gè)類:@ConditionalOnClass({OnJava.class, OnClass.class})
需要和上面的指定OnBean區(qū)分開,指定Bean是需要類加載到容器里,即類上要打@Component、@Service、@Controller等這樣的注解,而OnClass就不用,只要你存在這樣的類文件即可。
如下,表示存在OnJava類加載
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; import org.springframework.stereotype.Component; /** * 根據(jù)類是否存在指定的類來(lái)決定是否加載 */ @Component @ConditionalOnClass(name = "com.hezy.bean.OnJava") public class OnClass { }
把OnJava類上的@Component注解去掉,啟動(dòng)項(xiàng)目
import org.springframework.boot.autoconfigure.condition.ConditionalOnJava; import org.springframework.boot.system.JavaVersion; /** * 根據(jù)Java版本決定是否加載 */ @ConditionalOnJava(JavaVersion.EIGHT) public class OnJava { }
可以看到,容器里沒(méi)有OnJava的Bean,但是OnClass加載了
@ConditionalOnMissingClass
@ConditionalOnMissingClass,根據(jù)類路徑中是否不存在指定的類來(lái)決定是否加載,與@ConditionalOnClass相反,配置方式有兩種:
- 指定類的全限定類名:@ConditionalOnMissingClass(“com.hezy.bean.OnJava”)
- 指定多個(gè)類:@ConditionalOnMissingClass({“com.hezy.bean.OnJava1”, “com.hezy.bean.OnJava2”})
為什么少了指定類,因?yàn)檫@里配置的是不存在的類,不存在的類,怎么寫 類名.class
(笑)
如下,表示不存在對(duì)應(yīng)路徑的OnJava1、OnJava2時(shí)才加載,配置多個(gè)類,是And的關(guān)系,即需要都不存在才加載;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingClass; import org.springframework.stereotype.Component; /** * 根據(jù)類路徑中是否不存在指定的類來(lái)決定是否加載 */ @Component @ConditionalOnMissingClass({"com.hezy.bean.OnJava1", "com.hezy.bean.OnJava2"}) public class OnMissingClass { }
因?yàn)榕渲玫念惗疾淮嬖?,所以加載了OnMissingClass
總結(jié)
本文介紹了Spring Boot中六種選擇性加載Bean的方式,按照配置文件加載Bean的方式用的最多。除此六種,Spring還支持其他方式,可在Spring Boot框架中用 @Conditional 為前綴搜索,如下:
以上就是SpringBoot中選擇性加載Bean的幾種方式小結(jié)的詳細(xì)內(nèi)容,更多關(guān)于SpringBoot選擇性加載Bean的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Spring?Security如何實(shí)現(xiàn)升級(jí)密碼加密方式詳解
這篇文章主要為大家介紹了Spring?Security實(shí)現(xiàn)升級(jí)密碼加密方式詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-01-0195%的Java程序員人都用不好Synchronized詳解
這篇文章主要為大家介紹了95%的Java程序員人都用不好Synchronized詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-03-03使用mybatis-plus分頁(yè)出現(xiàn)兩個(gè)Limit的問(wèn)題解決
在使用MyBatis-Plus進(jìn)行分頁(yè)查詢時(shí),可能會(huì)遇到查詢SQL中出現(xiàn)兩個(gè)limit語(yǔ)句的問(wèn)題,這通常是由于在多個(gè)模塊中重復(fù)引入了MyBatis-Plus的分頁(yè)插件所導(dǎo)致的,下面就來(lái)介紹一下如何解決,感興趣的可以了解一下2024-10-10Java實(shí)現(xiàn)AES算法的實(shí)例代碼
高級(jí)加密標(biāo)準(zhǔn)(AES,Advanced?Encryption?Standard)為最常見(jiàn)的對(duì)稱加密算法(微信小程序加密傳輸就是用這個(gè)加密算法的),本文重點(diǎn)給大家介紹Java實(shí)現(xiàn)AES算法的實(shí)例代碼,感興趣的朋友一起看看吧2022-02-02