最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Spring @Value的注解使用和原理解析

 更新時(shí)間:2023年06月16日 09:25:37   作者:劉牌  
@Value注解在Spring開發(fā)中是一個(gè)使用很頻繁的注解,在項(xiàng)目開發(fā)中,我們通常需要讀取配置文件中的一些信息,當(dāng)然,@Value不單單能讀取配置文件,還能讀取系統(tǒng)屬性,還可以讀取其他bean的屬性,本章就來詳細(xì)介紹@Value注解的使用和對(duì)源碼進(jìn)行分析

介紹

@Value注解在Spring開發(fā)中是一個(gè)使用很頻繁的注解,在項(xiàng)目開發(fā)中,我們通常需要讀取配置文件中的一些信息,對(duì)于SpringBoot項(xiàng)目,我們一般從yml文件中讀取,如果我們自定義了配置文件,那么就可以配合@PropertySource注解來獲取配置文件的配置項(xiàng),當(dāng)然,@Value不單單能讀取配置文件,還能讀取系統(tǒng)屬性,還可以讀取其他bean的屬性,本章就來詳細(xì)介紹@Value注解的使用和對(duì)源碼進(jìn)行分析。

使用

如下我們對(duì)value的使用進(jìn)行詳細(xì)介紹,value可以注入配置文件的屬性,注入其它bean的屬性,注冊(cè)spring中自己實(shí)現(xiàn)的一些屬性,比如操作系統(tǒng)信息。

屬性類

MyProperties是一個(gè)bean,里面定義了一些屬性,一般在項(xiàng)目中,如果需要全局使用某個(gè)配置信息,我們通常會(huì)定義一個(gè)屬性類,然后在需要使用的地方直接注入,比如系統(tǒng)中我們需要存儲(chǔ)大量的文件,文件是存儲(chǔ)在文件服務(wù)器上面,數(shù)據(jù)庫只存儲(chǔ)文件所在文件系統(tǒng)的目錄路徑,而不會(huì)存儲(chǔ)具體的ip地址,如果我們存儲(chǔ)了能直接訪問文件的鏈接,后續(xù)如果進(jìn)行文件遷移,那么這些鏈接就不好處理,所以應(yīng)該只存儲(chǔ)文件在文件服務(wù)器的目錄路徑,那么返回給前端顯示的時(shí)候,再獲取文件服務(wù)器地址進(jìn)行拼接就可以。

/**
 * 功能說明: 屬性配置類
 * <p>
 * Original @Author: steakliu-劉牌, 2023-04-27  10:08
 * <p>
 * Copyright (C)2020-2022  steakliu All rights reserved.
 */
@Data
@Component
public class MyProperties {
    /**
     * 注入其他bean的屬性
     */
    @Value("#{valueBean.username}")
    private String username;
    /**
     * 注入配置文件屬性
     */
     @Value("${minio.url}")
    private String minioUrl;
    /**
     * 注入操作系統(tǒng)屬性
     */
    @Value("#{systemProperties['os.name']}")
    private String os;
}

配置類

配置類主要就是使用@PropertySource注解來獲取配置配置文件的屬性。

@Configuration
@PropertySource("classpath:minio.properties")
public class ValueConfiguration {
}

配置文件minio.properties

配置文件里面就放了一個(gè)minio的地址

minio.url=http://www.gss.cn/

通過上面的配置,我們就可以在需要使用minio地址的地方注入MyProperties這bean就可以,可能有些人會(huì)覺得麻煩,還需要注入bean,直接寫在一個(gè)常量里面不就行,其實(shí)不然,這樣做更加的規(guī)范,做到了配置和代碼的分離,不同的環(huán)境的地址不同,或者發(fā)生文件遷移,就可以直接修改配置文件,還有配置文件可以寫入注冊(cè)中心,可以更具一定的策略進(jìn)行修改后刷新,@Value注解只是獲取配置文件屬性的一種方式,在SpringBoot中,@ConfigurationProperties使用起來也很方便。

原理解析

