首先闡述一下IOC的概念,控制反轉,英文Inversion of Control,Martin經典的問題就是“哪些方面的控制被反轉了”,他的答案是:依賴對象的獲得被反轉了。基于這個結論他創造了一個新的名字即依賴注入,(DI Dependency Injection)。控制反轉屬于比較抽象一點的概念,而依賴注入更像是一種具體的實作方式。除了依賴注入還有一種方式就是依賴查找(Dependency Lookup),使用不是很廣泛。
在此,再補充一點,IOC是一種設計模式,不應該把IOC等同于Spring IOC.隻不過Sping的設計采用了這種思想。有很多産品對此的實作。隻不過Spring IOC是java語言中最常用的。
Spring IOC負責建立對象,管理對象,裝配對象,配置對象,并且管理這些對象的整個生命周期。
Spring IOC容器中生成bean的兩個重要的接口:BeanFactory、ApplicationContext。
其中BeanFactory 是springIOC容器的最基本的接口,定義spring IOC容器最基本的方法。比如:getBean();
ApplicationContext較BeanFactory是比較進階形式的spring ioc容器,增加了面向架構的特性,以及對應用環境做了适配。
一、BeanFactory

設計的主線是從beanFactory –>HierarchicalBeanFactory–>ConfigurableBeanFactory
BeanFactory定義基本的IOC容器規範。比如getBean()這樣的基本方法。
hierarchicalBeanFactory在BeanFactory基礎上增加getParentBeanFactory方法,增加雙親IOC容器的功能。
在接下來的ConfigurableBeanFactory接口中,主要增加一些配置功能,例如:設定雙親IOC容器:setParentBeanFactory、配置bean的後置處理addBeanPostProcessor。
簡單分析一個Beanfactory的具體實作類xmlBeanfactroy的設計。
XmlBeanFactory的源碼如下:
@SuppressWarnings({"serial", "all"})
public class XmlBeanFactory extends DefaultListableBeanFactory {
private final XmlBeanDefinitionReader reader = new XmlBeanDefinitionReader(this);
/**
* Create a new XmlBeanFactory with the given resource,
* which must be parsable using DOM.
* @param resource XML resource to load bean definitions from
* @throws BeansException in case of loading or parsing errors
*/
public XmlBeanFactory(Resource resource) throws BeansException {
this(resource, null);
}
/**
* Create a new XmlBeanFactory with the given input stream,
* which must be parsable using DOM.
* @param resource XML resource to load bean definitions from
* @param parentBeanFactory parent bean factory
* @throws BeansException in case of loading or parsing errors
*/
public XmlBeanFactory(Resource resource, BeanFactory parentBeanFactory) throws BeansException {
super(parentBeanFactory);
this.reader.loadBeanDefinitions(resource);
}
}
xmlBeanFactory 已經廢棄了,原因應該是此類過于簡單吧。并且在spring建議使用
DefaultListableBeanFactory和XmlBeanDefinitionReader。
這兩個類就是xmlbeanfactroy實作中使用到的兩個類。
DefaultListableBeanFactory是BeanFactroy系列中最成熟的一個類,也就是可以供我們使用的類,ApplicationContext也是繼承了此類。
xmlBeanFactory的功能就是可以讀取以xml檔案配置的bean資訊。
她的讀取xml是由XmlBeanDefinitionReader來完成的。擷取xml資源的位置是Resource來完成的,Resource接口是一個spring封裝的IO接口。
我們使用程式設計的方式使用以下DefaultListableBeanFactory和XmlBeanDefinitionReader。
代碼如下:
//定位資源
ClassPathResource path = new ClassPathResource("Bean.xml");
//建立BeanFactroy
DefaultListableBeanFactory beanFactory = new DefaultListableBeanFactory();
//定義reader
XmlBeanDefinitionReader reader = new XmlBeanDefinitionReader(beanFactory);
reader.loadBeanDefinitions(path);
這樣就可以使用beanFactory擷取xml檔案中定義的Bean的了。
總結一下這種程式設計方式的步驟
使用IoC容器大概需要以下幾步驟:
1、建立抽象資源檔案,包含BeanDefinition的定義資訊。
2、建立BeanFactory
3、讀取抽象資源檔案。建立一個BeanDefinition的讀取器。
4、從定義好的資源位置讀入配置資訊,解析由XmlBeanFactory來完成。完成整個載入和注冊Bean定義之後,需要的IOC容器就建立起來了。這個時候就可以直接使用IOC容器了。