最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Spring中的ApplicationContext與BeanFactory詳解

 更新時間:2024年01月05日 10:29:46   作者:獵戶星座。  
這篇文章主要介紹了Spring中的ApplicationContext與BeanFactory詳解,Spring的IoC容器就是一個實現(xiàn)了BeanFactory接口的可實例化類,事實上, Spring提供了兩種不同的容器,一種是最基本的BeanFactory,另一種是擴展的ApplicationContext,需要的朋友可以參考下

前言

Spring的IoC容器就是一個實現(xiàn)了BeanFactory接口的可實例化類。

事實上, Spring提供了兩種不同的容器:一種是最基本的BeanFactory,另一種是擴展的ApplicationContext。

一、BeanFactory

BeanFactory 是 Spring 的“心臟”。它就是 Spring IoC 容器的真面目。Spring 使用 BeanFactory 來實例化、配置和管理 Bean。

BeanFactory:是IOC容器的核心接口, 它定義了IOC的基本功能,我們看到它主要定義了getBean方法。getBean方法是IOC容器獲取bean對象和引發(fā)依賴注入的起點。方法的功能是返回特定名稱的Bean。

BeanFactory 是初始化 Bean 和調用它們生命周期方法的“吃苦耐勞者”。

注意,BeanFactory 只能管理單例(Singleton)Bean 的生命周期。

它不能管理原型(prototype,非單例)Bean 的生命周期。這是因為原型 Bean 實例被創(chuàng)建之后便被傳給了客戶端,容器失去了對它們的引用。

BeanFactory有著龐大的繼承、實現(xiàn)體系,有眾多的子接口、實現(xiàn)類。來看一下BeanFactory的基本類體系結構(接口為主):

這是我畫的BeanFactory基本的類體系結構,這里沒有包括強大的ApplicationContext體系。

具體:

1、BeanFactory作為一個主接口不繼承任何接口,暫且稱為一級接口。

2、有3個子接口繼承了它,進行功能上的增強。這3個子接口稱為二級接口。

3、ConfigurableBeanFactory可以被稱為三級接口,對二級接口HierarchicalBeanFactory進行了再次增強,它還繼承了另一個外來的接口SingletonBeanRegistry

4、ConfigurableListableBeanFactory是一個更強大的接口,繼承了上述的所有接口,無所不包,稱為四級接口。(這4級接口是BeanFactory的基本接口體系。繼續(xù),下面是繼承關系的2個抽象類和2個實現(xiàn)類:)

5、AbstractBeanFactory作為一個抽象類,實現(xiàn)了三級接口ConfigurableBeanFactory大部分功能。

6、AbstractAutowireCapableBeanFactory同樣是抽象類,繼承自AbstractBeanFactory,并額外實現(xiàn)了二級接口AutowireCapableBeanFactory

7、DefaultListableBeanFactory繼承自AbstractAutowireCapableBeanFactory,實現(xiàn)了最強大的四級接口ConfigurableListableBeanFactory,并實現(xiàn)了一個外來接口BeanDefinitionRegistry,它并非抽象類。

8、最后是最強大的XmlBeanFactory,繼承自DefaultListableBeanFactory,重寫了一些功能,使自己更強大。

總結: BeanFactory的類體系結構看似繁雜混亂,實際上由上而下井井有條,非常容易理解。

再來看一下BeanFactory的源碼:

package org.springframework.beans.factory;
public interface BeanFactory {
    /*
     * 用來引用一個實例,或把它和工廠產(chǎn)生的Bean區(qū)分開,就是說,如果一個FactoryBean的名字為a,那么,&a會得到那個Factory
     */
    String FACTORY_BEAN_PREFIX = "&";
    /*
     * 四個不同形式的getBean方法,獲取實例
     */
    Object getBean(String name) throws BeansException;
    <T> T getBean(String name, Class<T> requiredType) throws BeansException;
    <T> T getBean(Class<T> requiredType) throws BeansException;
    Object getBean(String name, Object... args) throws BeansException;
    boolean containsBean(String name); // 是否存在
    boolean isSingleton(String name) throws NoSuchBeanDefinitionException;// 是否為單實例
    boolean isPrototype(String name) throws NoSuchBeanDefinitionException;// 是否為原型(多實例)
    boolean isTypeMatch(String name, Class<?> targetType)
            throws NoSuchBeanDefinitionException;// 名稱、類型是否匹配
    Class<?> getType(String name) throws NoSuchBeanDefinitionException; // 獲取類型
    String[] getAliases(String name);// 根據(jù)實例的名字獲取實例的別名
}

具體:

1、4個獲取實例的方法。getBean的重載方法。

2、4個判斷的方法。判斷是否存在,是否為單例、原型,名稱類型是否匹配。

3、1個獲取類型的方法、一個獲取別名的方法。根據(jù)名稱獲取類型、根據(jù)名稱獲取別名。一目了然!

總結: 這10個方法,很明顯,這是一個典型的工廠模式的工廠接口。

BeanFactory最常見的實現(xiàn)類為XmlBeanFactory,可以從classpath或文件系統(tǒng)等獲取資源。

