spring 源碼中StandardEnvironment的一些列相關(guān)類

上來先來個例子

import org.junit.jupiter.api.Test;
import org.springframework.core.env.*;
import org.springframework.util.StringUtils;

import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;

/**
 * @author lwh
 * @date 2022/3/17
 */
public class PropertySourceTest {
    @Test
    public void test01(){
        class MyMapPropertySource extends EnumerablePropertySource<Map<String,Object>>{

            public MyMapPropertySource(String name, Map<String,Object> source) {
                super(name, source);
            }

            @Override
            public boolean containsProperty(String name) {
                return this.source.containsKey(name);
            }

            @Override
            public String[] getPropertyNames() {
                return StringUtils.toStringArray(this.source.keySet());
            }

            @Override
            public Object getProperty(String name) {
                return this.source.get(name);
            }
        }
        final HashMap<String, Object> lwhHashMap = new HashMap<>();
        lwhHashMap.put("lwh",123);
        lwhHashMap.put("ai","${USERNAME}");
        final MyMapPropertySource lwh = new MyMapPropertySource("lwh", lwhHashMap);
        final HashMap<String, Object> lsfHashMap = new HashMap<>();
        lsfHashMap.put("lsf",456);
        //只是一個迭代器而然
        final MyMapPropertySource lsf = new MyMapPropertySource("lsf", lsfHashMap);
        //可以自定義PropertySources,但是也沒必要
        MutablePropertySources propertySources = new MutablePropertySources();
        propertySources.addLast(lwh);
        propertySources.addLast(lsf);
    //需要解析器,自定義的解析器蛾坯,你可以選擇實現(xiàn)PropertySourcesPropertyResolver 或者AbstractPropertyResolver
        //PropertySourcesPropertyResolver propertySourcesPropertyResolver = new PropertySourcesPropertyResolver(propertySources);
        class MyPropertySourcesPropertyResolver extends PropertySourcesPropertyResolver{
            public MyPropertySourcesPropertyResolver(PropertySources propertySources) {
                super(propertySources);
            }

            //沒必要實現(xiàn)
            @Override
            protected String getPropertyAsRawString(String key) {
                return super.getPropertyAsRawString(key);
            }

            //沒必要實現(xiàn)
            @Override
            protected <T> T getProperty(String key, Class<T> targetValueType, boolean resolveNestedPlaceholders) {
                return super.getProperty(key, targetValueType, resolveNestedPlaceholders);
            }
        }

        //自定義加載系統(tǒng)的環(huán)境變量進來仲墨,也可以加載其他的環(huán)境變量
        class MyStandardEnvironment extends  AbstractEnvironment{
            public MyStandardEnvironment(MutablePropertySources propertySources) {
                super(propertySources);
            }
            @Override
            protected ConfigurablePropertyResolver createPropertyResolver(MutablePropertySources propertySources) {
                return new MyPropertySourcesPropertyResolver(propertySources);
            }
            //可以自定義的加入自己的MyMapPropertySource
            @Override
            protected void customizePropertySources(MutablePropertySources propertySources) {
                super.customizePropertySources(propertySources);
                propertySources.addLast(
                        new MapPropertySource("SystemProperties", getSystemProperties()));
                propertySources.addLast(
                        new SystemEnvironmentPropertySource("SystemEnvironment", getSystemEnvironment()));

            }
        }

        MyStandardEnvironment myStandardEnvironment = new MyStandardEnvironment(propertySources);
        final String ai = myStandardEnvironment.getProperty("ai");
        System.out.println(ai);
    }
}

在貼一張類圖

StandardEnvironment.jpg

說明一下勾缭,我希望你自己去看,畢竟目养,我能力有限俩由,寫上去的也不一定對

1.PropertySource

這個是一個抽象類,你可以繼承這個類癌蚁,定制自己的PropertySource 幻梯,已有的子類有
EnumerablePropertySource,MapPropertySource等努释,其實這個類就是一個name和source的屬性值得關(guān)注碘梢,
name可以說名是哪一個配置文件,source就是配置文件的內(nèi)容伐蒂,比如MapPropertySource的name是字符串
source就是Map<String,Object>煞躬,還有就是可以PropertySource.getProperty(“配置文件內(nèi)容中的key”)得到配置文件內(nèi)容中的value

