版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
第九章Spring的容器機制演講人2024-XX-XX本章學習目標:理解Spring框架的容器機制掌握BeanFactory的常用接口編程方法掌握ApplicationContext的常用接口編程方法Spring框架最重要的核心功能之一,就是它提供了容器機制。從前面內(nèi)容可以得知,Spring框架內(nèi)有很多不同的功能組件,這些功能組件都有各自獨立的jar包。有了容器機制后,不同的功能組件在Spring框架內(nèi)都以Bean的方式進行管理,不同的Bean對應不同的功能組件。Spring框架底層的容器負責創(chuàng)建這些Bean,并管理它們的配置和生命周期。1容器機制的簡介1.1容器機制的原理一般來說,軟件系統(tǒng)的主要編程思想之一就是OOP面向?qū)ο缶幊獭T趥鹘y(tǒng)的OOP中,每一個類都有對應的構造函數(shù)。如果要用到某個類的對象,就需要調(diào)用它的構造函數(shù),來new一個對象。同時,在使用的過程中,還需要關注此對象聲明的作用域,它是某個函數(shù)內(nèi)的局部變量,還是更加廣泛的全局變量。最后,開發(fā)者在使用過程中還需要關注它的生命周期,如果對象被釋放,內(nèi)存回收,那就無法再使用該對象了。在普通情況下,這些對象的創(chuàng)建、配置、和生命周期的管理的相關代碼和業(yè)務邏輯代碼都耦合在一起。當項目體量增大,對象的數(shù)量較多、種類繁雜的時候,這些代碼就給開發(fā)人員帶來一定的麻煩。既影響了業(yè)務層邏輯代碼的閱讀和維護,又容易在管理不同對象的時候混肴或引入bug,從而導致程序出錯。1容器機制的簡介1.1容器機制的原理為了解決這個問題,Spring框架的核心功能之一就是提供了容器機制。一方面Spring框架本身就提供了很多的功能,這些功能的配置開發(fā)需要通過一個個獨立的對象來實現(xiàn),這些對象的管理、創(chuàng)建等問題就可以交給容器機制,從而將開發(fā)者解放出來,讓他們可以更專注的開發(fā)業(yè)務層的邏輯。另外一方面,開發(fā)者也可以利用容器機制來管理自定義的Java類對象,借用容器機制的優(yōu)勢,將對象的創(chuàng)建和生命周期管理代碼從業(yè)務層剝離,可以有效提升項目的可維護性。1容器機制的簡介1.2容器機制的常用接口容器機制需要通過接口來實現(xiàn),常用的核心接口有兩個,BeanFactory和ApplicationContext。其中BeanFactory顧名思義,就是Bean的工廠,也就是對象的創(chuàng)建和管理的容器本身,這是Spring框架最基本的接口。ApplicationContext是BeanFactory的子接口,也可以稱之為Spring上下文。在某些特定的使用場景下,BeanFactory和ApplicationContext有所區(qū)別,但實際上它們都可以看作是Spring框架的容器機制的體現(xiàn),開發(fā)者需要靈活使用這兩個接口,來完成Bean的創(chuàng)建、配置和管理等相關操作。下面是BeanFactory接口的常用方法列表。表9-1BeanFactory接口的方法1容器機制的簡介1.2容器機制的常用接口如表所示,主要都是對Bean對象進行管理、獲取等操作。其中對Bean的屬性設置(也叫依賴注入)、作用域、生命周期管理等操作,后續(xù)章節(jié)還會再詳細講解,本章主要關注容器的創(chuàng)建和容器中Bean的獲取和基本使用。ApplicationContext是BeanFactory的子類,因此上表中的方法,ApplicationContext對象也都可以直接繼承使用。對比BeanFactory,ApplicationContext對象的功能更加強大。它為接口提供了國際化訪問功能,提供資源文件系統(tǒng)的訪問支持,可同時加載多個配置文件,引入事件機制,讓容器在上下文中提供對應用事件的支持,以聲明式的方式啟動并創(chuàng)建Spring容器。此外,ApplicationContext接口可以為單例的Bean實行初始化,并對成員變量執(zhí)行setter方法完成屬性注入,提升了程序獲取Bean實例的性能等。1容器機制的簡介1.2容器機制的常用接口對于大部分使用Spring框架的Java應用而言,使用它來作為Spring框架的容器都是更加方便的選擇。因為ApplicationContext本身就包含了BeanFactory的全部接口,在某些地方還有功能增強,本教材也推薦讀者優(yōu)先使用ApplicationContext。一般來說,可以在程序啟動時,通過ApplicationContext的接口來載入配置文件,從而啟動Spring框架的容器和容器中的Bean。在實際開發(fā)過程中,可以根據(jù)具體的應用場景,來選擇不同的創(chuàng)建ApplicationContext對象的方法。如下表所示。表9-2ApplicationContext接口的實現(xiàn)類2容器機制的具體使用創(chuàng)建工程打開Eclipse,選擇新建項目中的DynamicWebProject也就是動態(tài)Web項目。相關選項和配置使用默認的,給項目起一個名稱,最后點擊Finish完成即完成項目的創(chuàng)建。2容器機制的具體使用項目的準備工作找到項目的lib文件夾,路徑為項目根目錄下src/main/webapp/WEB-INF/lib,從之前下載Spring框架的文件夾里找到項目所需的jar包,復制到項目lib文件夾下,完成jar包的導入。如下圖所示。圖9-1項目所需的jar包示意圖2容器機制的具體使用編寫Java類的代碼在項目里新建一個Java包com.pojo,創(chuàng)建自定義Bean的Java類com.pojo.Student.java,代碼如下。Student.java01packagecom.pojo;02publicclassStudent{03privateStringname;04publicStudent(){05super();06//TODOAuto-generatedconstructorstub2容器機制的具體使用編寫Java類的代碼07System.out.println("-----POJO對象初始化-----");08}09publicStringgetName(){10returnname;2容器機制的具體使用}12publicvoidsetName(Stringname){13=name;14System.out.println("-------POJO對象設置參數(shù)-------");15}16@Override17publicStringtoString(){18return"Student[name="+name+"]";19}2容器機制的具體使用}20}Java類里有一個成員變量為String類型的name,主要用于后續(xù)的演示。類里需要編寫構造函數(shù)、getter和setter函數(shù)、打印函數(shù)等,同時可以根據(jù)需要在不同函數(shù)里加入對應的打印信息,這樣程序運行到對應地方就可以打印不同信息,便于后續(xù)測試和演示。2容器機制的具體使用編寫配置文件的代碼在項目代碼的根目錄也就是src/main/java下,創(chuàng)建配置文件beans.xml。在配置文件中,主要是完成相關的命名空間設置、xml的schema配置,以及項目中需要用到的JavaBean的定義和配置。具體代碼如下所示。beans.xml01<?xmlversion="1.0"encoding="UTF-8"?>02<beansxmlns="/schema/beans"03xmlns:xsi="/2001/XMLSchema-instance"2容器機制的具體使用編寫配置文件的代碼04xsi:schemaLocation="/schema/beans05/schema/beans/spring-beans.xsd">06<beanid="stu01"class="com.pojo.Student">07<propertyname="name"value="Chris"/>08</bean>2容器機制的具體使用編寫配置文件的代碼第06~13行代碼是使用配置文件定義的兩個Bean對象,均是com.pojo.Student類的對象。區(qū)別在于成員變量或者說屬性的配置方式不同,第一個對象是直接使用value屬性進行配置,第二個對象使用value子元素進行配置。這里兩種方式都可以使用。2容器機制的具體使用編寫項目的測試代碼在根目錄下創(chuàng)建Java包com.test,新建測試文檔TestMain.java,內(nèi)部代碼如下所示。TestMain.java01packagecom.test;02importorg.springframework.beans.factory.support.DefaultListableBeanFactory;03importorg.springframework.beans.factory.xml.XmlBeanDefinitionReader;04importorg.springframework.context.ApplicationContext;2容器機制的具體使用編寫項目的測試代碼05importorg.springframework.context.support.ClassPathXmlApplicationContext;06importorg.springframework.core.io.ClassPathResource;07importcom.pojo.Student;08publicclassTestMain{09publicstaticvoidmain(String[]args){10//TODOAuto-generatedmethodstub2容器機制的具體使用//BeanFactory的初始化17System.out.println(student.toString());18System.out.println("\n");19//ApplicationContext的初始化(BeanFactory的子接口,應用更廣泛)20ApplicationContextcontext=newClassPathXmlApplicationContext("beans.xml");21System.out.println("-----ApplicationContext初始化-----");2容器機制的具體使用//BeanFactory的初始化22Studentstudent2=context.getBean("stu02",Student.class);23System.out.println(student2.toString());24}25}為了方便讀者對BeanFactory和ApplicationContext進行區(qū)分,這里對于同一個配置文件beans.xml,采用了兩種不同的初始化方式和獲取Bean對象的方式。2容器機制的具體使用//BeanFactory的初始化第11~17行代碼,是使用BeanFactory的接口來讀取配置文件,并完成Spring框架的初始化,然后通過beanFactory的getBean方法獲取Bean對象,并打印信息。第19~23行代碼,是使用ApplicationContext的接口來讀取配置文件,并完成Spring框架的初始化,然后通過context的getBean方法獲取Bean對象,并打印信息。2容器機制的具體使用項目測試結果項目代碼編寫完成后,在TestMain.java文件中點擊右鍵,點擊運行RunAs,選擇JavaApplication。項目運行結果如下圖所示。圖9-2Spring框架的簡單應用運行示意圖2容器機制的具體使用項目測試結果從測試結果可以得出以下結論:一方面,BeanFactory和ApplicationContext都可以順利完成Spring框架的容器初始化和Bean對象的創(chuàng)建、配置工作,也可以在業(yè)務層方便的獲取Bean對象。另外一方面,可以看到BeanFactory中是容器先創(chuàng)建和初始化,在調(diào)用getBean的時候再完成Bean對象的創(chuàng)建和配置;而ApplicationContext是在容器初始化的同時,就先完成了Bean對象的創(chuàng)建和配置。從這里就可以看出ApplicationContext的設計思路的不同,它將容器和容器內(nèi)所有對象的創(chuàng)建和初始化放到一起,這樣在后續(xù)getBean獲取對象的時候,可以提升執(zhí)行效率。對比TestMain.java里的相關代碼,也可以發(fā)現(xiàn)ApplicationContext的代碼更加簡介。因此,對于開發(fā)者來說,直接使用ApplicationContext來進行容器的相關開發(fā)使用,往往是更優(yōu)的選擇。2容器機制的具體使用2.2Spring容器的事件機制的使用案例在Spring框架的容器中,除了創(chuàng)建和管理Bean對象外,還有一些其他的功能,比如說事件機制。ApplicationContext的事件機制是通過觀察者設計模式來實現(xiàn)的,通過ApplicationEvent類和ApplicationListener接口,可以實現(xiàn)ApplicationContext的事件處理。具體的方式就是,如果容器中有一個ApplicationListenterBean對象,每當ApplicationContext容器發(fā)布ApplicationEvent事件時,ApplicationListenterBean將被觸發(fā)。實際上,Spring框架的事件機制與所有的事件機制的原理都基本相似,它們都需要由事件源、事件和事件監(jiān)聽器來組成。在Spring容器的事件機制中,事件源就是ApplicationContext容器本身,事件由Java程序顯式調(diào)用或觸發(fā)。下面通過一個具體案例演示Spring框架容器的事件機制的使用2容器機制的具體使用編寫event事件類的代碼在com.pojo包下,新建一個事件類TestEvent.java,這個類需要繼承自ApplicationEvent.java,在創(chuàng)建的時候可以通過eclipse選擇需要繼承的類。圖9-3選擇ApplicationEvent.java作為父類2容器機制的具體使用編寫event事件類的代碼靈活使用IDE的功能,可以有效輔助開發(fā)者提升開發(fā)效率。當然不使用輔助工具,直接新建并編寫代碼也可以,具體代碼如例2-1所示。TestEvent.java01packagecom.pojo;02importorg.springframework.context.ApplicationEvent;03publicclassTestEventextendsApplicationEvent{04privateStringmessage;05publicTestEvent(Stringarg0){2容器機制的具體使用編寫event事件類的代碼06super(arg0);07//TODOAuto-generatedconstructorstub08message=arg0;09}10@Override11publicStringtoString(){12return"TestEvent[message="+message+"]";13}2容器機制的具體使用編寫event事件類的代碼14}第04行代碼,創(chuàng)建了一個String類型的成員變量,用于事件傳遞消息的演示。第08行代碼,在構造事件對象的時候,傳入String參數(shù),并將參數(shù)賦值給message成員變量。2容器機制的具體使用編寫監(jiān)聽器的代碼新建一個com.event包,然后新建TestNotifier.java。監(jiān)聽類需要繼承ApplicationListener接口,這一步也可以利用eclipse的輔助功能完成。圖9-4添加ApplicationListener接口添加接口后,就會自動在類里添加需要實現(xiàn)的接口函數(shù)。具體代碼如下。applicationContext.xml2容器機制的具體使用編寫監(jiān)聽器的代碼01packagecom.event;02importorg.springframework.context.ApplicationListener;03importcom.pojo.TestEvent;04publicclassTestNotifierimplementsApplicationListener<TestEvent>{05@Override06publicvoidonApplicationEvent(TestEventevent){07//TODOAuto-generatedmethodstub2容器機制的具體使用編寫監(jiān)聽器的代碼08System.out.println("====事件接收,處理開始====");09if(event!=null){10System.out.println(event.toString());11}else{12System.out.println("TestNotifieronApplicationEvent():event==null!");2容器機制的具體使用}14System.out.println("====事件接收,處理結束====");15}16}當接收到事件后,會觸發(fā)onApplicationEvent(TestEventevent)函數(shù)的執(zhí)行。這里主要就是輸出相關的代碼,用于演示事件的執(zhí)行。也可以對event事件做判定,如果不為空則打印出message消息。2容器機制的具體使用編寫配置文件的代碼03xmlns:xsi="/2001/XMLSchema-instance"0501<?xmlversion="1.0"encoding="UTF-8"?>03為了和前一個案例做區(qū)分,這里新建一個配置文件appliacionContext.xml。0102<beansxmlns="/schema/beans"04applicationContext.xml022容器機制的具體使用編寫配置文件的代碼04xsi:schemaLocation="/schema/beans05/schema/beans/spring-beans.xsd">06<beanclass="com.event.TestNotifier"/>07</beans>第01~05行代碼是xml文件聲明、命名空間和xmlschema的配置。第06行代碼聲明了一個com.event.TestNotifier的Bean對象,在這里聲明以為著對象交給Spring的容器機制來創(chuàng)建和管理。2容器機制的具體使用編寫項目的測試代碼在com.test測試的包下,新建另外一個測試文件TestMain2.java。代碼如下所示。TestMain2.java01packagecom.test;02importorg.springframework.context.ApplicationContext;03importorg.springframework.context.support.ClassPathXmlApplicationContext;04importcom.pojo.TestEvent;05publicclassTestMain2{2容器機制的具體使用編寫項目的測試代碼06publicstaticvoidmain(String[]args){07//TODOAuto-generatedmethodstub2容器機制的具體使用//ApplicationContext的事件09ApplicationContextcontext=newClassPathXmlApplicationContext("applicationContext.xml");10TestEventtestEvent=newTestEvent("事件攜帶的消息示例");11System.out.println("===準備廣播事件===");12context.publishE
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2026年鄉(xiāng)村振興示范村創(chuàng)建路徑
- 2026湖南懷化國際陸港經(jīng)濟開發(fā)區(qū)內(nèi)國有企業(yè)招聘4人備考題庫及答案詳解(考點梳理)
- 2026福建廈門市集美區(qū)樂海幼兒園頂崗教職工招聘2人備考題庫及參考答案詳解一套
- 2026年綠色金融產(chǎn)品開發(fā)實戰(zhàn)課程
- 鐵路客運食品安全與供應管理手冊
- 2026年氣候風險管理框架建設課
- 2025 小學一年級道德與法治上冊我的國家小卡片課件
- 超生刀課件教學課件
- 關于扶持高校畢業(yè)生創(chuàng)業(yè)的意見
- 職業(yè)健康監(jiān)護中的標準化培訓教材開發(fā)
- DB11∕T 510-2024 公共建筑節(jié)能工程施工質(zhì)量驗收規(guī)程
- 專題:完形填空 七年級英語下冊期末復習考點培優(yōu)專項魯教版(五四學制)(含答案解析)
- 英語滬教版5年級下冊
- T/CPFIA 0005-2022含聚合態(tài)磷復合肥料
- GB/T 43590.507-2025激光顯示器件第5-7部分:激光掃描顯示在散斑影響下的圖像質(zhì)量測試方法
- QGDW12505-2025電化學儲能電站安全風險評估規(guī)范
- 顧客特殊要求培訓課件
- 幼兒園助教培訓:AI賦能教師教學能力提升
- 經(jīng)銷商會議總結模版
- 兩癌預防知識講座
- 2024年山東濟南中考滿分作文《為了這份繁華》
評論
0/150
提交評論