1. 程式人生 > >Spring中的IOC_源碼_隨筆

Spring中的IOC_源碼_隨筆

ade spring源碼 過程 XML app path alt clas 都是

Spring ioc 叫控制反轉,也就是把創建Bean的動作交給Spring去完成。

spring ioc 流程大致為 定位-> 加載->註冊

先說幾個比較有意思的點

1.Spring中的通過IOC生成的Bean是存放在ConcurrentHashMap中的

技術分享圖片

2.通過xml配置SpringBean時,spring會通過dom解析的方式解析xml

技術分享圖片

3.ioc中使用了大量的委派模式,導致源碼。。。閱讀極其困難。

4.BeanFactory和FactoryBean

  BeanFactory是指IOC容器編程抽象,比如ApplicationContext,xmlBeanFactory等,都是IOC容器的具體表現,需要使用什麽樣的容器由客戶決定

  FactoryBean只是一個可以在IOC容器中被管理的一個Bean,是對各種處理過程和資源使用的抽象,FactoryBean在需要時產生另一個對象,而不返回自身,可以看作為一個抽象工廠。

5.最終生產的Bean存在在FactoryBeanRegistrySupport.java中,是一個concurrentHashMap

技術分享圖片

使用Put方法存入

技術分享圖片

他的Key是 beanName + "#"+ 使用次數

技術分享圖片

下面說下IOC的基本步驟

1.初始化的入口在容器的實現中通過refresh()來實現

2.加載Bean進入IOC容器使用的是loadBeanDefinition

  大致過程如下:

  2.1 ResourceLoader進行資源定位(默認DefaultResourceLoader),同時上下文本身給出了ResourceLoader的實現,可以從類路徑,文件系統,URL等方式定位資源。

  2.2 比如是使用xmlBeanFacotry作為IOC容器,需要為它指定bean定義的資源,也就是bean定義文件時通過抽象成Resource來被IOC處理,容器通過BeanDefinitionReader來定義信息的解析和Bean信息的註冊,通常使用XmlBeanDefinitionReader來解析bean的xml定義文件--委派給BeanDefinitionParserDelegate來實際處理從而得到Bean的定義信息

  2.3使用LoadBeanDefinition,RegisterBeanDefinition這些方法來處理BeanDefinition服務,容器解析得到BeanDefinitionIoc以後,需要把它在IOC容器中註冊,這是由IOC實現BeanDefinitRegistry實現的。註冊過程就是IOC容器內部維護一個HashMap來保存得到的BeanDefinition。

3.我們通過BeanFactory和ApplicationContex來享受IOC服務。

下面我們來打開一份spring源碼,來看看繼承關系

ClassPathXmlApplicationContext- AbstractXmlApplicationContext - AbstractRefreshableConfigApplicationContext - AbstractRefreshableApplicationContext - AbstractApplicationContext - DefaultResourceLoader / ConfigurableApplicationContext - ApplicationContext - ListableBeanFactory / HierarchicalBeanFactory -BeanFactory (最上層)

Spring中的IOC_源碼_隨筆