Spring提供了兩個(gè)基本功能:IOC和AOP,基于此形成了Spring的生態(tài)環(huán)境,其中IOC又是整個(gè)Spring生態(tài)的基礎(chǔ),也就是IOC是Spring最核心的功能。
Spring IOC即反向控制,也可以叫依賴注入,把bean(組件)的初始化工作交給IOC容器,而不是在程序中完成,這就將組件的初始化和組件真正的核心功能相隔離,做到了解耦;另外,Spring IOC提倡面向接口編程,同樣是為了解耦。Spring幫助我們使軟件的結(jié)構(gòu)符合,開閉原則(對修改封閉,對擴(kuò)展開發(fā):不需要修改代碼來增加新的功能),是解耦組件依賴關(guān)系的利器。
下面我們通過對Spring IOC機(jī)制源碼的學(xué)習(xí),更好的理解Spring的IOC功能。
將從組成和行為兩個(gè)角度來粗略分析Spring IOC容器,本文注意基于Spring IOC容器的組成來分析。
Spring容器主要指BeanFactory或者ApplicationContext,而我們常用的是后者。

由此圖,我們可以看到Spring容器繼承關(guān)系的一個(gè)結(jié)構(gòu)圖。核心接口就是BeanFactory,它提供了容器的基本方法getBean以獲得容器內(nèi)的組件,HierarchicalBeanFactory,ListableBeanFactory,AutowireCapableBeanFactory三個(gè)接口分別繼承自BeanFactory,并對BeanFactory的功能做了擴(kuò)展。HierarchicalBeanFactory提供了父子容器的功能,ListableBeanFactory提供了容器內(nèi)Bean的列表操作功能,AutowireCapableBeanFactory則提供了Bean的自動(dòng)裝配功能;ConfigurableBeanFactory則提供了BeanFactory的一些配置功能;這就是BeanFactory接口層次關(guān)系圖,XmlBeanFactory是一個(gè)常見的BeanFactory實(shí)現(xiàn)它就實(shí)現(xiàn)了上述接口以提供完整的容器功能,同樣依照此接口層次實(shí)現(xiàn)也可以達(dá)到解耦、職責(zé)清晰的目的。
ApplicationContext同樣擁有BeanFactory的上述能力,所以它繼承了BeanFactory體系的大部分接口,上圖中有一點(diǎn)是不準(zhǔn)確的,ApplicationContext并未繼承AutowireCapableBeanFactory,它的實(shí)現(xiàn)類是通過持有BeanFactory實(shí)例來擁有自動(dòng)裝配的功能(它不對外暴露自動(dòng)裝配功能),特別地,ApplicationContext實(shí)現(xiàn)了MessageSource、ResourceLoader、ApplicationEventPublisher三個(gè)接口,以擁有對國際化、加載資源、事件機(jī)制的支持。
常見的BeanFactory實(shí)現(xiàn)有XmlBeanFactory,DefaultListableBeanFactory,前者繼承自后者,而后者也是Spring中BeanFactory默認(rèn)的全功能實(shí)現(xiàn),ApplicationContext也是通過持有它而實(shí)現(xiàn)。
DefaultListableBeanFactory的使用需要我們?nèi)ゼ虞d特定的配置資源,并配置解析器去解析,XmlBeanFactory只要求我們?nèi)ゼ虞d需要的Xml配置資源。
我們在項(xiàng)目中更推薦使用ApplicationContext,它的實(shí)現(xiàn)類常見的有WebApplicationContext等,它除了幫助我們實(shí)現(xiàn)了資源加載功能外,還提供了上述的高級功能。