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

Spring系列中的beanFactory與ApplicationContext

 更新時間:2022年09月16日 16:00:17   作者:是溫度呀  
這篇文章主要介紹了Spring系列中的beanFactory與ApplicationContext,文章圍繞主題展開詳細的內(nèi)容介紹,具有一定的參考價值,需要的小伙伴可以參考一下

一、BeanFactory

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

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

BeanFactory 是初始化 Bean 和調(diào)用它們生命周期方法的“吃苦耐勞者”。注意,BeanFactory 只能管理單例(Singleton)Bean 的生命周期。它不能管理原型(prototype,非單例)Bean 的生命周期。這是因為原型 Bean 實例被創(chuàng)建之后便被傳給了客戶端,容器失去了對它們的引用。

BeanFactory有著龐大的繼承、實現(xiàn)體系,有眾多的子接口、實現(xiàn)類。

來看一下BeanFactory的基本類體系結(jié)構(gòu)(接口為主):

這是我畫的BeanFactory基本的類體系結(jié)構(gòu),這里沒有包括強大的ApplicationContext體系。

具體:

  • 1、BeanFactory作為一個主接口不繼承任何接口,暫且稱為一級接口
  • 2、有3個子接口繼承了它,進行功能上的增強。這3個子接口稱為二級接口
  • 3、ConfigurableBeanFactory可以被稱為三級接口,對二級接口HierarchicalBeanFactory進行了再次增強,它還繼承了另一個外來的接口SingletonBeanRegistry
  • 4、ConfigurableListableBeanFactory是一個更強大的接口,繼承了上述的所有接口,無所不包,稱為四級接口。
  •  ?。ㄟ@4級接口是BeanFactory的基本接口體系。繼續(xù),下面是繼承關(guān)系的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,重寫了一些功能,使自己更強大。

總結(jié):

BeanFactory的類體系結(jié)構(gòu)看似繁雜混亂,實際上由上而下井井有條,非常容易理解。

再來看一下BeanFactory的源碼:

<pre>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ù)實例的名字獲取實例的別名
}</pre>

具體:

  • 1、4個獲取實例的方法。getBean的重載方法。
  • 2、4個判斷的方法。判斷是否存在,是否為單例、原型,名稱類型是否匹配。
  • 3、1個獲取類型的方法、一個獲取別名的方法。根據(jù)名稱獲取類型、根據(jù)名稱獲取別名。一目了然!

總結(jié):

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

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

<pre>(1)File file = new File("fileSystemConfig.xml");
Resource resource = new FileSystemResource(file);
BeanFactory beanFactory = new XmlBeanFactory(resource);</pre>
<pre>(2)
Resource resource = new ClassPathResource("classpath.xml");
BeanFactory beanFactory = new XmlBeanFactory(resource);</pre>

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

<pre>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);
}

}</pre>

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

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

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

<pre>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());
}</pre>
  • 1. XmlBeanFactory通過Resource裝載Spring配置信息冰啟動IoC容器,然后就可以通過factory.getBean從IoC容器中獲取Bean了。
  • 2. 通過BeanFactory啟動IoC容器時,并不會初始化配置文件中定義的Bean,初始化動作發(fā)生在第一個調(diào)用時。
  • 3. 對于單實例(singleton)的Bean來說,BeanFactory會緩存Bean實例,所以第二次使用getBean時直接從IoC容器緩存中獲取Bean。

二、ApplicationContext

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

BeanFactorty接口提供了配置框架及基本功能,但是無法支持spring的aop功能和web應(yīng)用。而ApplicationContext接口作為BeanFactory的派生,因而提供BeanFactory所有的功能。而且

ApplicationContext還在功能上做了擴展,相較于BeanFactorty,ApplicationContext還提供了以下的功能:

  • (1)MessageSource, 提供國際化的消息訪問
  • (2)資源訪問,如URL和文件
  • (3)事件傳播特性,即支持aop特性
  • (4)載入多個(有繼承關(guān)系)上下文 ,使得每一個上下文都專注于一個特定的層次,比如應(yīng)用的web層

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

三、二者區(qū)別

