1. 程式人生 > >spring中的BeanFactory與ApplicationContext的作用和區別?

spring中的BeanFactory與ApplicationContext的作用和區別?

BeanFactory類關係繼承圖

1. BeanFactory類結構體系:

BeanFactory介面及其子類定義了Spring IoC容器體系結構,由於BeanFactory體系非常的龐大和複雜,因此要理解Spring IoC,需要先理清BeanFactory的繼承機構。

 

2. ApplicationContext的結構體系:

ApplicationContext介面是一個BeanFactory基礎上封裝了更多功能的,Spring中最為常用的IoC容器,其包含兩個子介面:ConfigurableApplicationContext、WebApplicationContext。

ConfigurableApplicationContext其結構體系如下:

 

詳細的結構體系如下:

a.AbstractApplicationContext結構體系如下:

 

b.ConfigurablePortletApplicationContext體系結構如下:

 

c.ConfigurableWebApplicationContext結構體系如下:

 

2).WebApplicationContext體系結構如下:

 

  1、容器是spring的核心,使IoC管理所有和元件
  2、spring的兩種容器:a、BeanFactoy
                                b、ApplicationContext應用上下文
  3、BeanFactory:BeanhFactory使用延遲載入所有的Bean,為了從BeanhFactory得到一個Bean,只要呼叫getBean()方法,就能獲得Bean

  4、ApplicationContext:a、提供文字資訊解析,支援I18N
                         b、提供載入檔案資源的通用方法
                         c、向註冊為監聽器的Bean傳送事件
                         d、ApplicationContext介面擴充套件BeanFactory介面
                         e、ApplicationContext提供附加功能
  5、ApplicationContext的三個實現類:a、ClassPathXmlApplication:把上下文檔案當成類路徑資源
                                     b、FileSystemXmlApplication:從檔案系統中的XML檔案載入上下文定義資訊

                                     c、XmlWebApplicationContext:從Web系統中的XML檔案載入上下文定義資訊

  6、在預設情況下,Bean全都是單態,在<bean>中的singleton為false
  7、<bean>中的id屬性必須遵循Java規範,而name屬性可以不遵循
  8、Bean的例項化的時候需要一些初始化的動作,同樣當不再使用的時候,需要從容器中將其銷燬
  9、物件的初始化:<bean init-method="方法名">
  10、物件的銷燬:<bean destroy-method="方法名">
      銷燬物件的過程:a、主執行緒先被中斷
                            b、Java虛擬機器使用垃圾回收機制回收Bean物件
  11、Bean設定:設值注入:1)簡單配置:<bean id="xxx" class="Bean的全稱類名">
                                                 <property name="xx" value="xxxxx"></property>
                                             </bean>
                                      value中的值可以是基本資料型別或者String型別,spring將會自動判斷設定的型別並且將其轉換成合適的值

2)引用配置:<bean id="xxx" class="Bean的全稱類名">
                                             <property name="xx" ref="xxxxx"></property>
                                         </bean>
                                      ref中的值是引用資料型別,spring容器會完成獲取工作
                          3)List和陣列:<bean id="xxx" class="Bean的全稱類名">
                                           <property name="list">
                                               <list>
                                                <value></value>
                                                <ref bean=""/>
                                               </list>
                                           </property>
                                        </bean>
                                        list元素內可以是任何元素,但不能違背Bean所需要的物件類

                          4)Set配置:和<list>一樣,將<list>改成<set>
                          5)Map配置:Map中的每條資料是由一個鍵和一個值組成,用<entry>元素來定

                                     <bean id="xxx" class="Bean的全稱類名">
                                           <property name="list">
                                              <entry key="key1">
                                                  <value></value>
                                              </entry>
                                           </property>
                                        </bean>
                                     <bean id="xxx" class="Bean的全稱類名">
                                           <property name="list">
                                              <entry key="key1">
                                                  <ref bean=""/>
                                              </entry>
                                           </property>
                                        </bean>
                                注意:配置entry時,屬性key的值只能是String,因為Map通常用String作為主鍵

                          6)Properties配置:使用<props>和<map>相似,最大區別是<prop>的值都是String

                  注意:使用設值注入必須要有set方法,通過name屬性找set方法

                  優勢:a、通過set()方法設定更直觀,更自然

                        b、當依賴關係較複雜時,使用set()方法更清晰
                構造子注入:必須要有無參和帶參的構造方法,加上index(值從0開始)屬性避免注入混

                           <constractor-arg>

               注意:設值注入可以和構造子注入混合使用。先呼叫構造方法產生物件,再呼叫set()方法賦值。但只使用設值注入時,會先呼叫無參的構造方法

               優勢:a、依賴關係一次性設定,對外不準修改

                     b、無需關心方式

                     c、注入有先後順序,防止注入失敗

Spring的IoC容器就是一個實現了BeanFactory介面的可例項化類。事實上,Spring提供了兩種不同的容器:一種是最基本的BeanFactory,另一種是擴充套件的ApplicationContext。BeanFactory 僅提供了最基本的依賴注入支援,而 ApplicationContext 則擴充套件了BeanFactory ,提供了更多的額外功能。二者對Bean的初始化也有很大區別。BeanFactory當需要呼叫時讀取配置資訊,生成某個類的例項。如果讀入的Bean配置正確,則其他的配置中有錯誤也不會影響程式的執行。而ApplicationContext 在初始化時就把 xml 的配置資訊讀入記憶體,對 XML 檔案進行檢驗,如果配置檔案沒有錯誤,就建立所有的Bean ,直接為應用程式服務。相對於基本的BeanFactory,ApplicationContext 唯一的不足是佔用記憶體空間。當應用程式配置Bean較多時,程式啟動較慢。

ApplicationContext會利用Java反射機制自動識別出配置檔案中定義的BeanPostProcessor、InstantiationAwareBeanPostProcessor和BeanFactoryPostProcessor,並自動將它們註冊到應用上下文中;而BeanFactory需要在程式碼中通過手工呼叫addBeanPostProcessor()方法進行註冊。

Bean裝配實際上就是讓容器知道程式中都有哪些Bean,可以通過以下兩種方式實現:
配置檔案(最為常用,體現了依賴注入DI的思想)
程式設計方式(寫的過程中向BeanFactory去註冊)

作用:

1. BeanFactory負責讀取bean配置文件,管理bean的載入,例項化,維護bean之間的依賴關係,負責bean的宣告週期。
2. ApplicationContext除了提供上述BeanFactory所能提供的功能之外,還提供了更完整的框架功能:

a. 國際化支援
b. 資源訪問:Resource rs = ctx. getResource(“classpath:config.properties”), “file:c:/config.properties”
c. 事件傳遞:通過實現ApplicationContextAware介面
3. 常用的獲取ApplicationContext的方法:
FileSystemXmlApplicationContext:從檔案系統或者url指定的xml配置檔案建立,引數為配置檔名或檔名陣列
ClassPathXmlApplicationContext:從classpath的xml配置檔案建立,可以從jar包中讀取配置檔案
WebApplicationContextUtils:從web應用的根目錄讀取配置檔案,需要先在web.xml中配置,可以配置監聽器或者servlet來實現
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<servlet>
<servlet-name>context</servlet-name>
<servlet-class>org.springframework.web.context.ContextLoaderServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
這兩種方式都預設配置檔案為web-inf/applicationContext.xml,也可使用context-param指定配置檔案
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/myApplicationContext.xml</param-value>
</context-param>