File file = new File("fileSystemConfig.xml");
Resource resource = new FileSystemResource(file);
BeanFactory beanFactory = new XmlBeanFactory(resource);
Resource resource = new ClassPathResource("classpath.xml"); 
BeanFactory beanFactory = new XmlBeanFactory(resource);

XmlBeanFactory可以加載xml的配置文件。假設我們有一個Car類:

package spring.ioc.demo1;
public class Car {
    private String brand;
    private String color;
    private int maxSpeed;
    public String getBrand() {
        return brand;
    }
    public void setBrand(String brand) {
        this.brand = brand;
    }
    public String getColor() {
        return color;
    }
    public void setColor(String color) {
        this.color = color;
    }
    public int getMaxSpeed() {
        return maxSpeed;
    }
    public void setMaxSpeed(int maxSpeed) {
        this.maxSpeed = maxSpeed;
    }
    public String toString(){
        return "the car is:"+ getBrand() + ", color is:" +getColor() +", maxspeed is:"+getMaxSpeed();
    }
    public Car() {
    }
    public Car(String brand, String color, int maxSpeed) {
        this.brand = brand;
        this.color = color;
        this.maxSpeed = maxSpeed;
    }
    public void introduce() {
        System.out.println("brand:" + brand + ";color:" + color + ";maxSpeed:"
                + maxSpeed);
    }
}

我們通過在applicationContext.xml中配置:

<bean id="car1" class="spring.ioc.demo1.Car"
        p:brand="spring注入-紅旗001" 
        p:color="spring注入-紫色" 
        p:maxSpeed="520" />

通過XmlBeanFactory實現(xiàn)啟動Spring IoC容器:

public static void main(String[] args) {
 
     ResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
      Resource res = resolver.getResource("classpath:applicationContext.xml");
      BeanFactory factory = new XmlBeanFactory(res);     
    //ApplicationContext factory=new ClassPathXmlApplicationContext("applicationContext.xml"); 
            
       Car car = factory.getBean("car1",Car.class);
       System.out.println("car對象已經(jīng)初始化完成");
       System.out.println(car.getMaxSpeed());
}

1. XmlBeanFactory通過Resource裝載Spring配置信息并啟動IoC容器,然后就可以通過factory.getBean從IoC容器中獲取Bean了。

2. 通過BeanFactory啟動IoC容器時,并不會初始化配置文件中定義的Bean,初始化動作發(fā)生在第一個調用時。

3. 對于單實例(singleton)的Bean來說,BeanFactory會緩存Bean實例,所以第二次使用getBean時直接從IoC容器緩存中獲取Bean。

二、ApplicationContext

如果說BeanFactory是Spring的心臟,那么ApplicationContext就是完整的軀體了,ApplicationContext由BeanFactory派生而來,提供了更多面向實際應用的功能。在BeanFactory中,很多功能需要以編程的方式實現(xiàn),而在ApplicationContext中則可以通過配置實現(xiàn)。

BeanFactorty接口提供了配置框架及基本功能,但是無法支持spring的aop功能和web應用。而ApplicationContext接口作為BeanFactory的派生,因而提供BeanFactory所有的功能。而且ApplicationContext還在功能上做了擴展,相較于BeanFactorty,ApplicationContext還提供了以下的功能: 

(1)MessageSource, 提供國際化的消息訪問  

(2)資源訪問,如URL和文件  

(3)事件傳播特性,即支持aop特性

(4)載入多個(有繼承關系)上下文 ,使得每一個上下文都專注于一個特定的層次,比如應用的web層 

ApplicationContext:是IOC容器另一個重要接口, 它繼承了BeanFactory的基本功能, 同時也繼承了容器的高級功能,如:MessageSource(國際化資源接口)、ResourceLoader(資源加載接口)、ApplicationEventPublisher(應用事件發(fā)布接口)等。

三、二者區(qū)別

  1. BeanFactroy采用的是延遲加載形式來注入Bean的,即只有在使用到某個Bean時(調用getBean()),才對該Bean進行加載實例化,這樣,我們就不能發(fā)現(xiàn)一些存在的Spring的配置問題。而ApplicationContext則相反,它是在容器啟動時,一次性創(chuàng)建了所有的Bean。這樣,在容器啟動時,我們就可以發(fā)現(xiàn)Spring中存在的配置錯誤。 相對于基本的BeanFactory,ApplicationContext 唯一的不足是占用內存空間。當應用程序配置Bean較多時,程序啟動較慢。
  2. BeanFacotry延遲加載,如果Bean的某一個屬性沒有注入,BeanFacotry加載后,直至第一次使用調用getBean方法才會拋出異常;而ApplicationContext則在初始化自身是檢驗,這樣有利于檢查所依賴屬性是否注入;所以通常情況下我們選擇使用 ApplicationContext。 應用上下文則會在上下文啟動后預載入所有的單實例Bean。通過預載入單實例bean ,確保當你需要的時候,你就不用等待,因為它們已經(jīng)創(chuàng)建好了。
  3. BeanFactory和ApplicationContext都支持BeanPostProcessor、BeanFactoryPostProcessor的使用,但兩者之間的區(qū)別是:BeanFactory需要手動注冊,而ApplicationContext則是自動注冊。(Applicationcontext比 beanFactory 加入了一些更好使用的功能。而且 beanFactory 的許多功能需要通過編程實現(xiàn)而 Applicationcontext 可以通過配置實現(xiàn)。比如后處理 bean , Applicationcontext 直接配置在配置文件即可而 beanFactory 這要在代碼中顯示的寫出來才可以被容器識別。 )
  4. beanFactory主要是面對的是 spring 框架的基礎設施,面對 spring 自己。而 Applicationcontex 主要面對的是使用 spring 構建項目的開發(fā)人員。

