最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

@Conditional注解的使用場景和源碼解析

 更新時(shí)間:2023年11月28日 09:49:32   作者:搬山道猿  
這篇文章主要介紹了@Conditional注解的使用場景和源碼解析,@Conditional是一個(gè)條件注解,它的作用是判斷Bean是否滿足條件,如果滿足條件,則將Bean注冊進(jìn)IOC中,如果不滿足條件,則不進(jìn)行注冊,需要的朋友可以參考下

介紹

今天要分享的是Spring的注解@Conditional,@Conditional是一個(gè)條件注解,它的作用是判斷Bean是否滿足條件,如果滿足條件,則將Bean注冊進(jìn)IOC中,如果不滿足條件,則不進(jìn)行注冊,這個(gè)注解在SpringBoot中衍生出很多注解,比如@ConditionalOnProperty,@ConditionalOnBean,@ConditionalOnClass等等,在SpringBoot中,這些注解用得很多。

文件服務(wù)場景

下面我們演示一些@Conditional的使用,在軟件開發(fā)中,文件系統(tǒng)是必須的,但是系統(tǒng)的特點(diǎn)不一樣,有些用戶希望將文件保存在自己的服務(wù)器上,有些用戶則沒這種要求,這時(shí)候,文件可以保存在云上,也可以保存在自建文件系統(tǒng)上,那么面對不同用戶的需求,我們的軟件也要能夠適配不同的環(huán)境,只需要簡單的配置即可。

假設(shè)我們在開發(fā)過程中,我們的文件全部托管在云服務(wù)廠商的OSS上,代碼邏輯也沒有預(yù)留擴(kuò)展,那么當(dāng)用戶需要私有化部署,我們可能就需要更改文件存儲(chǔ)這邊的邏輯,這樣的設(shè)計(jì)是不合理的。

我們想一想,文件存儲(chǔ)的代碼邏輯是不同的,各個(gè)文件系統(tǒng)的實(shí)現(xiàn)方式和使用API各不相同,但是它們有一個(gè)共性,那就是能夠上傳文件,下載文件的,所以我們就應(yīng)該抽象出一個(gè)公共接口,下面有不同的實(shí)現(xiàn),比如Minio的文件上傳下載等邏輯就使用Minio API去實(shí)現(xiàn),F(xiàn)astDFS就使用FastDFS,OSS就使用OSS,下面我們就編寫對應(yīng)的代碼。

編碼實(shí)現(xiàn)

以下通過編碼實(shí)現(xiàn)不同文件系統(tǒng)的邏輯實(shí)現(xiàn)隔離,統(tǒng)一提供接口的方案,一般我們都會(huì)將配置信息寫在配置文件中,在配置文件中,使用storageType代表文件存儲(chǔ)類型。

文件上傳接口

在StorageService接口中,只簡單定義了兩個(gè)方法init()和put(),init()就是做一些初始化操作,比如參數(shù)配置,連接等,put()就是上傳文件接口。

/**
 * 功能說明: 文件上傳接口
 * <p>
 * Original @Author: steakliu-劉牌, 2023-04-03  09:54
 * <p>
 */
public interface StorageService {
    /**
     * 初始化文件存儲(chǔ)
     */
    void init();
    /**
     * 上傳文件
     * @param file
     */
    void put(MultipartFile file);
}

具體文件系統(tǒng)實(shí)現(xiàn)

以下是Minio的具體實(shí)現(xiàn),在類上面使用了@Conditional注解,value值為MinioStorageCondition。

@Component
@Conditional(value = MinioStorageCondition.class)
public class MinioStorageService implements StorageService {
 
    @Override
    public void init() {
        // 初始化操作
    }
 
    @Override
    public void put(MultipartFile file) {
        
    }
}

MinioStorageCondition條件判斷

MinioStorageCondition的作用就是判斷條件是否匹配,它實(shí)現(xiàn)Condition接口,要使用@Conditional,其判斷類必須要實(shí)現(xiàn)Condition接口,然后自己實(shí)現(xiàn)matches方法邏輯,以下就是判斷storageType是否為minio,如果為minio,那么就返回true,就代表要?jiǎng)?chuàng)建MinioStorageService這個(gè)bean,為false則不創(chuàng)建。

public class MinioStorageCondition implements Condition {
    @Override
    public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
        String storageType = context.getEnvironment().getProperty("storageType");
        return "minio".equals(storageType);
    }
}

源碼解析

spring在掃描bean的時(shí)候,會(huì)判斷對應(yīng)的bean是否有@Conditional注解,如果有,則會(huì)進(jìn)入value中的類,進(jìn)去判斷是否符合條件,如果符合,則返回true,就能夠注冊,實(shí)際上如果符合條件,那么就能將BeanDefinition注冊進(jìn)BeanFactory,如果不符合,自然不能注冊進(jìn)。

如下是源碼的時(shí)序圖

從上面的時(shí)序圖中可以看出,整個(gè)過程涉及的類還是挺多的,不過這還不是完整流程,只是從掃描類開始,Spring會(huì)掃描工程路徑下的類,這個(gè)路徑可以通過@ComponentScan進(jìn)行指定,如果是SpringBoot項(xiàng)目,則就為當(dāng)前工程,然后篩選出需要注冊的bean并注冊到BeanFactory,對于標(biāo)注有@Conditional注解的類,會(huì)進(jìn)入@Conditional中value的類中,就是上面的MinioStorageCondition或者FastDFSStorageCondition,然后進(jìn)行匹配,不滿足條件的則不會(huì)被注冊。

