IOC

整體架構(gòu):
Spring框架是一個(gè)分層架構(gòu),它包含一系列的功能要素,并被分為大約20個(gè)模塊,如下所示


image

Core Container
Core Container (核心容器)包含Core,Beans,Context和Expression Language模塊.
Core和Beans模塊是框架的基本部分,提供IOC和依賴注入特性.這里的基礎(chǔ)概念的BeanFactory, 它提供對(duì)Factory模式經(jīng)典實(shí)現(xiàn),來(lái)消除程序性的單例模式需求,分離出依賴關(guān)系和配置
1)Core模塊主要包含Spring框架的基本核心工具類,Spring的其他組件都要使用到這個(gè)包里的類,Core模塊是其他組件的基本核心.
2)Beans模塊是所有應(yīng)用都要用到的,它包含訪問(wèn)配置文件,創(chuàng)建和管理bean以及進(jìn)行IOC/DI操作相關(guān)的所有類.
3)Context模塊構(gòu)建于Core和Beans模塊基礎(chǔ)之上,提供一種類似于JNDI注冊(cè)器的框架式對(duì)象訪問(wèn)方法.Context模塊繼承了Beans的特性,為
Spring核心提供了大量擴(kuò)展,添加了對(duì)國(guó)際化(如資源綁定),事件傳播,資源加載和對(duì)Context的透明創(chuàng)建的支持.ApplicationContext接口是Context模塊的關(guān)鍵.
4)Expression Language模塊提供了一個(gè)強(qiáng)大的表達(dá)式ko'l語(yǔ)言用于在運(yùn)行時(shí)查詢和操縱對(duì)象.

IOC,控制反轉(zhuǎn)(Inversion of Control),常見(jiàn)方式依賴注入(Dependency Injection,簡(jiǎn)稱 DI ),還有一種方式為依賴查找.

public static void main(String[] args) throws InterruptedException {
        //啟動(dòng)spring容器,完成spring框架的初始化
        ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");

        MyBean myBean = context.getBean("myBean", MyBean.class);
        System.out.println(myBean.getMyName() + "---" + myBean.getMyAge());
        myBean.myHi();
    }

根據(jù)以上測(cè)試方法,跟讀spring源碼.

ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");

創(chuàng)建ClassPathXmlApplicationContext對(duì)象時(shí),啟動(dòng)spring容器,初始化spring框架,代碼如下:

public ClassPathXmlApplicationContext(
            String[] configLocations, boolean refresh, @Nullable ApplicationContext parent)
            throws BeansException {
        //調(diào)用父類的構(gòu)造方法,初始化成員變量,parent參數(shù)為null
        super(parent);
        //設(shè)置配置文件位置, ClassPathXmlApplicationContext 的父類AbstractRefreshableConfigApplicationContext 的configLocations屬性賦值
        setConfigLocations(configLocations);
        //強(qiáng)制寫死的為true
        if (refresh) {
            //刷新應(yīng)用上下文,實(shí)際上即初始化和啟動(dòng)Spring應(yīng)用上下文(容器),主要邏輯都在這個(gè)方法.
            refresh();
        }
    }

下面看refresh()方法

@Override
    public void refresh() throws BeansException, IllegalStateException {
        //線程同步
        synchronized (this.startupShutdownMonitor) {
                // 1、預(yù)準(zhǔn)備刷新上下文
            prepareRefresh();

            // 2、告訴子類去刷新內(nèi)部的bean factory,獲得刷新的bean factory,最終得到是DefaultListableBeanFactory
            ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();

            // 3、預(yù)處理bean工廠,為在上下文中使用,注冊(cè)
            prepareBeanFactory(beanFactory);

                        //4、由子類覆蓋該方法做額外的處理,默認(rèn)spring框架什么也沒(méi)有做
            postProcessBeanFactory(beanFactory);

            //5、激活各種BeanFactory處理器
            invokeBeanFactoryPostProcessors(beanFactory);

            //6、注冊(cè)攔截Bean創(chuàng)建的Bean處理器,如果沒(méi)有bean processors,此步驟什么也不做
            registerBeanPostProcessors(beanFactory);

            //7、在上下文初始化注冊(cè)messageSource的bean,不同語(yǔ)言環(huán)境信息,國(guó)際化處理
            initMessageSource();

            //8、在上下文初始化注冊(cè)applicationEventMulticaster的bean,應(yīng)用消息廣播
            initApplicationEventMulticaster();

            //9、留給子類來(lái)初始化其他的bean,默認(rèn)情況下Spring框架什么也不做
            onRefresh();

            //10、在所有bean中查找listener bean并注冊(cè)到消息廣播中,沒(méi)有的話就什么也不做;
            registerListeners();

            //11、初始化所有剩下的非延遲初始化的單例bean對(duì)象
            finishBeanFactoryInitialization(beanFactory);

            //12、完成刷新過(guò)程,通知生命周期處理器lifecycleProcessor刷新過(guò)程,同時(shí)發(fā)出ContextRefreshEvent通知相關(guān)事件
            finishRefresh();
        }
    }

1.創(chuàng)建容器對(duì)象
ClassPathXmlApplicationContext
AnnotationConfigApplicationContext
XmlWebApplicationContext
2.初始化配置信息setConfigLocations
3.刷新容器refresh()
1)創(chuàng)建工廠bean
容器的beanFactory屬性,類型DefaultListableBeanFactory
2)解析xml配置,通過(guò)JDK自帶的將xml解析為document對(duì)象,通過(guò)document去獲取xml的配置信息.
3)每一個(gè)bean定義,對(duì)應(yīng)一個(gè)GenericBeanDefinition
通過(guò)字符串的全限定類名,獲取對(duì)應(yīng)的class
并解析屬性等各種值,進(jìn)行GenericBeanDefinition的賦值


image.png

然后將GenericBeanDefinition 放到DefaultListableBeanFactory 的成員變量beanDefinitionMap中,key為beanname,value為GenericBeanDefinition


image.png

4)通過(guò)class獲取構(gòu)造器,并反射創(chuàng)建對(duì)象ctor.newInstance(args)
5)反射初始化屬性值
6)將對(duì)象放入DefaultListableBeanFactory父類的的singletonObjects中key是beanName,value是單例對(duì)象
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容