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

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的賦值

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

4)通過(guò)class獲取構(gòu)造器,并反射創(chuàng)建對(duì)象ctor.newInstance(args)
5)反射初始化屬性值
6)將對(duì)象放入DefaultListableBeanFactory父類的的singletonObjects中key是beanName,value是單例對(duì)象