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

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

 更新時間:2023年04月21日 08:34:07   作者:劉牌  
今天要分享的是Spring的注解@Conditional,@Conditional是一個條件注解,它的作用是判斷Bean是否滿足條件,本文詳細介紹了@Conditional注解的使用場景和源碼,需要的朋友可以參考一下

介紹

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

文件服務(wù)場景

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

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

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

編碼實現(xiàn)

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

文件上傳接口

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

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

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

以下是Minio的具體實現(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的作用就是判斷條件是否匹配,它實現(xiàn)Condition接口,要使用@Conditional,其判斷類必須要實現(xiàn)Condition接口,然后自己實現(xiàn)matches方法邏輯,以下就是判斷storageType是否為minio,如果為minio,那么就返回true,就代表要創(chuàng)建MinioStorageService這個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的時候,會判斷對應(yīng)的bean是否有@Conditional注解,如果有,則會進入value中的類,進去判斷是否符合條件,如果符合,則返回true,就能夠注冊,實際上如果符合條件,那么就能將BeanDefinition注冊進BeanFactory,如果不符合,自然不能注冊進。

如下是源碼的時序圖

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

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

總結(jié)

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

以上就是Spring很常用的@Conditional注解的使用場景和源碼解析的詳細內(nèi)容,更多關(guān)于Spring注解@Conditional的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 關(guān)于Java中修飾符的總結(jié)(fina除外)

    關(guān)于Java中修飾符的總結(jié)(fina除外)

    下面小編就為大家?guī)硪黄P(guān)于Java中修飾符的總結(jié)(fina除外)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-09-09
  • springboot中使用FastJson解決long類型在js中失去精度的問題

    springboot中使用FastJson解決long類型在js中失去精度的問題

    這篇文章主要介紹了springboot中使用FastJson解決long類型在js中失去精度的問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-06-06
  • Java無法獲取真實IP解決方案

    Java無法獲取真實IP解決方案

    這篇文章主要介紹了Java無法獲取真實IP解決方案,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-12-12
  • JAVAEE model1模型實現(xiàn)商品瀏覽記錄(去除重復(fù)的瀏覽記錄)(一)

    JAVAEE model1模型實現(xiàn)商品瀏覽記錄(去除重復(fù)的瀏覽記錄)(一)

    這篇文章主要為大家詳細介紹了JAVAEE model1模型實現(xiàn)商品瀏覽記錄,去除重復(fù)的瀏覽記錄,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-11-11
  • Java計算黑洞數(shù)的方法示例

    Java計算黑洞數(shù)的方法示例

    這篇文章主要介紹了Java計算黑洞數(shù)的方法,簡單描述了黑洞數(shù)的概念及具體計算方法,涉及java數(shù)值運算相關(guān)操作技巧,需要的朋友可以參考下
    2017-12-12
  • k8s部署MongDB全過程

    k8s部署MongDB全過程

    文章介紹了如何在Kubernetes集群中部署MongoDB,包括環(huán)境準(zhǔn)備、創(chuàng)建Secret、創(chuàng)建服務(wù)和Deployment,并通過Robo3T工具測試連接
    2025-01-01
  • JVM要雙親委派的原因及如何打破它

    JVM要雙親委派的原因及如何打破它

    平時做業(yè)務(wù)開發(fā)比較少接觸類加載器,但是如果想深入學(xué)習(xí),了解類加載的原理是必不可少的.java的類加載器有哪些?什么是雙親委派?為什么要雙親委派?如何打破它?接下來本文就帶大家詳細介紹這些知識 ,需要的朋友可以參考下
    2021-06-06
  • Java描述數(shù)據(jù)結(jié)構(gòu)學(xué)習(xí)之鏈表的增刪改查詳解

    Java描述數(shù)據(jù)結(jié)構(gòu)學(xué)習(xí)之鏈表的增刪改查詳解

    這篇文章主要給大家介紹了關(guān)于Java描述數(shù)據(jù)結(jié)構(gòu)學(xué)習(xí)之鏈表的增刪改查的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2018-05-05
  • SpringBoot使用quartz,注入feignClient,client為null問題

    SpringBoot使用quartz,注入feignClient,client為null問題

    在SpringBoot中使用Quartz和FeignClient時,如果通過@Autowired或構(gòu)造方法注入FeignClient導(dǎo)致為null,可以使用Spring提供的通過文件名獲取bean的方式解決,這種方法在Quartz啟動時通過反射注入類,而類還未初始化好,導(dǎo)致FeignClient為null的問題
    2024-11-11
  • 詳細分析java并發(fā)之volatile關(guān)鍵字

    詳細分析java并發(fā)之volatile關(guān)鍵字

    這篇文章主要介紹了java并發(fā)之volatile關(guān)鍵字的的相關(guān)資料,文中代碼非常詳細,幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下
    2020-06-06

最新評論

察雅县| 太仆寺旗| 鄂托克旗| 游戏| 哈密市| 镇沅| 津南区| 清徐县| 华宁县| 沂源县| 独山县| 山东| 新密市| 临澧县| 琼结县| 贵定县| 六盘水市| 澄迈县| 高要市| 华池县| 秦安县| 海门市| 芒康县| 宁远县| 石狮市| 玉屏| 西乡县| 凤翔县| 德化县| 凌云县| 梁山县| 周至县| 鄂尔多斯市| 延川县| 清徐县| 华容县| 灌阳县| 大竹县| 三江| 库车县| 隆昌县|