本文乃學習整理參考而來spring
IoC概述:學習
在spring中,IoC容器實現了依賴控制反轉,它能夠再對象生成或初始化時直接將數據注入到對象中,也能夠經過將對象引用注入到對象數據域中的方式來注入方法調用的依賴,這種依賴注入是能夠遞歸的,對象被逐層注入。對象之間的相互依賴關係由IoC容器管理,並由容器完成注入,如對象的建立、賦值等,這樣很大程度簡化開發。this
結構圖以下spa
1.1 BeanFactoryprototype
接口BeanFactory:體現了spring爲提供給用戶的IoC容器所設定的最基本功能規範。code
接口BeanDefinition:spring經過BeanDefinition來管理spring容器中的各類對象以及他們之間的相互依賴關係。xml
源碼以下對象
** * IoC容器最基本功能 * 此類至關於容器中的具體容器產品 * @author qjc */ public interface BeanFactory { /** * 獲取產生對象的FactoryBean * 如:myObject是一個FactoryBean,使用&myObject獲得的是FactoryBean */ String FACTORY_BEAN_PREFIX = "&"; /** * 獲取IoC容器中管理的bean * @param name * @return * @throws BeansException */ Object getBean(String name) throws BeansException; /** * 判斷容器是否含有指定名稱的bean * @param name * @return */ boolean containsBean(String name); /** * 檢查指定名稱的bean是不是單例(能夠在BeanDefinition中指定) * @param name * @return * @throws NoSuchBeanDefinitionException */ boolean isSingleton(String name) throws NoSuchBeanDefinitionException; /** * 檢查指定名稱的bean是不是prototype類型(能夠在BeanDefinition中指定) * @param name * @return * @throws NoSuchBeanDefinitionException */ boolean isPrototype(String name) throws NoSuchBeanDefinitionException; /** * 檢查指定名稱的bean的Class類型是不是特定Class類型 * @param name * @param targetType 用戶指定 * @return * @throws NoSuchBeanDefinitionException */ boolean isTypeMatch(String name, Class targetType) throws NoSuchBeanDefinitionException; /** * 查詢指定名稱bean的Class類型 * @param name * @return * @throws NoSuchBeanDefinitionException */ Class<?> getType(String name) throws NoSuchBeanDefinitionException; /** * 查詢指定名稱bean的全部別名(用戶在BeanDefinition中指定的) * @param name * @return */ String[] getAliases(String name); }
說明:blog
在BeanFactory裏只對IOC容器的基本行爲做了定義,根本不關心你的bean是如何定義怎樣加載的。正如咱們只關心工廠裏獲得什麼的產品對象,至於工廠是怎麼生產這些對象的,這個基本的接口不關心。遞歸
1.2 IoC容器XmlBeanFactory
此類爲IoC容器最底層的實現類,提供基本IoC功能。與ApplicationContext實現原理相似,經過持有或擴展DefaultListableBeanFactory來獲取IoC容器功能。
關係結構圖以下
源碼
public class XmlBeanFactory extends DefaultListableBeanFactory { /** * XmlBeanDefinitionReader:讀取XML的類 */ private final XmlBeanDefinitionReader reader = new XmlBeanDefinitionReader(this); /** * @param resource spring用來封裝io操做的類,可以下構建 * ClassPathResource resource = new ClassPathResource("bean.xml"); * @throws BeansException */ public XmlBeanFactory(Resource resource) throws BeansException { this(resource, null); } public XmlBeanFactory(Resource resource, BeanFactory parentBeanFactory) throws BeansException { super(parentBeanFactory); this.reader.loadBeanDefinitions(resource); } }
IoC容器建立的基本步驟
ClassPathResource res = new ClassPathResource("bean.xml"); DefaultListableBeanFactory factory = new DefaultListableBeanFactory(); XmlBeanDefinitionReader reader = new XmlBeanDefinitionReader(factory); reader.loadBeanDefinitions(resource);
一、建立IoC配置文件的抽象資源(包含BenaDefinition定義信息)
二、建立BeanFactory
三、建立BeanDefinition讀取器
四、讀取配置信息,完成載入和註冊後IoC容器就建立出來了
一般咱們不是這麼建立的,而是使用ApplictionContext接口建立
1.3 ApplictionContext
ApplictionContext屬於高級IoC容器,它在BeanFactory基礎上添加了特性(其餘容器不具有)。
1. 支持信息源,能夠實現國際化。(實現MessageSource接口)
2. 訪問資源。(實現ResourcePatternResolver接口,這個後面要講)
3. 支持應用事件。(實現ApplicationEventPublisher接口)
參考:
《Spring 技術內幕》