1.BeanFactory功能


- 具體的方法的功能通過方法名可知,其中,
isTypeMatch()
是用來查詢指定了名字的Bean的Class類型是否是特定的Class類型。這個Class類型可以由用戶來指定。
- 另外需要注意的是有個常量
FACTORY_BEAN_PREFIX = "&";
這個主要是用於FactoryBean上。FactoryBean和BeanFactory的區別需要知道:BeanFactory是一個工廠,也就是一個容器,是來管理bean的;FactoryBean是一個bean,所以也是由BeanFactory來管理的,不過FactoryBean不是一個普通的Bean,它會表現出工廠模式的樣子(也可以理解為修飾器),是一個能產生或者修飾對象生成的工廠Bean,里面的getObject()就是用來獲取FactoryBean產生的對象。所以在BeanFactory中使用“&”來得到FactoryBean本身,用來區分通過容器獲取FactoryBean產生的對象還是獲取FactoryBean本身。
2.BeanFactory的設計原理


- BeanFactory接口提供了使用IoC容器的規范。在這個基礎上,Spring還提供了符合這個IoC容器接口的一系列容器的實現供開發人員使用。這里以XmlBeanFactory的實現為例來說明簡單IoC容器的設計原理。
- 在繼承體系中,XmlBeanFactory繼承自DefaultListableBeanFactory這個類,后者非常重要,是經常要用到的一個IoC容器的實現,比如在設計應用上下文ApplicationContext時就會用到它。DefaultListableBeanFactory實際上包含了基本IoC容器所具有的重要功能,通過查看源碼可知許多我們正常使用的基本容器(如XmlBeanFactory)和ApplicationContext都是以這個容器為基礎的。
- 在Spring中,實際上是把DefaultListableBeanFactory作為一個默認的功能完整的IoC容器來使用的。XmlBeanFactory在繼承了DefaultListableBeanFactory容器的功能的同時,增加了新的功能,這些功能很容易從XmlBeanFactory的名字上猜到。它是一個與XML相關的BeanFactory,也就是說它是一個可以讀取以XML文件方式定義的BeanDefinition的IoC容器。構造XmlBeanFactory這個loC容器時,需要指定BeanDefinition的信息來源,而這個信息來源需要封裝成Spring中的Resource類來給出。Resource是Spring用來封裝I/O操作的類。比如,我們的BeanDefinition信息是以XML文件形式存在的,那么可以使用像
ClassPathResourcere s=new ClassPathResource("beans.xml");
這樣具體的ClassPathResource來構造需要的Resource,然后將Resource作為構造參數傳遞給XmlBeanFactory構造函數。這樣,IoC容器就可以方便地定位到需要的BeanDefinition信息來對Bean完成容器的初始化和依賴注入過程。
- 參考了XmlBeanFactory的實現,我們可以了解到使用基本容器(這里指的是DefaultListableBeanFactory)的基本過程。需要幾個關鍵的組件(Resource、BeanDefinitionReader和DefaultListableBeanFactory),其實也就是這三個組件來對應IoC初始化的三個過程:定位,載入和注冊。定位就是找到相應的配置文件,轉換為抽象資源(Resource),載入就是BeanDefinitionReader.loadBeanDefinitions(resource)所做的事,將抽象資源解析為BeanDefinition,BeanDefinition是Spring用來表示我們所定義的Bean的數據結構。注冊就是將BeanDefinition“存儲”在BeanFactory中。下面是編程式使用IoC容器:
ClassPathResource res = new ClassPathResource("beans .xml");//定位
DefaultListableBeanFactory factory = new DefaultListableBeanFactory();
XmlBeanDefinitionReader reader = new XmlBeanDefinitionReader(factory);
reader.loadBeanDefinitions(res);//開始載入的入口函數,載入完就注冊