国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Spring @Profile注解使用和源碼解析

這篇具有很好參考價(jià)值的文章主要介紹了Spring @Profile注解使用和源碼解析。希望對大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

介紹

在之前的文章中,寫了一篇使用Spring @Profile實(shí)現(xiàn)開發(fā)環(huán)境,測試環(huán)境,生產(chǎn)環(huán)境的切換,之前的文章是使用SpringBoot項(xiàng)目搭建,實(shí)現(xiàn)了不同環(huán)境數(shù)據(jù)源的切換,在我們實(shí)際開發(fā)中,會(huì)分為dev,test,prod等環(huán)境,他們之間數(shù)獨(dú)立的,今天進(jìn)來詳解介紹Spring @Profile的原理。

# Spring注解@Profile實(shí)現(xiàn)開發(fā)環(huán)境,測試環(huán)境,生產(chǎn)環(huán)境的切換

使用

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

通過Environment設(shè)置profile

我們可以直接通過Environment來設(shè)置環(huán)境屬性,這是比較原生的方法。

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

通過JVM參數(shù)設(shè)置

可以通過JVM參數(shù)來設(shè)置環(huán)境變量的值,在開發(fā)中,這種方式也是使用得比較普遍。
Spring @Profile注解使用和源碼解析

SpringBoot通過yml進(jìn)行配置

在SpringBoot項(xiàng)目中,我們得配置項(xiàng)一般都是配置在yml文件中,這樣就能和代碼分開,并且也能進(jìn)行動(dòng)態(tài)配置。
Spring @Profile注解使用和源碼解析

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

源碼解析

BeanDefinition注冊

首先,需要注冊bean的元信息BeanDefinition,不過對于@Profile標(biāo)注的方法,如果環(huán)境變量中有對應(yīng)的變量值,那么就能注冊,沒有的話則不會(huì)進(jìn)行注冊,我們來看關(guān)鍵的代碼,在ConfigurationClassBeanDefinitionReader中,有一個(gè)shouldSkip判斷,它會(huì)篩選出符合的bean,不符合條件的bean則被加入skippedBeanMethods集合中,不會(huì)被注冊。

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中,會(huì)使用Condition接口,@Profile使用的是ProfileCondition,然后調(diào)用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中尋找環(huán)境變量,然后解析@Profile注解設(shè)置的value值,如果Environment中激活的配置中包含當(dāng)前的配置,包含則能為true,不包含則為false,如上通過setActiveProfiles設(shè)置Environment中激活的配置為dev,當(dāng)前傳過來的配置為dev,那么就能匹配上,就能裝配進(jìn)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,因?yàn)橹挥凶粤薆eanDefinition,后續(xù)才能為創(chuàng)建bean提供元數(shù)據(jù)支持,判斷是否注冊bean元信息,主要就是從Environment中取出profiles的值,然后和@Profile注解設(shè)置的值進(jìn)行匹配,匹配得上就注冊,bean不上就不注冊。

總結(jié)

上面我們對@Profile的使用做了詳細(xì)的介紹,并對它的核心源碼進(jìn)行解剖,無非就是判斷是否要注冊BeanDefinition,如果我們需要做一些環(huán)境隔離的工作,使用@Profile還是比較不錯(cuò)的。

今天的分享就到這里,感謝你的觀看,下期見!文章來源地址http://www.zghlxwxcb.cn/news/detail-412393.html

