您好,登錄后才能下訂單哦!
這篇文章主要介紹“Spring @Profile注解如何使用”的相關知識,小編通過實際案例向大家展示操作過程,操作方法簡單快捷,實用性強,希望這篇“Spring @Profile注解如何使用”文章能幫助大家解決問題。
帶有@Profile的注解的bean的不會被注冊進IOC容器,需要為其設置環境變量激活,才能注冊進IOC容器,如下通過setActiveProfiles設置了dev值,那么這三個值所對應的Bean會被注冊進IOC容器。當然,我們在實際使用中,不會這樣去做,使用SpringBoot的話,我們一般是使用yml,在yml中配置spring.profiles.active
,也可以通過配置jvm參數。
我們可以直接通過Environment來設置環境屬性,這是比較原生的方法。
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(); context.getEnvironment().setActiveProfiles("dev");
可以通過JVM參數來設置環境變量的值,在開發中,這種方式也是使用得比較普遍。
在SpringBoot項目中,我們得配置項一般都是配置在yml文件中,這樣就能和代碼分開,并且也能進行動態配置。
從上面我們看出可以通過好幾種方式進行配置,但是他們最終其實都是將環境變量設置進Environment
中,這樣,spring在后續得流程里面,就能從Environment中獲取環境變量,然后進行相應的邏輯處理。
首先,需要注冊bean的元信息BeanDefinition,不過對于@Profile標注的方法,如果環境變量中有對應的變量值,那么就能注冊,沒有的話則不會進行注冊,我們來看關鍵的代碼,在ConfigurationClassBeanDefinitionReader中,有一個shouldSkip
判斷,它會篩選出符合的bean,不符合條件的bean則被加入skippedBeanMethods集合中,不會被注冊。
private void loadBeanDefinitionsForBeanMethod(BeanMethod beanMethod) { ConfigurationClass configClass = beanMethod.getConfigurationClass(); MethodMetadata metadata = beanMethod.getMetadata(); String methodName = metadata.getMethodName(); // Do we need to mark the bean as skipped by its condition? if (this.conditionEvaluator.shouldSkip(metadata, ConfigurationPhase.REGISTER_BEAN)) { configClass.skippedBeanMethods.add(methodName); return; } if (configClass.skippedBeanMethods.contains(methodName)) { return; } }
在shouldSkip中,會使用Condition接口,@Profile使用的是ProfileCondition
,然后調用matches
方法。
public boolean shouldSkip(@Nullable AnnotatedTypeMetadata metadata, @Nullable ConfigurationCondition.ConfigurationPhase phase) { for (Condition condition : conditions) { ConfigurationCondition.ConfigurationPhase requiredPhase = null; if (condition instanceof ConfigurationCondition configurationCondition) { requiredPhase = configurationCondition.getConfigurationPhase(); } if ((requiredPhase == null || requiredPhase == phase) && !condition.matches(this.context, metadata)) { return true; } } return false; }
在ProfileCondition的matches方法中,主要就是去Environment中尋找環境變量,然后解析@Profile注解設置的value值,如果Environment中激活的配置中包含當前的配置,包含則能為true,不包含則為false,如上通過setActiveProfiles設置Environment中激活的配置為dev,當前傳過來的配置為dev,那么就能匹配上,就能裝配進IOC容器。
public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) { MultiValueMap<String, Object> attrs = metadata.getAllAnnotationAttributes(Profile.class.getName()); if (attrs != null) { for (Object value : attrs.get("value")) { if (context.getEnvironment().acceptsProfiles(Profiles.of((String[]) value))) { return true; } } return false; } return true; }
從源碼可以看出,其最核心的思想就是是否注冊bean的元信息BeanDefinition,因為只有注冊了BeanDefinition,后續才能為創建bean提供元數據支持,判斷是否注冊bean元信息,主要就是從Environment中取出profiles的值,然后和@Profile注解設置的值進行匹配,匹配得上就注冊,bean不上就不注冊。
關于“Spring @Profile注解如何使用”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識,可以關注億速云行業資訊頻道,小編每天都會為大家更新不同的知識點。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。