PropertySources 其實就是一個PropertySource 迭代器

它有一個子類MutablePropertySources,你可以繼承MutablePropertySources自定義自己的PropertySources 逸邦,MutablePropertySources值得注意的是addFirst(PropertySource)和addLast(PropertySource)恩沛,這兩個方法會影響PropertyResolver的執(zhí)行,也就是說相同key的值昭雌,找到就不會在找了

PropertyResolver Property的解析器

它有個子類AbstractPropertyResolver复唤,可以解析${}占位符,當(dāng)然你也可以實現(xiàn)ConfigurablePropertyResolver自定義自己的占位符規(guī)則

Environment 表示的是當(dāng)前應(yīng)用的環(huán)境

它有個子類StandardEnvironment烛卧,集成了PropertySource 和PropertySources 和AbstractPropertyResolver佛纫,可以獲取得到系統(tǒng)的環(huán)境變量和jvm的環(huán)境變量妓局,當(dāng)然,你也可以繼承AbstractEnvironment自定義自己的Environment 呈宇,來獲取更多其他的環(huán)境變量

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末好爬,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子甥啄,更是在濱河造成了極大的恐慌存炮,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,997評論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件蜈漓,死亡現(xiàn)場離奇詭異穆桂,居然都是意外死亡,警方通過查閱死者的電腦和手機融虽,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,603評論 3 392
  • 文/潘曉璐 我一進店門享完,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人有额,你說我怎么就攤上這事般又。” “怎么了巍佑?”我有些...
    開封第一講書人閱讀 163,359評論 0 353
  • 文/不壞的土叔 我叫張陵茴迁,是天一觀的道長。 經(jīng)常有香客問我萤衰,道長堕义,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,309評論 1 292
  • 正文 為了忘掉前任腻菇,我火速辦了婚禮胳螟,結(jié)果婚禮上昔馋,老公的妹妹穿的比我還像新娘筹吐。我一直安慰自己,他們只是感情好秘遏,可當(dāng)我...
    茶點故事閱讀 67,346評論 6 390
  • 文/花漫 我一把揭開白布丘薛。 她就那樣靜靜地躺著,像睡著了一般邦危。 火紅的嫁衣襯著肌膚如雪洋侨。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,258評論 1 300
  • 那天倦蚪,我揣著相機與錄音希坚,去河邊找鬼。 笑死陵且,一個胖子當(dāng)著我的面吹牛裁僧,可吹牛的內(nèi)容都是我干的个束。 我是一名探鬼主播,決...
    沈念sama閱讀 40,122評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼聊疲,長吁一口氣:“原來是場噩夢啊……” “哼茬底!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起获洲,我...
    開封第一講書人閱讀 38,970評論 0 275
  • 序言:老撾萬榮一對情侶失蹤阱表,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后贡珊,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體最爬,經(jīng)...
    沈念sama閱讀 45,403評論 1 313
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,596評論 3 334
  • 正文 我和宋清朗相戀三年门岔,在試婚紗的時候發(fā)現(xiàn)自己被綠了烂叔。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,769評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡固歪,死狀恐怖蒜鸡,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情牢裳,我是刑警寧澤逢防,帶...
    沈念sama閱讀 35,464評論 5 344
  • 正文 年R本政府宣布,位于F島的核電站蒲讯,受9級特大地震影響忘朝,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜判帮,卻給世界環(huán)境...
    茶點故事閱讀 41,075評論 3 327
  • 文/蒙蒙 一局嘁、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧晦墙,春花似錦悦昵、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,705評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至抗楔,卻和暖如春棋凳,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背连躏。 一陣腳步聲響...
    開封第一講書人閱讀 32,848評論 1 269
  • 我被黑心中介騙來泰國打工剩岳, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人入热。 一個月前我還...
    沈念sama閱讀 47,831評論 2 370
  • 正文 我出身青樓拍棕,卻偏偏與公主長得像疲迂,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子莫湘,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,678評論 2 354

推薦閱讀更多精彩內(nèi)容