下面對(duì)@Value的原理進(jìn)行解析,因?yàn)槲覀兪褂聾Value大多時(shí)候是放在字段上面,并且要使用在一個(gè)Bean中,那么我們知道bean在實(shí)例化的時(shí)候需要進(jìn)行屬性填充,就會(huì)對(duì)這些屬性進(jìn)行賦值,所以下面就從實(shí)例化bean開始對(duì)@Value進(jìn)行解析。

解析屬性

我們從AbstractAutowireCapableBeanFactory類這里開始,在類中進(jìn)入doCreateBean()方法,然后進(jìn)入applyMergedBeanDefinitionPostProcessors,最終會(huì)進(jìn)入AutowiredAnnotationBeanPostProcessor后置處理器中,@Autowired,@Value,@Inject都是它進(jìn)行處理,下面我們看最主要的部分buildAutowiringMetadata。

如下代碼,Spring使用反射獲取字段,如果是字段被static修飾,那么在此處是會(huì)被排除,使用的是Modifier.isStatic(int mod)方法,通過反射拿到字段后,組裝后加入一個(gè)名字為injectionMetadataCache的Map中,后面屬性填充會(huì)直接從這個(gè)緩存中獲取。

private InjectionMetadata buildAutowiringMetadata(Class<?> clazz) {
        List<InjectionMetadata.InjectedElement> elements = new ArrayList<>();
        Class<?> targetClass = clazz;
        do {
            final List<InjectionMetadata.InjectedElement> currElements = new ArrayList<>();
            ReflectionUtils.doWithLocalFields(targetClass, field -> {
                MergedAnnotation<?> ann = findAutowiredAnnotation(field);
                if (ann != null) {
                    if (Modifier.isStatic(field.getModifiers())) {
                        if (logger.isInfoEnabled()) {
                            logger.info("Autowired annotation is not supported on static fields: " + field);
                        }
                        return;
                    }
                    boolean required = determineRequiredStatus(ann);
                    currElements.add(new AutowiredAnnotationBeanPostProcessor.AutowiredFieldElement(field, required));
                }
            });
        }
        while (targetClass != null && targetClass != Object.class);
        return InjectionMetadata.forElements(elements, clazz);
    }

屬性填充

屬性填充階段進(jìn)入的是對(duì)bean的屬性進(jìn)行賦值,這是Spring生命周期中很重要的一個(gè)階段,方法是populateBean,也在AbstractAutowireCapableBeanFactory類中,接著會(huì)調(diào)用AutowiredAnnotationBeanPostProcessor中的postProcessProperties方法,然后往下繼續(xù)執(zhí)行,核心代碼如下,如下就是給每個(gè)屬性賦值,往下執(zhí)行還有很多邏輯處理,如解析@Value注解的表達(dá)式,然后根據(jù)表達(dá)式去獲取對(duì)應(yīng)的值等,就不深入去解析。

    protected void inject(Object bean, @Nullable String beanName, @Nullable PropertyValues pvs) throws Throwable {
        Field field = (Field) this.member;
        Object value;
        if (this.cached) {
            try {
                value = resolvedCachedArgument(beanName, this.cachedFieldValue);
            } catch (NoSuchBeanDefinitionException ex) {
                // Unexpected removal of target bean for cached argument -> re-resolve
                value = resolveFieldValue(field, bean, beanName);
            }
        } else {
            value = resolveFieldValue(field, bean, beanName);
        }
        if (value != null) {
            ReflectionUtils.makeAccessible(field);
            field.set(bean, value);
        }
    }

總結(jié)

上面對(duì)@Value的使用和原理進(jìn)行了介紹,其實(shí)@Value,@Autowired,@Resource,@Inject這幾個(gè)的作用都是進(jìn)行屬性裝配,只不過他們的方式各有不同,@Value,@Autowired,@Inject是使用AutowiredAnnotationBeanPostProcessor后置處理器進(jìn)行處理,@Resource則使用CommonAnnotationBeanPostProcessor后置處理器進(jìn)行處理。

