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

溫馨提示×

溫馨提示×

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

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

Spring?@Profile注解如何使用

發布時間:2023-04-14 11:48:38 來源:億速云 閱讀:148 作者:iii 欄目:開發技術

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

    使用

    帶有@Profile的注解的bean的不會被注冊進IOC容器,需要為其設置環境變量激活,才能注冊進IOC容器,如下通過setActiveProfiles設置了dev值,那么這三個值所對應的Bean會被注冊進IOC容器。當然,我們在實際使用中,不會這樣去做,使用SpringBoot的話,我們一般是使用yml,在yml中配置spring.profiles.active,也可以通過配置jvm參數。

    通過Environment設置profile

    我們可以直接通過Environment來設置環境屬性,這是比較原生的方法。

    AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext();
    context.getEnvironment().setActiveProfiles("dev");

    通過JVM參數設置

    可以通過JVM參數來設置環境變量的值,在開發中,這種方式也是使用得比較普遍。

    Spring?@Profile注解如何使用

    SpringBoot通過yml進行配置

    在SpringBoot項目中,我們得配置項一般都是配置在yml文件中,這樣就能和代碼分開,并且也能進行動態配置。

    Spring?@Profile注解如何使用

    從上面我們看出可以通過好幾種方式進行配置,但是他們最終其實都是將環境變量設置進Environment中,這樣,spring在后續得流程里面,就能從Environment中獲取環境變量,然后進行相應的邏輯處理。

    源碼解析

    BeanDefinition注冊

    首先,需要注冊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源碼

    在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匹配

    在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注解如何使用”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識,可以關注億速云行業資訊頻道,小編每天都會為大家更新不同的知識點。

    向AI問一下細節

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

    AI

    武宣县| 西青区| 册亨县| 菏泽市| 兰坪| 厦门市| 武邑县| 潼关县| 葵青区| 蓬莱市| 东乌| 伊宁县| 阜阳市| 镇雄县| 洮南市| 湾仔区| 容城县| 阳春市| 独山县| SHOW| 房山区| 四平市| 白城市| 南靖县| 武宣县| 临清市| 孙吴县| 资讯| 三台县| 湖北省| 抚松县| 石阡县| 四会市| 大埔区| 柘荣县| 平山县| 东宁县| 华宁县| 大厂| 安达市| 奉新县|