到此這篇關于Spring中的ApplicationContext與BeanFactory詳解的文章就介紹到這了,更多相關ApplicationContext與BeanFactory內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • 基于Spring概念模型:PathMatcher 路徑匹配器

    基于Spring概念模型:PathMatcher 路徑匹配器

    這篇文章主要介紹了Spring概念模型:PathMatcher 路徑匹配器,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-09-09
  • MybatisPlus自動填充創(chuàng)建(更新)時間問題

    MybatisPlus自動填充創(chuàng)建(更新)時間問題

    在開發(fā)數(shù)據(jù)庫相關應用時,手動設置創(chuàng)建和更新時間會導致代碼冗余,MybatisPlus提供了自動填充功能,通過實現(xiàn)MetaObjectHandler接口并重寫insertFill、updateFill方法,可以自動維護創(chuàng)建時間、更新時間等字段,極大簡化了代碼,這不僅提高了開發(fā)效率,也保證了數(shù)據(jù)的可追溯性
    2024-09-09
  • mybatis查詢結果返回至實體類的示例代碼

    mybatis查詢結果返回至實體類的示例代碼

    這篇文章主要介紹了mybatis查詢結果返回至實體類的示例代碼,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-07-07
  • Java對日期Date類進行加減運算、年份加減月份加減、時間差等等

    Java對日期Date類進行加減運算、年份加減月份加減、時間差等等

    這篇文章主要介紹了Java對日期Date類進行加減運算、年份加減月份加減、時間差等等,在網(wǎng)上查閱資料,加上自己總結的一些關于Date類的工具類
    2017-01-01
  • SpringBoot如何整合SpringDataJPA

    SpringBoot如何整合SpringDataJPA

    這篇文章主要介紹了SpringBoot整合SpringDataJPA代碼實例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-02-02
  • Spring?Cache+Redis緩存數(shù)據(jù)的實現(xiàn)示例

    Spring?Cache+Redis緩存數(shù)據(jù)的實現(xiàn)示例

    本文主要介紹了Spring?Cache+Redis緩存數(shù)據(jù),文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-01-01
  • Java安全編碼:防范Java安全漏洞的最佳實踐

    Java安全編碼:防范Java安全漏洞的最佳實踐

    Java作為一種跨平臺的編程語言,在廣泛應用的同時,也會從時至時出現(xiàn)安全漏洞,這些漏洞可能會對Java應用程序的安全性造成嚴重威脅,因此,必須采取必要的措施,以確保Java應用程序的安全性,以最佳實踐來防范Java安全漏洞,是應對安全威脅的最好方法之一,
    2024-01-01
  • Java使用Sftp和Ftp實現(xiàn)對文件的上傳和下載

    Java使用Sftp和Ftp實現(xiàn)對文件的上傳和下載

    這篇文章主要介紹了Java使用Sftp和Ftp實現(xiàn)對文件的上傳和下載,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-03-03
  • 使用 Spring Boot 實現(xiàn)分頁和排序功能(配置與實踐指南)

    使用 Spring Boot 實現(xiàn)分頁和排序功能(配置與實踐指南)

    使用 Spring Boot 實現(xiàn)分頁和排序依賴 Spring Data JPA 的 Pageable 和 Sort,支持基本分頁、動態(tài)排序和高級查詢,代碼示例展示了從簡單分頁到 REST API 集成的完整流程,性能測試表明小數(shù)據(jù)集查詢高效(5ms),大數(shù)據(jù)量需索引優(yōu)化,感興趣的朋友一起看看吧
    2025-04-04
  • 分布式系統(tǒng)下調用鏈追蹤技術面試題

    分布式系統(tǒng)下調用鏈追蹤技術面試題

    這篇文章主要為大家介紹了分布式系統(tǒng)下調用鏈追蹤技術面試問題合集,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步早日升職加薪
    2022-03-03

最新評論

武乡县| 敦化市| 湖南省| 璧山县| 景宁| 杭锦后旗| 元江| 靖边县| 栾川县| 泸水县| 平塘县| 普定县| 襄汾县| 昆山市| 桃江县| 平原县| 灵武市| 惠来县| 星座| 屯留县| 崇仁县| 和龙市| 南汇区| 盐山县| 永昌县| 永宁县| 锡林浩特市| 夏津县| 宕昌县| 万安县| 威远县| 任丘市| 梓潼县| 封丘县| 仁寿县| 揭西县| 伊通| 犍为县| 新平| 勃利县| 榆林市|