到了這里,關(guān)于Spring @Profile注解使用和源碼解析的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 【Spring MVC】Spring MVC的功能使用和相關(guān)注解介紹

    【Spring MVC】Spring MVC的功能使用和相關(guān)注解介紹

    Spring MVC主要有三個(gè)功能: 連接 獲取參數(shù) 輸出數(shù)據(jù) 對于 Spring MVC 來說,掌握了以上 3 個(gè)功能就相當(dāng)于掌握了Spring MVC。 連接的功能:將?戶(瀏覽器)和 Java 程序連接起來,也就是訪問?個(gè)地址能夠調(diào)?到我們的Spring 程序。 先創(chuàng)建一個(gè)SpringMVC項(xiàng)目,過程和SpringBoot項(xiàng)目創(chuàng)建相

    2024年02月16日
    瀏覽(22)
  • Spring Cache的介紹以及使用方法、常用注解

    Spring Cache是一個(gè)框架,實(shí)現(xiàn)了基于注解的緩存功能,只需要簡單地加一個(gè)注解,就能實(shí)現(xiàn)緩存功能. Spring Cache提供了一層抽象,底層可以切換不同的cache實(shí)現(xiàn)。具體就是通過CacheManager接口來統(tǒng)一不同的緩存技術(shù)。 CacheManager是Spring提供的各種緩存技術(shù)抽象接口。 針對不同的緩存

    2024年02月16日
    瀏覽(38)
  • 【微服務(wù)】Spring條件注解從使用到源碼分析詳解

    【微服務(wù)】Spring條件注解從使用到源碼分析詳解

    ??歡迎來到架構(gòu)設(shè)計(jì)專欄~【微服務(wù)】Spring條件注解從使用到源碼分析詳解 ☆* o(≧▽≦)o *☆嗨~我是IT·陳寒?? ?博客主頁:IT·陳寒的博客 ??該系列文章專欄:架構(gòu)設(shè)計(jì) ??其他專欄:Java學(xué)習(xí)路線 Java面試技巧 Java實(shí)戰(zhàn)項(xiàng)目 AIGC人工智能 數(shù)據(jù)結(jié)構(gòu)學(xué)習(xí) ??文章作者技術(shù)和水平

    2024年02月08日
    瀏覽(19)
  • 【微服務(wù)】spring 條件注解從使用到源碼分析詳解

    目錄 一、前言 二、spring 條件注解概述 2.1 條件注解@Conditional介紹 2.2 @Conditional擴(kuò)展注解

    2024年02月11日
    瀏覽(23)
  • Spring注解 @EventListener 的介紹與使用示例以及異常處理

    用途 將一個(gè)方法標(biāo)記為監(jiān)聽器,用于監(jiān)聽?wèi)?yīng)用程序事件,事件可以是 ApplicationEvent 實(shí)例,也可以是其他任意的對象。 如果一個(gè)監(jiān)聽器(被標(biāo)注的方法)只支持單一的事件類型,那么該方法可以聲明一個(gè)唯一的參數(shù)用來反映要監(jiān)聽的事件類型。 如果一個(gè)監(jiān)聽器(被標(biāo)注的方法

    2024年01月15日
    瀏覽(49)
  • Spring Boot中@RabbitHandler注解的介紹、原理和使用

    Spring Boot中@RabbitHandler注解的介紹、原理和使用

    在RabbitMQ中,消息的消費(fèi)者需要根據(jù)不同的消息類型進(jìn)行不同的處理。在Spring Boot中,我們可以通過 @RabbitHandler 注解來實(shí)現(xiàn)這一功能。本文將介紹Spring Boot中 @RabbitHandler 注解的介紹、原理和使用方法。 @RabbitHandler 注解是Spring AMQP提供的一種消費(fèi)消息的方式。通過在消息監(jiān)聽方

    2024年02月09日
    瀏覽(24)
  • 全面掌握Spring框架:深入解析IOC、AOP、事務(wù)管理與注解使用

    全面掌握Spring框架:深入解析IOC、AOP、事務(wù)管理與注解使用

    探索Spring框架的深層次知識(shí),包括Spring IOC容器的初始化流程、AOP的實(shí)現(xiàn)機(jī)制、事務(wù)管理的細(xì)節(jié)、循環(huán)依賴問題的處理、條件注解的應(yīng)用、JavaConfig的使用方法、PostProcessor的角色、@Autowired和@Value注解的高級(jí)應(yīng)用,以及${}與#{}的區(qū)別。

    2024年03月13日
    瀏覽(33)
  • 深入解析Spring Boot中的注解@PathVariable、@RequestParam、@RequestBody的正確使用

    深入解析Spring Boot中的注解@PathVariable、@RequestParam、@RequestBody的正確使用

    ??深入解析Spring Boot中的注解@PathVariable、@RequestParam、@RequestBody的正確使用 ☆* o(≧▽≦)o *☆嗨~我是IT·陳寒?? ?博客主頁:IT·陳寒的博客 ??該系列文章專欄:架構(gòu)設(shè)計(jì) ??其他專欄:Java學(xué)習(xí)路線 Java面試技巧 Java實(shí)戰(zhàn)項(xiàng)目 AIGC人工智能 數(shù)據(jù)結(jié)構(gòu)學(xué)習(xí) ??文章作者技術(shù)和水平

    2024年02月04日
    瀏覽(24)
  • Spring Boot學(xué)習(xí)隨筆- 集成JSP模板(配置視圖解析器)、整合Mybatis(@MapperScan注解的使用)

    Spring Boot學(xué)習(xí)隨筆- 集成JSP模板(配置視圖解析器)、整合Mybatis(@MapperScan注解的使用)

    學(xué)習(xí)視頻:【編程不良人】2021年SpringBoot最新最全教程 在main創(chuàng)建webapp,然后創(chuàng)建index.jsp進(jìn)行測試,在訪問之前需要進(jìn)行一個(gè)設(shè)置,否則springboot是找不到j(luò)sp頁面的 修改jsp無需重啟應(yīng)用 數(shù)據(jù)庫訪問框架:hibernate、jpa、mybatis【主流】 SpringBoot(微框架) = Spring(工廠) + SpringMV

    2024年02月05日
    瀏覽(58)
  • SpringBoot復(fù)習(xí):(7)@Profile注解

    其中,student這個(gè)bean只有指定了profile才會(huì)裝配,比如在application.properties中: @Profile注解不僅可以用在@Bean上,還可以用在注解類上,用在注解類時(shí) 只有設(shè)定了profile為指定的值,該配置類中的所有bean才會(huì)裝配

    2024年02月15日
    瀏覽(17)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包