Spring ioc 叫控制反轉,也就是把創建Bean的動作交給Spring去完成。 spring ioc 流程大致為 定位-> 載入->註冊 先說幾個比較有意思的點 1.Spring中的通過IOC生成的Bean是存放在ConcurrentHashMap中的 2.通過xml配置SpringBean時 ...
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容器的具體表現,需要使用什麼樣的容器由客戶決定。bean工廠,是一個工廠,spring ioc的最頂層介面就是這個BeanFactory,它的作用是管理Bean,即實例化,定位,配置應用程式中的對象及建立這些對象間的依賴。
FactoryBean只是一個可以在IOC容器中被管理的一個Bean,是對各種處理過程和資源使用的抽象,FactoryBean在需要時產生另一個對象,而不返回自身,可以看作為一個抽象工廠。工廠Bean,是一個Bean,作用是產生其他Bean實例。通常情況下,Bean無須自己實現工廠模式,spring容器擔任工廠角色,但少數情況下,容器中的bean本身就是工廠,其他工廠是產生其他bean實例。
5.最終生產的Bean存在在FactoryBeanRegistrySupport.java中,是一個concurrentHashMap
使用Put方法存入
他的Key是 beanName + "#"+ 使用次數
依賴註入的流程
1.讀取BeanDefinition中信息,獲取其依賴關係
2.實例化
下麵說下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 (最上層)
補充
IOC的代理方式
如果被代理的類實現了一個介面,那麼預設使用JDK代理
如果沒有實現任何介面,那麼預設使用cglib