Spring BeanFactory與ApplicationContext 介紹

俺就不起網名發表於2018-08-01

目錄

 

一、BeanFactory

二、ApplicationContext(應用上下文)


一、BeanFactory

Spring 使用 BeanFactory 來例項化、配置和管理 Bean,它是IOC容器的核心介面,主要定義了getBean方法。
BeanFactory 只能管理單例(Singleton)Bean 的生命週期。它不能管理非單例Bean的生命週期,這是因為原型Bean例項被建立之後便被傳給了客戶端,容器失去了對它們的引用。
BeanFactory有著龐大的繼承、實現體系,有眾多的子介面、實現類。來看一下BeanFactory的基本類體系結構(介面為主):

 

BeanFactory最常見的實現類有 XmlBeanFactory 和 DefaultListableBeanFactory ,可以從classpath或檔案系統等獲取資源。

具體獲取Bean程式碼如下(beans.xml檔案和實體類程式碼自己寫):

		//通過資源載入器獲取載入檔案資源
        ResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
        Resource resource = resolver.getResource("beans/beans.xml");
        System.out.println(resource.getURL());

        //獲取beanFactory二種方式

        //方式一 XmlBeanFactory廢棄,不建議使用
        BeanFactory factory1 = new XmlBeanFactory(resource);

        //方式二 DefaultListableBeanFactory
        DefaultListableBeanFactory factory2 = new DefaultListableBeanFactory();
        XmlBeanDefinitionReader reader = new XmlBeanDefinitionReader(factory2);
        reader.loadBeanDefinitions(resource);
        Car car = (Car)factory2.getBean("car");//第一次呼叫factory.getBean方法才會呼叫預設構造器生成例項

        //spring在DefaultSingletonBeanRegistry類中提供了快取單例bean,用HashMap實現的,以beanName為key進行儲存,所以第二次get物件的時候不會呼叫構造器
        Car car2 = (Car)factory2.getBean("car");
        System.out.println(car==car2);//true,bean定義的預設是單例

總結:

1、XmlBeanFactory通過Resource裝載Spring配置資訊冰啟動IoC容器,然後就可以通過factory.getBean從IoC容器中獲取Bean了。
2、通過BeanFactory啟動IoC容器時,並不會初始化配置檔案中定義的Bean,初始化動作發生在第一個呼叫時。
3、對於單例項(singleton)的Bean來說,BeanFactory會快取Bean例項,所以第二次使用getBean時直接從IoC容器快取中獲取Bean。

二、ApplicationContext(應用上下文)

ApplicationContext,也是介面,由BeanFactory派生而來,它繼承了BeanFactory的基本功能,同時也擴充套件了部分功能。
在BeanFactory中,很多功能需要以程式設計的方式實現,而在ApplicationContext中則可以通過配置實現。
BeanFactory面向的是Spring框架,而ApplicationContext面向的是使用Spring框架的開發者。

相較於BeanFactorty,ApplicationContext提供了以下的功能:
(1)MessageSource, 提供國際化的訊息訪問  
(2)資源訪問,如URL和檔案  
(3)事件傳播特性,即支援aop特性
(4)載入多個(有繼承關係)上下文 ,使得每一個上下文都專注於一個特定的層次,比如應用的web層 

ApplicationContext的實現類主要有:

1、ClassPathXmlApplicationContext

配置檔案放在類路徑上

ApplicationContext applicationContext = new ClassPathXmlApplicationContext("beans/beans.xml");
Car car = (Car)applicationContext.getBean("car");

2、FileSystemXmlApplicationContext

配置檔案放在檔案系統下

ApplicationContext ac = new FileSystemXmlApplicationContext("beans/beans.xml");
Car car2 = (Car)ac.getBean("car");

3、AnnotationConfigApplicationContext

@Configuration註解獲取ApplicaitonContext方式

ApplicationContext ac = new AnnotationConfigApplicationContext(Car.class);
Car car2 = (Car)ac.getBean("car");

BeanFactroy與ApplicationContext的區別:

(例項化Bean的時機不同)BeanFactroy採用的是延遲載入形式來注入Bean的,即只有在使用到某個Bean時(呼叫getBean()),才對該Bean進行載入例項化,這樣,我們就不能發現一些存在的Spring的配置問題。而ApplicationContext則相反,它是在容器啟動時,一次性建立了所有的Bean。這樣,在容器啟動時,我們就可以發現Spring中存在的配置錯誤。 相對於基本的BeanFactory,ApplicationContext 唯一的不足是佔用記憶體空間。當應用程式配置Bean較多時,程式啟動較慢。


參考:https://www.cnblogs.com/xiaoxi/p/5846416.html

 

 

相關文章