天天看點

spring IOC容器:控制反轉

首先闡述一下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

spring IOC容器:控制反轉

設計的主線是從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容器了。

繼續閱讀