一 spring源碼分析--- IOC容器

前言java

在分析spring源碼以前,推薦Spring做者 Rod Johnson的兩本書:spring

  1. Expert One-on-One J2EE Design and Development
  2. Expert One-on-One J2EE Development without EJB

這兩本書是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();


2.ConfigurableListableBeanFactory

public interface ConfigurableListableBeanFactory
		extends ListableBeanFactory, AutowireCapableBeanFactory, ConfigurableBeanFactory {

該接口繼承了BeanFactory下的三大子接口的全部功能,使其具有了可配置、可自動裝配、可枚舉Bean屬性的能力,這些能力都是繼承下來的,它自身的功能是提供了分析和修改Bean定義的設施以及預先實例化單例Bean的能力;


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 {

該接口是SPI ( Server Provider Interface )接口,被大部分applicationcontext實現,功能:提供對application context配置的設施;


到此爲止,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容器初始化的;

相關文章
相關標籤/搜索