spring源碼分析1

我們知道叫搁,當(dāng):
AnnotationConfigApplicationContext al=new AnnotationConfigApplicationContext(appconfig.class);
//appconfig這個(gè)類是個(gè)spring配置類,加了@Configuration,@ComponentScan("packgename")這兩個(gè)注解。
此方法初始化了spring容器

下面一探源碼:


    /**
     * 這個(gè)構(gòu)造方法需要傳入一個(gè)被javaconfig注解了的配置類
     * 然后會(huì)把這個(gè)被注解了javaconfig的類通過(guò)注解讀取器讀取后繼而解析
     * Create a new AnnotationConfigApplicationContext, deriving bean definitions
     * from the given annotated classes and automatically refreshing the context.
     * @param annotatedClasses one or more annotated classes,
     * e.g. {@link Configuration @Configuration} classes
     */
    public AnnotationConfigApplicationContext(Class<?>... annotatedClasses) {
        //annotatedClasses  appconfig.class
        //這里由于他有父類悠轩,故而會(huì)先調(diào)用父類的構(gòu)造方法火架,然后才會(huì)調(diào)用自己的構(gòu)造方法
        //在自己構(gòu)造方法中初始一個(gè)讀取器和掃描器
        this();
        register(annotatedClasses);//方法一
        refresh();//方法二
    }

先初始化父類的構(gòu)造器何鸡,注意父類GenericApplicationContext的無(wú)參構(gòu)造器是實(shí)例化BeanFactory
DefaultListableBeanFactory這個(gè)類就是spring的bean工廠

    /**
     * Create a new GenericApplicationContext.
     * @see #registerBeanDefinition
     * @see #refresh
     * 一個(gè)工廠
     */
    public GenericApplicationContext() {
        this.beanFactory = new DefaultListableBeanFactory();
    }

然后this()調(diào)用自己的無(wú)參構(gòu)造牛欢,無(wú)參構(gòu)造代碼如下:

    /**
     * 初始化一個(gè)bean的讀取和掃描器
     * 何謂讀取器和掃描器參考上面的屬性注釋
     * 默認(rèn)構(gòu)造函數(shù),如果直接調(diào)用這個(gè)默認(rèn)構(gòu)造方法隔盛,需要在稍后通過(guò)調(diào)用其register()
     * 去注冊(cè)配置類(javaconfig)拾稳,并調(diào)用refresh()方法刷新容器,
     * 觸發(fā)容器對(duì)注解Bean的載入龙亲、解析和注冊(cè)過(guò)程
     * 這種使用過(guò)程我在ioc應(yīng)用的第二節(jié)課講@profile的時(shí)候講過(guò)
     * Create a new AnnotationConfigApplicationContext that needs to be populated
     * through {@link #register} calls and then manually {@linkplain #refresh refreshed}.
            */
    public AnnotationConfigApplicationContext() {
        /**
         * 父類的構(gòu)造方法
         * 創(chuàng)建一個(gè)讀取注解的Bean定義讀取器
         * 什么是bean定義鳄炉?BeanDefinition
         */
        this.reader = new AnnotatedBeanDefinitionReader(this);


        //可以用來(lái)掃描包或者類传趾,繼而轉(zhuǎn)換成bd
        //但是實(shí)際上我們掃描包工作不是scanner這個(gè)對(duì)象來(lái)完成的
        //是spring自己new的一個(gè)ClassPathBeanDefinitionScanner
        //這里的scanner僅僅是為了程序員能夠在外部調(diào)用AnnotationConfigApplicationContext對(duì)象的scan方法
        this.scanner = new ClassPathBeanDefinitionScanner(this);
    }

首先看看構(gòu)造方法里的第一個(gè)方法
this.reader = new AnnotatedBeanDefinitionReader(this);這句代碼,構(gòu)造方法參數(shù)是BeanDefinitionRegistry,而傳的是this,表示AnnotationConfigApplicationContext是BeanDefinitionRegistry的子類磕仅。
AnnotatedBeanDefinitionReader這個(gè)類是BeanDefinition讀取器,給它一個(gè)java類榕订,它會(huì)解析成描述這個(gè)類的BeanDefinition,但是這個(gè)類只會(huì)解析加了注解的類劫恒,下面查看該方法的調(diào)用鏈:

    /**
     *  這里的BeanDefinitionRegistry registry是通過(guò)在AnnotationConfigApplicationContext
     *  的構(gòu)造方法中傳進(jìn)來(lái)的this
     *  由此說(shuō)明AnnotationConfigApplicationContext是一個(gè)BeanDefinitionRegistry類型的類
     *  何以證明我們可以看到AnnotationConfigApplicationContext的類關(guān)系:
     *  GenericApplicationContext extends AbstractApplicationContext implements BeanDefinitionRegistry
     *  看到他實(shí)現(xiàn)了BeanDefinitionRegistry證明上面的說(shuō)法,那么BeanDefinitionRegistry的作用是什么呢丛楚?
     *  BeanDefinitionRegistry 顧名思義就是BeanDefinition的注冊(cè)器
     *  那么何為BeanDefinition呢趣些?參考BeanDefinition的源碼的注釋
     * @param registry
     */
    public AnnotatedBeanDefinitionReader(BeanDefinitionRegistry registry) {
        this(registry, getOrCreateEnvironment(registry));
    }