1.BeanFactroy采用的是延遲加載形式來注入Bean的,即只有在使用到某個Bean時(調(diào)用getBean()),才對該Bean進行加載實例化,這樣,我們就不能發(fā)現(xiàn)一些存在的Spring的配置問題。而ApplicationContext則相反,它是在容器啟動時,一次性創(chuàng)建了所有的Bean。這樣,在容器啟動時,我們就可以發(fā)現(xiàn)Spring中存在的配置錯誤。 相對于基本的BeanFactory,ApplicationContext 唯一的不足是占用內(nèi)存空間。當應(yīng)用程序配置Bean較多時,程序啟動較慢。

BeanFacotry延遲加載,如果Bean的某一個屬性沒有注入,BeanFacotry加載后,直至第一次使用調(diào)用getBean方法才會拋出異常;而ApplicationContext則在初始化自身是檢驗,這樣有利于檢查所依賴屬性是否注入;所以通常情況下我們選擇使用 ApplicationContext。
應(yīng)用上下文則會在上下文啟動后預(yù)載入所有的單實例Bean。通過預(yù)載入單實例bean ,確保當你需要的時候,你就不用等待,因為它們已經(jīng)創(chuàng)建好了。

2.BeanFactory和ApplicationContext都支持BeanPostProcessor、BeanFactoryPostProcessor的使用,但兩者之間的區(qū)別是:BeanFactory需要手動注冊,而ApplicationContext則是自動注冊。(Applicationcontext比 beanFactory 加入了一些更好使用的功能。而且 beanFactory 的許多功能需要通過編程實現(xiàn)而 Applicationcontext 可以通過配置實現(xiàn)。比如后處理 bean , Applicationcontext 直接配置在配置文件即可而 beanFactory 這要在代碼中顯示的寫出來才可以被容器識別。 )

3.beanFactory主要是面對與 spring 框架的基礎(chǔ)設(shè)施,面對 spring 自己。而 Applicationcontex 主要面對與 spring 使用的開發(fā)者?;径紩褂?Applicationcontex 并非 beanFactory 。

四、總結(jié)

作用:

  • 1. BeanFactory負責(zé)讀取bean配置文檔,管理bean的加載,實例化,維護bean之間的依賴關(guān)系,負責(zé)bean的聲明周期。
  • 2. ApplicationContext除了提供上述BeanFactory所能提供的功能之外,還提供了更完整的框架功能:
    • a. 國際化支持
    • b. 資源訪問:Resource rs = ctx. getResource(“classpath:config.properties”), “file:c:/config.properties”
    • c. 事件傳遞:通過實現(xiàn)ApplicationContextAware接口
  • 3. 常用的獲取ApplicationContext

FileSystemXmlApplicationContext:從文件系統(tǒng)或者url指定的xml配置文件創(chuàng)建,參數(shù)為配置文件名或文件名數(shù)組,有相對路徑與絕對路徑。

<pre>ApplicationContext factory=new FileSystemXmlApplicationContext("src/applicationContext.xml");
ApplicationContext factory=new FileSystemXmlApplicationContext("E:/Workspaces/MyEclipse 8.5/Hello/src/applicationContext.xml");</pre>

ClassPathXmlApplicationContext:從classpath的xml配置文件創(chuàng)建,可以從jar包中讀取配置文件。

ClassPathXmlApplicationContext 編譯路徑總有三種方式:

<pre>ApplicationContext factory = new ClassPathXmlApplicationContext("classpath:applicationContext.xml");
ApplicationContext factory = new ClassPathXmlApplicationContext("applicationContext.xml");
ApplicationContext factory = new ClassPathXmlApplicationContext("file:E:/Workspaces/MyEclipse 8.5/Hello/src/applicationContext.xml");</pre>

XmlWebApplicationContext:從web應(yīng)用的根目錄讀取配置文件,需要先在web.xml中配置,可以配置監(jiān)聽器或者servlet來實現(xiàn)

<pre><listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener></pre>

<pre><servlet>
<servlet-name>context</servlet-name>
<servlet-class>org.springframework.web.context.ContextLoaderServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet></pre>

這兩種方式都默認配置文件為web-inf/applicationContext.xml,也可使用context-param指定配置文件

<pre><context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/myApplicationContext.xml</param-value>
</context-param></pre>

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

