面試還不知道BeanFactory和ApplicationContext的區別?

接口 BeanFactory 和 ApplicationContext 都是用來從容器中獲取 Spring beans 的,可是,他們兩者有很大不一樣php

我看到過不少問 BeanFactory 和 ApplicationContext 不一樣點的問題,考慮到這,我應該使用前者仍是後者從 Spring 容器中獲取 beans 呢?請向下看 java

directory-1161965_640.jpg

什麼是 Spring Bean

這是一個很是簡單而又很複雜的問題,一般來講,Spring beans 就是被 Spring 容器所管理的 Java 對象,來看一個簡單的例子面試

package com.zoltanraffai;  
public class HelloWorld { 
   private String message;  
   public void setMessage(String message){ 
      this.message  = message; 
   }  
   public void getMessage(){ 
      System.out.println("My Message : " + message); 
   } 
}
複製代碼

在基於 XML 的配置中, beans.xml 爲 Spring 容器管理 bean 提供元數據spring

什麼是 Spring 容器

Spring 容器負責實例化,配置和裝配 Spring beans,下面來看如何爲 IoC 容器配置咱們的 HelloWorld POJOapp

<?xml version = "1.0" encoding = "UTF-8"?>
<beans xmlns = "http://www.springframework.org/schema/beans" xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation = "http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
   <bean id = "helloWorld" class = "com.zoltanraffai.HelloWorld">
      <property name = "message" value = "Hello World!"/>
   </bean>
</beans>
複製代碼

如今,它已經被 Spring 容器管理了,接下來的問題是:咱們怎樣獲取它?this

BeanFactory 和 ApplicationContext 的不一樣點

BeanFactory 接口

這是一個用來訪問 Spring 容器的 root 接口,要訪問 Spring 容器,咱們將使用 Spring 依賴注入功能,使用 BeanFactory 接口和它的子接口 特性:spa

  • Bean 的實例化/串聯 一般狀況,BeanFactory 的實現是使用懶加載的方式,這意味着 beans 只有在咱們經過 getBean() 方法直接調用它們時才進行實例化 實現 BeanFactory 最經常使用的 API 是 XMLBeanFactory 這裏是如何經過 BeanFactory 獲取一個 bean 的例子:
package com.zoltanraffai;  
import org.springframework.core.io.ClassPathResource;  
import org.springframework.beans.factory.InitializingBean; 
import org.springframework.beans.factory.xml.XmlBeanFactory; 
public class HelloWorldApp{ 
   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 訪問(i18n)
  • ApplicationEvent 的發佈 與 BeanFactory 懶加載的方式不一樣,它是預加載,因此,每個 bean 都在 ApplicationContext 啓動以後實例化 這裏是 ApplicationContext 的使用例子:
package com.zoltanraffai;  
import org.springframework.core.io.ClassPathResource;  
import org.springframework.beans.factory.InitializingBean; 
import org.springframework.beans.factory.xml.XmlBeanFactory; 
public class HelloWorldApp{ 
   public static void main(String[] args) { 
      ApplicationContext context=new ClassPathXmlApplicationContext("beans.xml"); 
      HelloWorld obj = (HelloWorld) context.getBean("helloWorld");    
      obj.getMessage();    
   }
}
複製代碼

總結

ApplicationContext 包含 BeanFactory 的全部特性,一般推薦使用前者。可是也有一些限制情形,好比移動應用內存消耗比較嚴苛,在那些情景中,使用更輕量級的 BeanFactory 是更合理的。然而,在大多數企業級的應用中,ApplicationContext 是你的首選。code

靈魂追問

  • 如何使用 BeanPostProcessor 和 BeanFactoryPostProcessor ?
  • 你瞭解 Spring Bean 的生命週期嗎?瞭解了這些對與 bean 的使用將有很是大的幫助.

歡迎持續關注,後續會出一系列文章進行 Spring 知識點解釋與串聯,輕鬆搞定面試那點事,以及在工做中充分利用 Spring 的特性cdn


a (1).png

翻譯自:Difference Between BeanFactory and ApplicationContext in Spring

相關文章
相關標籤/搜索