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

Spring運(yùn)行環(huán)境Environment的解析

 更新時(shí)間:2023年08月01日 09:15:18   作者:韓長(zhǎng)奇  
本文主要介紹了Spring運(yùn)行環(huán)境Environment的解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

Spring運(yùn)行環(huán)境

Spring在創(chuàng)建容器時(shí),會(huì)創(chuàng)建Environment環(huán)境對(duì)象,用于保存spring應(yīng)用程序的運(yùn)行環(huán)境相關(guān)的信息。在創(chuàng)建環(huán)境時(shí),需要?jiǎng)?chuàng)建屬性源屬性解析器,會(huì)解析屬性值中的占位符,并進(jìn)行替換。

創(chuàng)建環(huán)境時(shí),會(huì)通過(guò)System.getProperties()獲取JVM系統(tǒng)屬性,會(huì)通過(guò)System.getenv()獲取JVM環(huán)境屬性。

Environment在Spring中的使用

spring在創(chuàng)建容器時(shí)需要指定需要加載配置文件路徑,在加載配置文件路徑時(shí),需要解析字符串中的占位符。解析占位符時(shí),需要環(huán)境信息,此時(shí)會(huì)創(chuàng)建一個(gè)標(biāo)準(zhǔn)的spring運(yùn)行環(huán)境,即創(chuàng)建StandardEnvironment對(duì)象。

1、調(diào)用setConfigLocations方法給spring設(shè)置需要加載的配置文件的路徑,源碼如下:

// 將配置文件的路徑放到configLocations 字符串?dāng)?shù)組中
public void setConfigLocations(@Nullable String... locations) {
    if (locations != null) {
        Assert.noNullElements(locations, "Config locations must not be null");
        // 設(shè)置了幾個(gè)配置文件,就創(chuàng)一個(gè)多長(zhǎng)的字符串?dāng)?shù)組,用來(lái)存放配置文件的路徑
        this.configLocations = new String[locations.length];
        for (int i = 0; i < locations.length; i++) {
            //解析路徑,將解析的路徑存放到字符串?dāng)?shù)組中
            this.configLocations[i] = resolvePath(locations[i]).trim();
        }
    }
    else {
        this.configLocations = null;
    }
}

2、調(diào)用resolvePath方法解析配置文件路徑中的占位符,源碼如下:

// 解析給定的路徑,必要時(shí)用相應(yīng)的環(huán)境屬性值替換占位符。應(yīng)用于配置位置。
protected String resolvePath(String path) {
    // 獲取環(huán)境,解決所需的占位符
    return getEnvironment().resolveRequiredPlaceholders(path);
}

3、調(diào)用getEnvironment方法獲取環(huán)境信息,如果沒(méi)有指定spring的環(huán)境信息,通過(guò)createEnvironment獲取默認(rèn)的環(huán)境,也就是spring的標(biāo)準(zhǔn)環(huán)境。getEnvironment方法源碼如下:

// 獲取spring的環(huán)境信息,如果沒(méi)有指定,獲取到的時(shí)默認(rèn)的環(huán)境
@Override
public ConfigurableEnvironment getEnvironment() {
    if (this.environment == null) {
        this.environment = createEnvironment();
    }
    return this.environment;
}

4、調(diào)用createEnvironment方法獲取默認(rèn)的環(huán)境(spring的標(biāo)準(zhǔn)環(huán)境),使用StandardEnvironment無(wú)參構(gòu)造創(chuàng)建對(duì)象。源碼如下:

// 獲取默認(rèn)的環(huán)境
protected ConfigurableEnvironment createEnvironment() {
    return new StandardEnvironment();
}

Spring的標(biāo)準(zhǔn)環(huán)境StandardEnvironment

Spring的標(biāo)準(zhǔn)環(huán)境StandardEnvironment適合在非web應(yīng)用程序中使用。

在AbstractApplicationContext類的createEnvironment方法中會(huì)調(diào)用StandardEnvironment的無(wú)參構(gòu)造方法創(chuàng)建環(huán)境對(duì)象。

1、調(diào)用StandardEnvironment的無(wú)參構(gòu)造方法,該方法中沒(méi)有任何邏輯處理,源碼如下:

public StandardEnvironment() {}

2、StandardEnvironment類是AbstractEnvironment抽象類的子類,因此使用StandardEnvironment的無(wú)參構(gòu)造創(chuàng)建對(duì)象時(shí)會(huì)調(diào)用父類AbstractEnvironment的無(wú)參構(gòu)造方法。AbstractEnvironment在下文中有描述。

3、重寫(xiě)AbstractEnvironment類中的customizePropertySources方法,用于設(shè)置屬性源,該方法通過(guò)父類進(jìn)行回調(diào)。
該方法會(huì)獲取JVM系統(tǒng)屬性和環(huán)境屬性并設(shè)置到MutablePropertySources類中存放屬性源的CopyOnWriteArrayList中。

1)JVM系統(tǒng)屬性通過(guò)System.getProperties()獲?。?br />2)環(huán)境屬性通過(guò)System.getenv()獲取。

StandardEnvironment類中customizePropertySources方法源碼如下:

// 設(shè)置屬性源,JVM系統(tǒng)屬性中的屬性將優(yōu)先于環(huán)境屬性中的屬性。
@Override
protected void customizePropertySources(MutablePropertySources propertySources) {
    /**
     * 1、MutablePropertySources類中使用CopyOnWriteArrayList存儲(chǔ)屬性源,集合中存儲(chǔ)PropertySource的子類
     * 2、PropertiesPropertySource是PropertySource的子類,PropertySource類中有三個(gè)成員變量
     *         1)logger:日志對(duì)象
     *         2)name:用來(lái)保存屬性源名稱
     *         3)source:用來(lái)保存屬性源中的屬性
     */
    // getSystemProperties():通過(guò)System.getProperties()獲取JVM屬性鍵值對(duì),并轉(zhuǎn)成Map
    propertySources.addLast(
            new PropertiesPropertySource(SYSTEM_PROPERTIES_PROPERTY_SOURCE_NAME, getSystemProperties()));
    // getSystemEnvironment():通過(guò)System.getenv()獲取環(huán)境屬性鍵值對(duì),并撰成Map
    propertySources.addLast(
            new SystemEnvironmentPropertySource(SYSTEM_ENVIRONMENT_PROPERTY_SOURCE_NAME, getSystemEnvironment()));
}

4、StandardEnvironment類中設(shè)置了兩個(gè)靜態(tài)常量:

1)systemEnvironment:以系統(tǒng)環(huán)境為屬性源
2)systemProperties:以JVM系統(tǒng)屬性為屬性源

/** System environment property source name: {@value}.
?* 系統(tǒng)環(huán)境屬性源名:{@value}。 */
public static final String SYSTEM_ENVIRONMENT_PROPERTY_SOURCE_NAME = "systemEnvironment";
/** JVM system properties property source name: {@value}.
?* JVM系統(tǒng)屬性屬性源名稱:{@value}。*/
public static final String SYSTEM_PROPERTIES_PROPERTY_SOURCE_NAME = "systemProperties";

Spring的抽象環(huán)境AbstractEnvironment

StandardEnvironment類是AbstractEnvironment抽象類的子類,因此使用StandardEnvironment的無(wú)參構(gòu)造創(chuàng)建對(duì)象時(shí)會(huì)調(diào)用父類AbstractEnvironment的無(wú)參構(gòu)造方法。

1、AbstractEnvironment的無(wú)參構(gòu)造方法,該方法會(huì)調(diào)用AbstractEnvironment的有參構(gòu)造方法,源碼如下:

public AbstractEnvironment() {
    this(new MutablePropertySources());
}

2、AbstractEnvironment的有參構(gòu)造
該方法的主要做三件事:
1)給成員變量賦值
2)創(chuàng)建屬性源屬性解析器
3)調(diào)用子類重寫(xiě)的customizePropertySources方法(方法回調(diào))。雖然方法回調(diào)在成員變量的賦值之后,但由于是引用傳遞,所以通過(guò)成員屬性可以獲取到改變之后的值。