相關(guān)文章

  • 雙token實現(xiàn)token超時策略示例

    雙token實現(xiàn)token超時策略示例

    用于restful的app應(yīng)用無狀態(tài)無sesion登錄示例,需要的朋友可以參考下
    2014-02-02
  • Spring Boot實現(xiàn)模塊化的幾種方法

    Spring Boot實現(xiàn)模塊化的幾種方法

    模塊可以是業(yè)務(wù)模塊,為應(yīng)用程序提供一些業(yè)務(wù)服務(wù),或者為幾個其他模塊或整個應(yīng)用程序提供跨領(lǐng)域關(guān)注的技術(shù)模塊。這篇文章主要介紹了Spring Boot實現(xiàn)模塊化,需要的朋友可以參考下
    2018-07-07
  • 帶你一文深入認識Java?String類

    帶你一文深入認識Java?String類

    這篇文章主要介紹了帶你一文深入認識Java?String類,String 類在Java中是很常用的類,很重要的類,在后續(xù)的學(xué)習(xí)中經(jīng)常會用到,是后續(xù)學(xué)習(xí)的基礎(chǔ), 文章圍繞主題展開更多詳細內(nèi)容,需要的小伙伴可以參考一下,希望對你的學(xué)習(xí)有所幫助
    2022-06-06
  • spring-boot-thin-launcher插件分離jar包的依賴和配置方式

    spring-boot-thin-launcher插件分離jar包的依賴和配置方式

    這篇文章主要介紹了spring-boot-thin-launcher插件分離jar包的依賴和配置方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-09-09
  • Java聊天室之實現(xiàn)運行服務(wù)器與等待客戶端連接

    Java聊天室之實現(xiàn)運行服務(wù)器與等待客戶端連接

    這篇文章主要為大家詳細介紹了Java簡易聊天室之實現(xiàn)運行服務(wù)器程序與等待客戶端程序連接功能,文中的示例代碼講解詳細,需要的可以了解一下
    2022-10-10
  • SpringCloud 限流、熔斷、降級的區(qū)別及實現(xiàn)

    SpringCloud 限流、熔斷、降級的區(qū)別及實現(xiàn)

    本文主要介紹了SpringCloud 限流、熔斷、降級的區(qū)別及實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2025-03-03
  • Hibernate+JDBC實現(xiàn)批量插入、更新及刪除的方法詳解

    Hibernate+JDBC實現(xiàn)批量插入、更新及刪除的方法詳解

    這篇文章主要介紹了Hibernate+JDBC實現(xiàn)批量插入、更新及刪除的方法,結(jié)合實例形式較為詳細的分析了Hibernate與JDBC針對數(shù)據(jù)庫的批量操作相關(guān)實現(xiàn)技巧,需要的朋友可以參考下
    2017-11-11
  • Spring源碼解析 Bean屬性填充

    Spring源碼解析 Bean屬性填充

    這篇文章主要介紹了Spring源碼解析 Bean屬性填充,文章圍繞主題展開想詳細的內(nèi)容詳情,具有一定的參考價值,需要的小伙伴可以參考一下
    2022-07-07
  • Java數(shù)組與字符串深入探索使用方法

    Java數(shù)組與字符串深入探索使用方法

    在今天的文章中,我將為你詳細講述Java學(xué)習(xí)中重要的一節(jié) [ 數(shù)組與字符串 ] ,帶你深入了解Java語言中數(shù)組的聲明、創(chuàng)建和初始化方法,字符串的定義以及常用到的操作方法
    2022-07-07
  • JDK1.6“新“特性Instrumentation之JavaAgent(推薦)

    JDK1.6“新“特性Instrumentation之JavaAgent(推薦)

    這篇文章主要介紹了JDK1.6“新“特性Instrumentation之JavaAgent,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-08-08

最新評論

壶关县| 定日县| 茂名市| 山东| 剑河县| 宜城市| 泸溪县| 峨眉山市| 阜新市| 江源县| 交口县| 玛多县| 安岳县| 正阳县| 建昌县| 合作市| 城口县| 宁津县| 图木舒克市| 横山县| 万山特区| 沙坪坝区| 成都市| 晋中市| 太康县| 黑龙江省| 阿尔山市| 枝江市| 清原| 揭西县| 泰顺县| 沅陵县| 通道| 龙井市| 安阳市| 得荣县| 孟村| 太仆寺旗| 当涂县| 绥中县| 黑龙江省|