以上就是Spring @Value的注解使用和原理解析的詳細(xì)內(nèi)容,更多關(guān)于Spring @Value注解的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Java同步代碼塊解決銀行取錢的安全問題實(shí)例分析

    Java同步代碼塊解決銀行取錢的安全問題實(shí)例分析

    這篇文章主要介紹了Java同步代碼塊解決銀行取錢的安全問題,結(jié)合實(shí)例形式分析了java基于線程的同步問題實(shí)現(xiàn)與使用相關(guān)操作技巧,需要的朋友可以參考下
    2019-08-08
  • springMVC中基于token防止表單重復(fù)提交方法

    springMVC中基于token防止表單重復(fù)提交方法

    本篇文章主要介紹了springMVC中基于token防止表單重復(fù)提交方法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-07-07
  • 淺談hashmap為什么查詢時(shí)間復(fù)雜度為O(1)

    淺談hashmap為什么查詢時(shí)間復(fù)雜度為O(1)

    這篇文章主要介紹了hashmap為什么查詢時(shí)間復(fù)雜度為O(1),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-08-08
  • SpringBoot項(xiàng)目如何把接口參數(shù)中的空白值替換為null值(推薦)

    SpringBoot項(xiàng)目如何把接口參數(shù)中的空白值替換為null值(推薦)

    這篇文章主要介紹了SpringBoot項(xiàng)目如何把接口參數(shù)中的空白值替換為null值(推薦),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-01-01
  • 十道java華為編程大賽題目

    十道java華為編程大賽題目

    這篇文章主要為大家分享了十道java華為編程大賽題目,代碼經(jīng)過調(diào)試,經(jīng)典的java編程題,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-03-03
  • Java PDF 添加數(shù)字簽名的實(shí)現(xiàn)方法

    Java PDF 添加數(shù)字簽名的實(shí)現(xiàn)方法

    這篇文章主要介紹了Java PDF 添加數(shù)字簽名的實(shí)現(xiàn)方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-12-12
  • SpringBoot之通過BeanPostProcessor動(dòng)態(tài)注入ID生成器案例詳解

    SpringBoot之通過BeanPostProcessor動(dòng)態(tài)注入ID生成器案例詳解

    這篇文章主要介紹了SpringBoot之通過BeanPostProcessor動(dòng)態(tài)注入ID生成器案例詳解,本篇文章通過簡要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-09-09
  • 詳解Java實(shí)踐之抽象工廠模式

    詳解Java實(shí)踐之抽象工廠模式

    抽象工廠模式用于產(chǎn)品族的構(gòu)建。抽象工廠是所有形態(tài)的工廠模式中最為抽象和最具一般性的一種形態(tài)。抽象工廠是指當(dāng)有多個(gè)抽象角色時(shí)使用的一種工廠模式。抽象工廠模式可以向客戶端提供一個(gè)接口,使客戶端在不必指定產(chǎn)品的具體情況下,創(chuàng)建多個(gè)產(chǎn)品族中的產(chǎn)品對(duì)象
    2021-06-06
  • 23種設(shè)計(jì)模式(13)java觀察者模式

    23種設(shè)計(jì)模式(13)java觀察者模式

    這篇文章主要為大家詳細(xì)介紹了23種設(shè)計(jì)模式之java觀察者模式,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-12-12
  • Mybatis自定義類型轉(zhuǎn)換器的使用技巧

    Mybatis自定義類型轉(zhuǎn)換器的使用技巧

    這篇文章主要介紹了Mybatis自定義類型轉(zhuǎn)換器的使用技巧,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-04-04

最新評(píng)論

新建县| 陆川县| 阳曲县| 纳雍县| 厦门市| 自治县| 南川市| 井研县| 鹤壁市| 炉霍县| 渭南市| 蓝田县| 宝兴县| 平顶山市| 温泉县| 廊坊市| 科技| 文成县| 温泉县| 松江区| 于田县| 易门县| 卓尼县| 康定县| 正镶白旗| 巩留县| 临朐县| 庆阳市| 灌云县| 平山县| 灵川县| 灵丘县| 磐石市| 云梦县| 湟中县| 靖西县| 皮山县| 桑日县| 资讯 | 额敏县| 司法|