<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
BeanFactory 是 Spring 的“心臟”。它就是 Spring IoC 容器的真面目。Spring 使用 BeanFactory 來範例化、設定和管理 Bean。
BeanFactory:是IOC容器的核心介面, 它定義了IOC的基本功能,我們看到它主要定義了getBean方法。getBean方法是IOC容器獲取bean物件和引發依賴注入的起點。方法的功能是返回特定的名稱的Bean。
BeanFactory 是初始化 Bean 和呼叫它們生命週期方法的“吃苦耐勞者”。注意,BeanFactory 只能管理單例(Singleton)Bean 的生命週期。它不能管理原型(prototype,非單例)Bean 的生命週期。這是因為原型 Bean 範例被建立之後便被傳給了使用者端,容器失去了對它們的參照。
BeanFactory有著龐大的繼承、實現體系,有眾多的子介面、實現類。
來看一下BeanFactory的基本類體系結構(介面為主):
這是我畫的BeanFactory基本的類體系結構,這裡沒有包括強大的ApplicationContext體系。
具體:
總結:
BeanFactory的類體系結構看似繁雜混亂,實際上由上而下井井有條,非常容易理解。
再來看一下BeanFactory的原始碼:
<pre>package org.springframework.beans.factory; public interface BeanFactory { /** * 用來參照一個範例,或把它和工廠產生的Bean區分開,就是說,如果一個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);// 根據範例的名字獲取範例的別名 }</pre>
具體:
總結:
這10個方法,很明顯,這是一個典型的工廠模式的工廠介面。
BeanFactory最常見的實現類為XmlBeanFactory,可以從classpath或檔案系統等獲取資源。
<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的組態檔。假設我們有一個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實現啟動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物件已經初始化完成"); System.out.println(car.getMaxSpeed()); }</pre>
如果說BeanFactory是Spring的心臟,那麼ApplicationContext就是完整的軀體了,ApplicationContext由BeanFactory派生而來,提供了更多面向實際應用的功能。在BeanFactory中,很多功能需要以程式設計的方式實現,而在ApplicationContext中則可以通過設定實現。
BeanFactorty介面提供了設定框架及基本功能,但是無法支援spring的aop功能和web應用。而ApplicationContext介面作為BeanFactory的派生,因而提供BeanFactory所有的功能。而且
ApplicationContext還在功能上做了擴充套件,相較於BeanFactorty,ApplicationContext還提供了以下的功能:
ApplicationContext:是IOC容器另一個重要介面, 它繼承了BeanFactory的基本功能, 同時也繼承了容器的高階功能,如:MessageSource(國際化資源介面)、ResourceLoader(資源載入介面)、ApplicationEventPublisher(應用事件釋出介面)等。
1.BeanFactroy採用的是延遲載入形式來注入Bean的,即只有在使用到某個Bean時(呼叫getBean()),才對該Bean進行載入範例化,這樣,我們就不能發現一些存在的Spring的設定問題。而ApplicationContext則相反,它是在容器啟動時,一次性建立了所有的Bean。這樣,在容器啟動時,我們就可以發現Spring中存在的設定錯誤。 相對於基本的BeanFactory,ApplicationContext 唯一的不足是佔用記憶體空間。當應用程式設定Bean較多時,程式啟動較慢。
BeanFacotry延遲載入,如果Bean的某一個屬性沒有注入,BeanFacotry載入後,直至第一次使用呼叫getBean方法才會丟擲異常;而ApplicationContext則在初始化自身是檢驗,這樣有利於檢查所依賴屬性是否注入;所以通常情況下我們選擇使用 ApplicationContext。
應用上下文則會在上下文啟動後預載入所有的單範例Bean。通過預載入單範例bean ,確保當你需要的時候,你就不用等待,因為它們已經建立好了。
2.BeanFactory和ApplicationContext都支援BeanPostProcessor、BeanFactoryPostProcessor的使用,但兩者之間的區別是:BeanFactory需要手動註冊,而ApplicationContext則是自動註冊。(Applicationcontext比 beanFactory 加入了一些更好使用的功能。而且 beanFactory 的許多功能需要通過程式設計實現而 Applicationcontext 可以通過設定實現。比如後處理 bean , Applicationcontext 直接設定在組態檔即可而 beanFactory 這要在程式碼中顯示的寫出來才可以被容器識別。 )
3.beanFactory主要是面對與 spring 框架的基礎設施,面對 spring 自己。而 Applicationcontex 主要面對與 spring 使用的開發者。基本都會使用 Applicationcontex 並非 beanFactory 。
作用:
FileSystemXmlApplicationContext:從檔案系統或者url指定的xml組態檔建立,引數為組態檔名或檔名陣列,有相對路徑與絕對路徑。
<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組態檔建立,可以從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應用的根目錄讀取組態檔,需要先在web.xml中設定,可以設定監聽器或者servlet來實現
<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>
到此這篇關於Spring系列中的beanFactory與ApplicationContext的文章就介紹到這了,更多相關Spring beanFactory與ApplicationContext內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45