前言java
在分析spring源碼以前,推薦Spring做者 Rod Johnson的兩本書:spring
這兩本書是spring 做者多年的J2EE工做中總結的思想和經驗,spring框架就是在這些思想上開發出來的;認真讀後,多看spring源碼,領悟其設計思想,提升設計能力。編程
到目前爲止,spring framework已經到了第四個版本,裏面已經擴展了大量的模塊和功能,在分析源碼的時候須要分清主次,理清主要結構體系;spring是徹底遵循面向接口的編程,而且模塊清晰,每個有模塊都是有高度抽象的接口到底層更具業務變化的實現,因此我在這裏分析源碼是採用的方法就針對不一樣的模塊進行分析,在瞭解各個模塊的功能後,進行總體分析;設計模式
IOC基礎結構緩存
org.springframework.beans和org.springframework.context是spring framework ioc的基本組成,BeanFactory是整個IOC容器的最基本接口;下圖是IOC容器元老級的幾個接口app
在這裏須要弄清楚這幾個接口各自都有什麼樣的功能,須要逐個分析框架
1.BeanFactoryide
spring容器的最基本接口,是client view的Bean container;從方法清單中能夠理解該接口的大體功能spa
2.HierarchicalBeanFactory設計
定義了BeanFactory的父子鏈結構
3.ListableBeanFactory
該接口的功能是用來列出全部Bean的名稱、類型、註解等信息
4.AutowireCapableBeanFactory
該接口的功能是主要實現了Bean的自動裝配功能,爲實例Bean暴露了裝配的功能,注意:ApplicationContext並無實現該接口,該接口在Spring容器外也可使用,在容器中能夠經過ApplicationContext.getAutowireCapableBeanFactory()獲取;
下面繼續向下展開一層,接口的結構圖以下
首先,這裏有一個獨立的接口SingletonBeanRegistry,該接口是要定義了一個單例Bean的註冊,目的是方便統一管理單例Bean;
1.ConfigurableBeanFactory
配置接口,被絕大部分BeanFactory實現,該接口功能:提供了對bean factory的配置設施;該接口方法不少,這裏列出幾個定義須要配置的屬性
void setParentBeanFactory(BeanFactory parentBeanFactory) throws IllegalStateException; void setBeanClassLoader(ClassLoader beanClassLoader); void setCacheBeanMetadata(boolean cacheBeanMetadata); void setBeanExpressionResolver(BeanExpressionResolver resolver); void setConversionService(ConversionService conversionService); void addPropertyEditorRegistrar(PropertyEditorRegistrar registrar); void setTypeConverter(TypeConverter typeConverter); void addBeanPostProcessor(BeanPostProcessor beanPostProcessor); AccessControlContext getAccessControlContext(); void destroyBean(String beanName, Object beanInstance); void destroySingletons();
public interface ConfigurableListableBeanFactory extends ListableBeanFactory, AutowireCapableBeanFactory, ConfigurableBeanFactory {
3.ApplicationContext
ApplicationContext除了具有了HierarchicalBeanFactory和ListableBeanFactory的功能,它還實現了其餘四個接口
public interface ApplicationContext extends EnvironmentCapable, ListableBeanFactory, HierarchicalBeanFactory, MessageSource, ApplicationEventPublisher, ResourcePatternResolver {結構圖以下
在查看applicationContext功能以前,須要弄清楚右邊這四個接口的功能是什麼
(1)ResourceLoader
加載資源的策略接口(如加載classpath下的配置文件,或者文件系統中的資源)
(2)ResourcePatternResolver
加載資源的策略接口(如Ant-style path pattern),對ResouceLoader的擴展;
(3)MessageSource
解析消息的策略接口,支持消息的參數化和國際化;
(4)EnvironmentCapable
該接口表示具有了持有環境變量的能力,全部的ApplicationContext都具有持有環境便量的能力;
(5)ApplicationEventPublisher
該接口表示封裝了事件發佈的功能;
到目前爲止,能夠看到ApplicationContext又增長了資源加載、消息解析、環境變量引用、事件發佈的功能;如今回頭看看ApplicationContext自身都實現了什麼功能
從方法列表中能夠看出其自身僅僅增長了對自身屬性支持;
接下來接續向下展開一層,結構圖以下:
1.ConfigurableApplicationContext
從名稱上能夠知道該接口是對ApplicationContext增長了配置的能力,該接口還集成了Lifecycle接口,先看看Lifecycle具有什麼功能
2.Lifecycle
該接口主要定義了對生命週期的控制,能夠被定義在容器中的Bean和spring容器使用,容器會將stop/start信號進行冒泡處理,從而能應用到每個組件上,同時能夠被JMX調用;
如今回頭查看ConfigurableApplicationContext
public interface ConfigurableApplicationContext extends ApplicationContext, Lifecycle, Closeable {
到此爲止,Spring容器的核心接口基本上分析完了,大體瞭解了這些核心接口的功能,以及隨着接口的擴展,功能愈來愈強大,能夠看到面向接口編程的威力。
接下來主要對ConfigurableApplicationContext下面的接口進行分析,最終要揭示spring容器如何啓動以及實例化Bean的。
結構圖
在這張結構圖中,主要關注點是AbstractApplicationContext,能夠看到AbstractApplicationContext繼承了ResourceLoader的默認實現DefaultResourceLoader,而且實現了接口DisposableBean;
1.DisposableBean
一般是被spring bean實現的接口,主要用來釋放資源,例如當銷燬一個緩存的單例時,就會調用該方法;當application context 關閉時,會銷燬全部的singletons;
2.AbstractApplicationContext 抽象類,在該類中主要使用了模板方法的設計模式,在該類中註冊了一下功能 BeanFactoryPostProcessor BeanPostProcessors ApplicationListeners MessageSource LifecycleProcessor 在該抽象類中,完成Spring IOC 容器加載的方法 refresh()很是重要,該方法是spring ioc容器的boot入口 下節中分析refresh()方法是如何完成IOC容器初始化的;