@Conditional的具體流程也比較簡單,就不一一贅述,可以看著上面的時(shí)序圖去看源碼實(shí)現(xiàn)。

總結(jié)

上面對@Conditional的使用,原理等進(jìn)行簡單的介紹,@Conditional注解在SpringBoot中用得還是比較多的,特別是它衍生出來的一些注解,這些注解都是基于它來進(jìn)行二次封裝的,在SpringBoot中,對于很多starter,里面幾乎都會(huì)有@Conditional和@Conditional衍生注解的使用,我們后續(xù)會(huì)挑選出一些來說。

到此這篇關(guān)于@Conditional注解的使用場景和源碼解析的文章就介紹到這了,更多相關(guān)@Conditional注解內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • spring-gateway配置的實(shí)現(xiàn)示例

    spring-gateway配置的實(shí)現(xiàn)示例

    本文詳細(xì)介紹了Spring?Cloud?Gateway的核心配置結(jié)構(gòu),分為全局配置和路由配置兩大部分,下面就來詳細(xì)的介紹一下spring-gateway配置的實(shí)現(xiàn)示例,感興趣的可以了解一下
    2025-12-12
  • SpringBoot整合FreeMarker的過程詳解

    SpringBoot整合FreeMarker的過程詳解

    FreeMarker 是一個(gè)模板引擎,可以將模板與數(shù)據(jù)結(jié)合生成文本輸出,本文給大家介紹SpringBoot整合FreeMarker的過程,感興趣的朋友一起看看吧
    2024-01-01
  • 關(guān)于注解式的分布式Elasticsearch的封裝案例

    關(guān)于注解式的分布式Elasticsearch的封裝案例

    這篇文章主要介紹了關(guān)于注解式的分布式Elasticsearch的封裝案例,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-01-01
  • Java實(shí)現(xiàn)將byte[]轉(zhuǎn)換為File對象

    Java實(shí)現(xiàn)將byte[]轉(zhuǎn)換為File對象

    這篇文章將通過一個(gè)簡單的例子為大家演示Java如何實(shí)現(xiàn) byte[] 轉(zhuǎn)換為 File 對象,并將其上傳到外部服務(wù)器,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2025-03-03
  • 從0到1構(gòu)建springboot web應(yīng)用鏡像并使用容器部署的過程

    從0到1構(gòu)建springboot web應(yīng)用鏡像并使用容器部署的過程

    這篇文章主要介紹了從0到1構(gòu)建springboot web應(yīng)用鏡像并使用容器部署,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-03-03
  • springMVC如何對輸入數(shù)據(jù)校驗(yàn)實(shí)現(xiàn)代碼

    springMVC如何對輸入數(shù)據(jù)校驗(yàn)實(shí)現(xiàn)代碼

    數(shù)據(jù)的校驗(yàn)是交互式網(wǎng)站一個(gè)不可或缺的功能,數(shù)據(jù)驗(yàn)證分為客戶端驗(yàn)證和服務(wù)器端驗(yàn)證,這篇文章主要介紹了springMVC如何對輸入數(shù)據(jù)校驗(yàn),需要的朋友可以參考下
    2020-10-10
  • 使用JPA中@Query 注解實(shí)現(xiàn)update 操作方法(必看)

    使用JPA中@Query 注解實(shí)現(xiàn)update 操作方法(必看)

    下面小編就為大家?guī)硪黄褂肑PA中@Query 注解實(shí)現(xiàn)update 操作方法(必看)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-06-06
  • 一步步教你搭建Scala開發(fā)環(huán)境(非常詳細(xì)!)

    一步步教你搭建Scala開發(fā)環(huán)境(非常詳細(xì)!)

    Scala是一門基于jvm的函數(shù)式的面向?qū)ο缶幊陶Z言,擁有比java更加簡潔的語法,下面這篇文章主要給大家介紹了關(guān)于搭建Scala開發(fā)環(huán)境的相關(guān)資料,文中通過圖文介紹的非常詳細(xì),需要的朋友可以參考下
    2022-04-04
  • Springboot常用方法參數(shù)注解示例詳解

    Springboot常用方法參數(shù)注解示例詳解

    這篇文章主要介紹了Springboot常用方法參數(shù)注解及示例,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-08-08
  • springboot啟動(dòng)前執(zhí)行方法的四種方式總結(jié)

    springboot啟動(dòng)前執(zhí)行方法的四種方式總結(jié)

    這篇文章主要給大家介紹了關(guān)于springboot啟動(dòng)前執(zhí)行方法的四種方式,文中通過實(shí)例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2022-01-01

最新評論

闽清县| 故城县| 南和县| 浮梁县| 丹巴县| 藁城市| 忻州市| 临泽县| 垣曲县| 进贤县| 建德市| 商都县| 青海省| 丘北县| 山东| 安新县| 淮阳县| 永年县| 新沂市| 恩平市| 武鸣县| 潞城市| 延寿县| 龙江县| 昌乐县| 广汉市| 固安县| 丰原市| 那曲县| 饶河县| 工布江达县| 高要市| 茌平县| 南靖县| 龙南县| 岗巴县| 会同县| 荔波县| 许昌县| 吴川市| 乌兰察布市|