Spring中的IOC_源碼_隨筆
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_源碼_隨筆