平時在開發程序的時候,每個對象在使用它的合作對象時都要自己主動去創建這個合作對象,需要時就主動創建出來,創建權在自己手裡,但是這種方式耦合度就很高;在使用Spring之後,将對象的創建權交給Spring容器來處理,所謂的控制就是将對象創建控制權交給了容器來創建,即容器控制了對象的創建,起初依賴對象的創建時對象主動創建,是正轉,而反轉就是将依賴對象的創建及注入給Spirng容器處理,對象隻是被動的接受依賴對象。
注入方式在IOC中,為被注入對象提供被依賴對象有三種方式:構造方法注入,setter注入,接口注入
DI(依賴注入)概念容器動态的将依賴關系注入到組件中,容器實例化對象的時候主動将它依賴的類注入給它
IOC的體系結構設計結構圖
下面對結構圖進行簡要分析,來理解這個接口設計圖
第一條接口設計主線是從BeanFactory到HierarchicalBeanFactory再到ConfigurableBeanFactory,BeanFactory定義了基本方法,例如getBean()等,HierarchicalBeanFactory增加了getParentBeanFactory接口功能,使BeanFactory具備了雙親IOC容器的管理功能;ConfigurableBeanFactory主要定義了一些對BeanFactory的配置功能,例如setParentBeanFactory()設置雙親IOC容器,通過addBeanPostProcessor()配置Bean後置管理器等;通過這些接口設計的疊加,定義了BeanFactory就是簡單IOC容器的基本功能
第二條設計主線是以ApplicationContext為核心的接口設計,從BeanFactory到ListableBeanFactory再到ApplicationContext,再到我們常用的WebApplicationContext或者ConfigurableApplicationContext。L在這個接口體系中ListableBeanFactory和HierarchicalBeanFactory兩個接口,連接BeanFactory接口定義和ApplicationContext應用上下文的接口定義。在ListableBeanFactory接口中,細化了許多BeanFactory接口功能,例如getBeanDefinitionNames()方法;對于ApplicationContext接口,它通過繼承MessageSource,ResourceLoader,ApplicationEventPublisher,在BeanFactory簡單IOC容器的基礎上添加了許多對高級容器的特性支持。
Resource體系org.springframework.core.io.Resource,它的每一個實現類都代表了一周資源的訪問策略,例如
ClassPathResource、RLResource、FileSystemResource 等。
ResourceLoader 體系
有了資源之後,就要對資源進行加載,Spring就是利用ResourceLoader來進行統一的資源加載
BeanFactory體系
BeanFactory提供的是最基本的IOC容器的功能,并且提供了IoC容器所應該遵守的最基本的服務契約;BeanFactory隻是一個接口,而例如DefaultListableBeanFactory、XmlBeanFactory、ApplicationContet等都可以提供具體的實現。
BeanFactory基本方法
BeanFactory接口提供了使用IOC容器的基本接口規範,Spring還提供了符合這個IOC容器的一系列容器進行具體實現;通過XmlBeanFactory的實現為例進行說明:
從圖中可以看到類之間的聯系
從源碼可知,XmlBeanFactory繼承自DefaultListableBeanFactory,XmlBeanFactory新增了讀取XML文件的方法
XmlBeanFactory就是通過這個方法進行xml讀取,方法傳參需要Resource做為參數進行傳遞,對xmlBeanDefinitionReader對象初始化,以及使用這個對象來完成對loadBeanDefinitions的調用
BeanDefinition體系用來描述Spring中的Bean對象。
BeanDefinitionReader體系
讀取Spring配置文件内容,并将其轉成IOC容器内部的數據結構:BeanDefinition
ApplicationContext體系
ApplicationContext除了能夠提供前面介紹的容器的基本功能,還為用戶提供了BeanFactory不具備的新特性
我們通過FileSystemXmlApplicationContext的實現為例來說明ApplicationContext的設計原理
FileSystemXmlApplicationContext有兩個重要的功能
這個refresh()過程會涉及IOC容器啟動的複雜操作,關于這個reresh()在IOC容器啟動時的具體表現,在後面再進行詳細分析
實現代碼如下:
調用這個方法,可以得到FileSystemResource的資源定位
,更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!