您好,登錄后才能下訂單哦!
這篇文章主要介紹“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的作用就是判斷條件是否匹配,它實現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會掃描工程路徑下的類,這個路徑可以通過@ComponentScan進行指定,如果是SpringBoot項目,則就為當前工程,然后篩選出需要注冊的bean并注冊到BeanFactory,對于標注有@Conditional注解的類,會進入@Conditional中value的類中,就是上面的MinioStorageCondition
或者FastDFSStorageCondition
,然后進行匹配,不滿足條件的則不會被注冊。
@Conditional的具體流程也比較簡單,就不一一贅述,可以看著上面的時序圖去看源碼實現。
關于“Spring的@Conditional注解怎么使用”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識,可以關注億速云行業資訊頻道,小編每天都會為大家更新不同的知識點。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。