91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Spring的@Conditional注解怎么使用

發布時間:2023-05-06 16:30:34 來源:億速云 閱讀:154 作者:iii 欄目:開發技術

這篇文章主要介紹“Spring的@Conditional注解怎么使用”的相關知識,小編通過實際案例向大家展示操作過程,操作方法簡單快捷,實用性強,希望這篇“Spring的@Conditional注解怎么使用”文章能幫助大家解決問題。

介紹

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

文件服務場景

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

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

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

編碼實現

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

文件上傳接口

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

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

具體文件系統實現

以下是Minio的具體實現,在類上面使用了@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的作用就是判斷條件是否匹配,它實現Condition接口,要使用@Conditional,其判斷類必須要實現Condition接口,然后自己實現matches方法邏輯,以下就是判斷storageType是否為minio,如果為minio,那么就返回true,就代表要創建MinioStorageService這個bean,為false則不創建。

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的時候,會判斷對應的bean是否有@Conditional注解,如果有,則會進入value中的類,進去判斷是否符合條件,如果符合,則返回true,就能夠注冊,實際上如果符合條件,那么就能將BeanDefinition注冊進BeanFactory,如果不符合,自然不能注冊進。

如下是源碼的時序圖

Spring的@Conditional注解怎么使用

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

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

關于“Spring的@Conditional注解怎么使用”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識,可以關注億速云行業資訊頻道,小編每天都會為大家更新不同的知識點。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

新化县| 成都市| 玉溪市| 漠河县| 永靖县| 湟中县| 桦南县| 吉林市| 山西省| 阜阳市| 响水县| 泗阳县| 山东| 永登县| 和顺县| 张掖市| 马龙县| 阜宁县| 拉孜县| 尤溪县| 东乡族自治县| 张家川| 安图县| 遂宁市| 巨鹿县| 汉中市| 麻城市| 宁南县| 区。| 吐鲁番市| 龙泉市| 竹山县| 南平市| 筠连县| 登封市| 花垣县| 分宜县| 长乐市| 道真| 绥阳县| 平邑县|