BeanFactory功能與設計原理


 1.BeanFactory功能

image.pngimage.png

  • 具體的方法的功能通過方法名可知,其中,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的設計原理

image.png

image.png

  • 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);//開始載入的入口函數,載入完就注冊



免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM