在開發應用時,常常須要進行組件間的調用,這種依賴關係若是固化在組件設計中,就會形成依賴關係的僵化和維護難度的增長,Ioc容器就是讓獲取資源的方向反轉,主動管理這些依賴關係,將這些依賴關係注入到組件中,會讓這些依賴關係的適配和管理更加靈活。編程
一、接口注入數據結構
二、setter注入架構
三、構造器注入框架
BeanFactorypost
定義了Ioc容器的基本的形式;spa
提供了Ioc容器應該遵照的最基本的服務契約;設計
是咱們使用Ioc容器所應該遵照的最基本的編程規範;xml
典型的幾個實現:接口
XmlBeanFactory生命週期
DefaultListableBeanFactory
編程的方式使用DefaultListableBeanFactory
Resource resource = new ClassPathResource("XmlBeanFactory.xml", getClass()); DefaultListableBeanFactory factory = new DefaultListableBeanFactory(); XmlBeanDefinitionReader reader = new XmlBeanDefinitionReader(factory); reader.loadBeanDefinitions(resource);
ApplicationContext
擴展了MessageSource接口,支持不一樣的信息源,能夠支持國際化的實現,爲開發多語言版本應用提供服務
訪問資源,體如今ResourceLoader對Resource接口的支持上,咱們能夠從不一樣的地方獲得Bean的定義
支持應用事件
提供了一系列的附加服務,使得ApplicationContext與BeanFactory相比是一種面向框架的使用風格,企業級項目中,以ApplicationContext爲Ioc容器的基本形態。
1)建立Ioc文件的抽象資源,其中包含了BeanDefinition的信息;
2)建立BeanFactory,這裏使用了DefaultListableBeanFactory
3)建立BeanDefinition的讀取器,這裏使用 XmlBeanDefinitionReader來載入Xml文件形式的BeanDefinition,經過一個回調配置給BeanFactory
4)解析BeanDefinition,完成載入和註冊Bean後,能夠直接使用Ioc容器了。
資源定位
由ResourceLoader經過統一的Resource接口來完成
BeanDefinition的載入
將用戶定義好的Bean表示成Ioc容器內部的數據結構
向Ioc容器註冊 BeanDefinition,是調用BeanDefinitionRegistry接口完成的
預啓動
設置啓動時間
將active flag設置爲true
初始化屬性資源
檢查必須的一些屬性配置
2.建立DefaultListableBeanFactory
三、對BeanFactory進行一系列的設置
四、調用BeanFactory的後置處理器
五、註冊BeanFactory的後置處理器
六、初始化MessageSource
七、初始化上下文中的事件機制
八、初始化一些比較特殊的Bean
九、檢查監聽Bean,並向容器註冊這些Bean
十、實例化全部的(non-lazy-init)單例Bean
十一、發佈事件,結束容器的啓動
Bean實例的建立
爲Bean實例設置屬性
調用Bean的初始化方法
應用經過Ioc容器使用Bean
當關閉容器時,調用Bean的銷燬方法
若是設置lazy-int屬性時,依賴注入發生在Ioc容器的初始化的過程當中
lazy-int預實例化發生在 refresh()中的finishBeanFactoryInitialization中
Spring 在使用FactoryBean時,使用了工廠模式;
FactoryBean是Spring中的一個接口;
它提供了三個功能:
T getObject()
Class<?> getObjectType();
boolean isSingleton();
FactoryBean的生產特性 是在getBean中起做用的。
這個接口提供了兩個功能能:
Object postProcessBeforeInitialization(Object bean, String beanName)
Object postProcessAfterInitialization(Object bean, String beanName)
Spring提供特定的aware接口實現Bean對Ioc容器的感知