再往里:

    /**
     * Create a new {@code AnnotatedBeanDefinitionReader} for the given registry and using
     * the given {@link Environment}.
     * @param registry the {@code BeanFactory} to load bean definitions into,
     * in the form of a {@code BeanDefinitionRegistry}
     * @param environment the {@code Environment} to use when evaluating bean definition
     * profiles.
     * @since 3.1
     */
    public AnnotatedBeanDefinitionReader(BeanDefinitionRegistry registry, Environment environment) {
//      Assert.notNull(registry, "BeanDefinitionRegistry must not be null");
//      Assert.notNull(environment, "Environment must not be null");
        this.registry = registry;
        this.conditionEvaluator = new ConditionEvaluator(registry, environment, null);
        AnnotationConfigUtils.registerAnnotationConfigProcessors(this.registry);
    }
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末坏平,一起剝皮案震驚了整個(gè)濱河市舶替,隨后出現(xiàn)的幾起案子杠园,更是在濱河造成了極大的恐慌,老刑警劉巖返劲,帶你破解...
    沈念sama閱讀 207,113評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件孵延,死亡現(xiàn)場(chǎng)離奇詭異亲配,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)吼虎,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評(píng)論 2 381
  • 文/潘曉璐 我一進(jìn)店門玷犹,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)洒疚,“玉大人坯屿,你說(shuō)我怎么就攤上這事巍扛。” “怎么了吠昭?”我有些...
    開封第一講書人閱讀 153,340評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵矢棚,是天一觀的道長(zhǎng)幻妓。 經(jīng)常有香客問(wèn)我,道長(zhǎng),這世上最難降的妖魔是什么舱沧? 我笑而不...
    開封第一講書人閱讀 55,449評(píng)論 1 279
  • 正文 為了忘掉前任熟吏,我火速辦了婚禮,結(jié)果婚禮上牵寺,老公的妹妹穿的比我還像新娘帽氓。我一直安慰自己俩块,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,445評(píng)論 5 374
  • 文/花漫 我一把揭開白布玉凯。 她就那樣靜靜地躺著,像睡著了一般捎拯。 火紅的嫁衣襯著肌膚如雪盲厌。 梳的紋絲不亂的頭發(fā)上祸泪,一...
    開封第一講書人閱讀 49,166評(píng)論 1 284
  • 那天浴滴,我揣著相機(jī)與錄音升略,去河邊找鬼屡限。 笑死,一個(gè)胖子當(dāng)著我的面吹牛翰撑,可吹牛的內(nèi)容都是我干的眶诈。 我是一名探鬼主播,決...
    沈念sama閱讀 38,442評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼逝撬,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼宪潮!你這毒婦竟也來(lái)了狡相?” 一聲冷哼從身側(cè)響起食磕,我...
    開封第一講書人閱讀 37,105評(píng)論 0 261
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤彬伦,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后氧敢,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體孙乖,經(jīng)...
    沈念sama閱讀 43,601評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,066評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了恋拷。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,161評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡蔬顾,死狀恐怖宴偿,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情诀豁,我是刑警寧澤,帶...
    沈念sama閱讀 33,792評(píng)論 4 323
  • 正文 年R本政府宣布娩践,位于F島的核電站烹骨,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏穆趴。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,351評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望簿废。 院中可真熱鬧,春花似錦族檬、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)甩恼。三九已至,卻和暖如春条摸,著一層夾襖步出監(jiān)牢的瞬間悦污,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評(píng)論 1 261
  • 我被黑心中介騙來(lái)泰國(guó)打工钉蒲, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留切端,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,618評(píng)論 2 355
  • 正文 我出身青樓顷啼,卻偏偏與公主長(zhǎng)得像踏枣,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子线梗,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,916評(píng)論 2 344

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