1. 程式人生 > 其它 >Spring-BeanFactory與ApplicationContext的區別

Spring-BeanFactory與ApplicationContext的區別

技術標籤:Spring系列springjava後端

BeanFactory與ApplicationContext的區別

BeanFactory容器: (提供儲存,儲存Bean資訊)

它是最簡單的容器,給 DI 提供了基本的支援,它用 org.springframework.beans.factory.BeanFactory 介面來定義。BeanFactory或者相關的介面,如 BeanFactoryAware,InitializingBean,DisposableBean,在 Spring中仍然存在具有大量的與 Spring 整合的第三方框架的反向相容性的目的。
在spring中,有大量的BeanFactory介面的實現。其中,最常使用的就是XMLBeanFactory類。這個容器從一個xml檔案中讀取配置元資料,由這些元資料來生成一個被配置的系統或應用。

BeanFactory 介面,這是一個用來訪問 Spring 容器的 root 介面,要訪問 Spring 容器,我們將使用 Spring 依賴注入功能,使用 BeanFactory 介面和它的子介面。
在這裡插入圖片描述

特性:

  • Bean 的例項化/串聯

通常情況,BeanFactory 的實現是使用懶載入的方式,這意味著 beans 只有在我們通過 getBean() 方法直接呼叫它們時才進行例項化
實現 BeanFactory 最常用的 API 是 XMLBeanFactory:

public class Test{ 
   public static void main(String[] args) {
XmlBeanFactory factory = new XmlBeanFactory (new ClassPathResource("beans.xml")); HelloWorld obj = (HelloWorld) factory.getBean("helloWorld"); obj.getMessage(); } }

ApplicationContext 介面, ApplicationContext 是 Spring 應用程式中的中央介面,用於嚮應用程式提供配置資訊。它繼承了 BeanFactory 介面,所以 ApplicationContext 包含 BeanFactory 的所有功能以及更多功能!它的主要功能是支援大型的業務應用的建立

特性:

  • Bean instantiation/wiring
  • Bean 的例項化/串聯
  • 自動的 BeanPostProcessor 註冊
  • 自動的 BeanFactoryPostProcessor 註冊
  • 方便的 MessageSource 訪問
  • ApplicationEvent 的釋出

與 BeanFactory 懶載入的方式不同,它是預載入,所以,每一個 bean 都在 ApplicationContext 啟動之後例項化

public class Test{ 
   public static void main(String[] args) { 
    	 ApplicationContext xmlContext = new ClassPathXmlApplicationContext("classpath:application.xml");
       	 User user = xmlContext.getBean("user", User.class);
       	 System.out.println(user);

        ApplicationContext annotContext = new AnnotationConfigApplicationContext(Config.class);
        User beanUser = annotContext.getBean("user", User.class);
        System.out.println(beanUser); 
   }
}

ApplicationContext容器: (提供功能,在BeanFactory的基礎上增加了一些國際化、載入Bean、監聽器等功能)

該容器添加了更多的企業特定的功能,例如從一個屬性檔案中解析文字資訊的能力,釋出應用程式事件給感興趣的事件監聽器的能力。該容器是由 org.springframework.context.ApplicationContext 介面定義

在這裡插入圖片描述

  • BeanFactory是bean的工廠,Spring的頂層核心介面,沒有BeanFactory就沒有Bean的存在,工廠只負責按照要求生產Bean,Bean的定義資訊,要生產成什麼樣有下家(ApplicationContext)說了算。
  • ApplicationContext面向的是客戶,所以需要更好的服務使用者,不僅要提供Bean和呼叫工廠去生產Bean,還要提供一系列人性化的服務(如國際化、載入Bean定義、監聽器等等。。。),怎麼生產Bean的事交給工廠去做。
  • ApplicationContext 容器包括 BeanFactory 容器的所有功能,所以通常不建議使用BeanFactory。BeanFactory 仍然可以用於輕量級的應用程式
  • ApplicationContext 包含 BeanFactory 的所有特性,通常推薦使用前者。但是也有一些限制情形,比如移動應用記憶體消耗比較嚴苛,在那些情景中,使用更輕量級的 BeanFactory 是更合理的。然而,在大多數企業級的應用中,ApplicationContext 是你的首選。