// 使用了模板方法設(shè)計(jì)模式。
// 給成員變量賦值,并調(diào)用子類重寫(xiě)的方法,對(duì)propertySources進(jìn)行操作。
protected AbstractEnvironment(MutablePropertySources propertySources) {
    // 給全局變量 可變屬性源 賦值
    this.propertySources = propertySources;
    // 創(chuàng)建屬性解析器:PropertySourcesPropertyResolver 屬性源屬性解析器
    this.propertyResolver = createPropertyResolver(propertySources);
    // 自定義屬性源,此處回調(diào)子類重寫(xiě)的方法。子類通過(guò)重寫(xiě)該方法可以操作propertySources。spring標(biāo)準(zhǔn)環(huán)境StandardEnvironment重寫(xiě)了該方法
    customizePropertySources(propertySources);
}

3、調(diào)用createPropertyResolver創(chuàng)建屬性解析器,用于解析屬性值中的占位符并進(jìn)行替換。

// 在創(chuàng)建環(huán)境時(shí),需要?jiǎng)?chuàng)建屬性解析器
protected ConfigurablePropertyResolver createPropertyResolver(MutablePropertySources propertySources) {
    return new PropertySourcesPropertyResolver(propertySources);
}

4、AbstractEnvironment的成員屬性

// 指示Spring忽略系統(tǒng)環(huán)境變量,默認(rèn)值為"false"。
// false表示不會(huì)忽略系統(tǒng)環(huán)境變量,此時(shí)getSystemEnvironment方法會(huì)調(diào)用System.getenv()獲取環(huán)境屬性
// true表示會(huì)忽略系統(tǒng)的環(huán)境變量,此時(shí)getSystemEnvironment方法會(huì)返回一個(gè)空的Map
public static final String IGNORE_GETENV_PROPERTY_NAME = "spring.getenv.ignore";
// 指定系統(tǒng)啟動(dòng)時(shí)使用哪些配置文件,可以使用逗號(hào)隔開(kāi)
public static final String ACTIVE_PROFILES_PROPERTY_NAME = "spring.profiles.active";
// 指定系統(tǒng)啟動(dòng)時(shí)使用默認(rèn)的配置文件,可以使用逗號(hào)隔開(kāi)
public static final String DEFAULT_PROFILES_PROPERTY_NAME = "spring.profiles.default";
// 保留的默認(rèn)的配置文件的名稱,如果沒(méi)有顯式設(shè)置默認(rèn)配置文件名稱,也沒(méi)有顯式設(shè)置活動(dòng)配置文件名稱,則默認(rèn)情況下該配置文件將自動(dòng)激活。
protected static final String RESERVED_DEFAULT_PROFILE_NAME = "default";
// 日志對(duì)象
protected final Log logger = LogFactory.getLog(getClass());
//系統(tǒng)啟動(dòng)時(shí)使用的配置文件
private final Set<String> activeProfiles = new LinkedHashSet<>();
// 默認(rèn)配置文件
private final Set<String> defaultProfiles = new LinkedHashSet<>(getReservedDefaultProfiles());
// 可變屬性源,使用該成員變量保存屬性源及通過(guò)該屬性源獲取的屬性
private final MutablePropertySources propertySources;
// 可配置的屬性解析器
private final ConfigurablePropertyResolver propertyResolver;

到此這篇關(guān)于Spring運(yùn)行環(huán)境Environment的解析的文章就介紹到這了,更多相關(guān)Spring Environment內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Servlet中/和/*的區(qū)別詳解

    Servlet中/和/*的區(qū)別詳解

    本文將分析/和/*的區(qū)別這個(gè)老生常談的問(wèn)題,但是很多時(shí)候看完就忘了,關(guān)于此問(wèn)題這一篇文章就夠了,它將成為你的永久記憶,感興趣的可以了解一下
    2021-07-07
  • 一文詳解Spring Security的基本用法

    一文詳解Spring Security的基本用法

    Spring Security是一個(gè)功能強(qiáng)大且高度可定制的身份驗(yàn)證和訪問(wèn)控制框架, 提供了完善的認(rèn)證機(jī)制和方法級(jí)的授權(quán)功能。本文將通過(guò)一個(gè)簡(jiǎn)單的案例了解一下Spring Security的基本用法,需要的可以參考一下
    2022-05-05
  • 關(guān)于post請(qǐng)求內(nèi)容無(wú)法重復(fù)獲取的解決方法

    關(guān)于post請(qǐng)求內(nèi)容無(wú)法重復(fù)獲取的解決方法

    這篇文章主要介紹了關(guān)于post請(qǐng)求內(nèi)容無(wú)法重復(fù)獲取的解決方法,文中通過(guò)代碼示例給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下
    2024-03-03
  • Hive與HBase之間的區(qū)別及使用方式

    Hive與HBase之間的區(qū)別及使用方式

    本文介紹了Hive和HBase的區(qū)別,Hive是基于Hadoop的數(shù)據(jù)倉(cāng)庫(kù)工具,不支持實(shí)時(shí)數(shù)據(jù)處理;HBase是一種分布式的、可擴(kuò)展、支持海量數(shù)據(jù)存儲(chǔ)的NoSQL數(shù)據(jù)庫(kù),適用于實(shí)時(shí)數(shù)據(jù)處理,兩者都是基于HDFS的,Hive用于批處理,不支持隨機(jī)寫(xiě)
    2026-04-04
  • Java 之類型轉(zhuǎn)換與多態(tài)詳情

    Java 之類型轉(zhuǎn)換與多態(tài)詳情

    Java使用類創(chuàng)造新的類型(type),并使用繼承來(lái)便利我們創(chuàng)建類。再深一層講類型,并是多態(tài)(polymorphism)的概念。本文將給大家介紹Java 的類型轉(zhuǎn)換與多態(tài),需要的小伙伴可以參考下面文章的具體內(nèi)容
    2021-09-09
  • java實(shí)現(xiàn)文件加密解密多種方法

    java實(shí)現(xiàn)文件加密解密多種方法

    這篇文章主要給大家介紹了關(guān)于java實(shí)現(xiàn)文件加密解密多種方法的相關(guān)資料,?Java支持多種加密解密算法,常用的有DES、AES、RSA等,需要的朋友可以參考下
    2023-07-07
  • java仿Servlet生成驗(yàn)證碼實(shí)例詳解

    java仿Servlet生成驗(yàn)證碼實(shí)例詳解

    這篇文章主要介紹了java仿Servlet生成驗(yàn)證碼實(shí)例詳解的相關(guān)資料,需要的朋友可以參考下
    2017-04-04
  • 后端Long類型ID傳給前端精度丟失(變00)的原因分析及解決方案

    后端Long類型ID傳給前端精度丟失(變00)的原因分析及解決方案

    在Java中l(wèi)ong是一種基本數(shù)據(jù)類型,用于存儲(chǔ)64位的整數(shù)值,這篇文章主要介紹了后端Long類型ID傳給前端精度丟失(變00)的原因分析及解決方案,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2026-03-03
  • Java實(shí)現(xiàn)經(jīng)典俄羅斯方塊游戲

    Java實(shí)現(xiàn)經(jīng)典俄羅斯方塊游戲

    俄羅斯方塊是一個(gè)最初由阿列克謝帕吉特諾夫在蘇聯(lián)設(shè)計(jì)和編程的益智類視頻游戲。本文將利用Java實(shí)現(xiàn)這一經(jīng)典的小游戲,需要的可以參考一下
    2022-01-01
  • servlet基礎(chǔ)知識(shí)_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理

    servlet基礎(chǔ)知識(shí)_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理

    這篇文章主要為大家詳細(xì)介紹了servlet基礎(chǔ)的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-07-07

最新評(píng)論

都昌县| 佛教| 广平县| 绿春县| 灵璧县| 雷州市| 辉南县| 定边县| 崇文区| 涟水县| 保康县| 海丰县| 余庆县| 巴楚县| 望江县| 灵璧县| 青田县| 兖州市| 武冈市| 绥芬河市| 通山县| 文成县| 醴陵市| 泊头市| 安顺市| 七台河市| 盐津县| 盐亭县| 福州市| 定西市| 兴安县| 宜兰市| 福州市| 安多县| 长寿区| 额尔古纳市| 孙吴县| 山阳县| 通化市| 宝鸡市| 南安市|