《SSM框架技術開發(fā)教程》課件 9 Spring的容器機制、10 Spring的依賴注入_第1頁
《SSM框架技術開發(fā)教程》課件 9 Spring的容器機制、10 Spring的依賴注入_第2頁
《SSM框架技術開發(fā)教程》課件 9 Spring的容器機制、10 Spring的依賴注入_第3頁
《SSM框架技術開發(fā)教程》課件 9 Spring的容器機制、10 Spring的依賴注入_第4頁
《SSM框架技術開發(fā)教程》課件 9 Spring的容器機制、10 Spring的依賴注入_第5頁
已閱讀5頁,還剩75頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內(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面向對象編程。在傳統(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.publishEvent(testEvent);13}14}2容器機制的具體使用//ApplicationContext的事件第09行代碼,通過讀入配置文件,來啟動Spring框架的容器。在Spring框架中,容器可以通過上下文對象ApplicationContext來獲取,構造函數(shù)ClassPathXmlApplicationContext需要傳入配置文件的路徑和文件名。第10行代碼,創(chuàng)建一個TestEvent對象。構造函數(shù)里的String變量,會通過參數(shù)設置給對象的message成員變量,在接收到事件后,可以打印出來。第12行代碼,通過ApplicationContext的publishEvent方法,顯式的廣播事件,從而觸發(fā)事件監(jiān)聽器的相關代碼。2容器機制的具體使用項目測試結果項目代碼編寫完成后,在TestMain2.java文件中點擊右鍵,點擊運行RunAs,選擇JavaApplication。項目運行結果如下圖所示。圖9-5Spring容器的事件機制示意圖可以看到,調(diào)用publishEvent方法廣播事件后,TestNotifier類中的onApplicationEvent方法被觸發(fā)。依次打印輸出開始接受事件、事件本身的String信息和事件接受結束等預設的信息,程序正常運行。3本章小結本章主要介紹了Spring框架的容器機制的原理,講解了容器機制里最重要的兩個接口的使用方法,BeanFactory和ApplicationContext的區(qū)別,最后介紹Spring容器的事件機制的使用等相關知識。通過本章的學習,讀者可以理解進一步理解Spring框架的優(yōu)勢,掌握容器機制的相關知識和編程方法,理解BeanFactory和ApplicationContext兩者在編程上的區(qū)別,最后掌握Spring容器中事件機制的編程方法。4習題1.Spring框架最重要的核心功能之一,就是它提供了()A.Java運行環(huán)境B.OOP面向對象編程C.事務管理D.容器機制2.Spring框架的容器機制主要有兩個接口,分別是BeanFactory和_________________________。3.請簡述Spring框架的容器機制的概念和使用方法。謝謝第十章Spring的依賴注入演講人2024-XX-XX本章學習目標:理解依賴注入的概念掌握容器機制和依賴注入的關系掌握屬性注入和構造器注入的編程方法在編寫軟件系統(tǒng)的過程中,應用最多最廣泛的基本編程思路是OOP面向對象編程。當軟件系統(tǒng)的體量增大時,不同的類或對象就存在不同的關系。例如繼承關系,就是一個類是另外一個類的子類,子類可以繼承父類的成員變量和成員函數(shù),并可以加入新的成員變量和成員函數(shù)。有時涉及到對象A需要調(diào)用對象B的情形,在Spring框架中這種情形稱為依賴關系,即對象A依賴對象B。接下來本章講解的依賴注入,就是此類應用場景下Spring框架所提供的解決方案。1依賴注入的理論知識1.1依賴注入的簡介結合前面的知識內(nèi)容,Spring框架有兩個核心功能:第一就是容器機制,在Spring框架中可以把不同的對象交給Spring容器進行創(chuàng)建和管理;第二就是依賴注入,對于存在依賴關系的不同對象,Spring框架可以在容器中進行解耦管理這種依賴關系。1依賴注入的理論知識1.2依賴注入的內(nèi)涵依賴注入可以對Bean注入普通的簡單數(shù)據(jù)類型的屬性值,也可以將一個Bean注入成其他Bean的引用。依賴注入是一種優(yōu)秀的解耦方式,它讓Spring的Bean以配置文件的方式組織在一起,而不是以硬編碼的方式耦合在一起。依賴注入還有另外一種說法,稱為IOC控制反轉。在Spring框架中,控制反轉和依賴注入實際上是同一個概念。在傳統(tǒng)的編程方式下,對象A調(diào)用對象B的方法,一般需要在對象A的內(nèi)部顯示new一個對象B,然后才能調(diào)用。對象的創(chuàng)建、管理和使用都耦合在一起了。使用Spring框架的依賴注入后,可以獨立的在容器中創(chuàng)建對象A和對象B,預留出對象A中對于對象B的引用。當需要使用的時候,將對象B注入到這個預留的引用中,即可以完成對象A對對象B方法的調(diào)用。這種情況下,對象A和對象B的控制權就由相關的代碼移交給了創(chuàng)建它們的容器,也就是控制發(fā)生了反轉,這就是IOC控制反轉這個概念的由來??刂品崔D提供了依賴注入的實現(xiàn)思路,它們是一個概念的兩種說法。1依賴注入的理論知識1.2依賴注入的內(nèi)涵為了更好的理解控制反轉和依賴注入,這里舉一個例子進行說明。假如有兩個對象,人person和斧子axe。人可以用斧子作為工具,即person可以調(diào)用axe的砍伐chop()方法。在原始社會時代,人需要自己造斧子,然后斧子成為這個人的私人工具,他就可以拿著這把斧子進行砍伐工作。這個過程就類似軟件編程里的傳統(tǒng)思路,一個對象需要創(chuàng)建另外一個對象,才可以調(diào)用它的方法。1依賴注入的理論知識1.2依賴注入的內(nèi)涵圖10-1調(diào)用對象創(chuàng)建被調(diào)用對象后來隨著時代進步,一方面有了專門的工廠,可以大批量的制造專業(yè)的斧子。另外,個人制造斧子費事費力,也不夠鋒利耐用,專業(yè)性不強,效率也低下。漸漸的,當人需要使用斧子砍伐的時候,不再是自己去造一把斧子,而是改變思路,去買一把斧子。買斧子的時候,工廠早就將斧子已經(jīng)造好了,只是這個時候斧子的所有人變?yōu)榱速徺I者這個人。此時,雖然這個人沒有制造這把斧子,但是這把工廠制造的斧子已經(jīng)屬于他了,他就可以拿著斧子進行砍伐了。1依賴注入的理論知識1.2依賴注入的內(nèi)涵圖10-2調(diào)用對象不創(chuàng)建被調(diào)用對象這種情況下,就對應Spring的依賴注入模式。工廠就相當于Spring框架的容器,它負責創(chuàng)建和管理Person和Axe對象。購買行為相當于是依賴注入,在人購買斧子后,Spring容器將Axe對象注入到Person對象中。然后Person對象就可以直接調(diào)用Axe對象的砍伐chop()方法。1依賴注入的理論知識1.2依賴注入的內(nèi)涵在這種依賴注入的編程方式下,人和斧子都是獨立的對象,對象的創(chuàng)建都交給容器進行管理。假如有多個人和多把斧子,此時就可以借助容器機制,靈活的將不同的斧子分給不同的人,或者容器回收斧子然后派發(fā)新的斧子。這樣整個的代碼就都沒有耦合在一起,編寫業(yè)務邏輯的時候,思路就更清晰,代碼也就更容易維護和閱讀。在Spring框架中,依賴注入的編程實現(xiàn)方法有很多,這里我們著重講解兩個最基本最常用的,分別是屬性值注入和構造器注入。屬性值注入對應的是對象成員變量的getter和setter方法,通過函數(shù)接口完成注入。構造器注入對應的是對象的構造函數(shù)的參數(shù),通過參數(shù)傳遞來完成注入。這兩種注入的方式在編程上相差不大,可以根據(jù)具體的應用場景來靈活選擇使用。下面通過兩個具體的編程案例來進行詳細講解。2依賴注入的實現(xiàn)2.1屬性注入的使用案例屬性注入通過Java類成員變量的getter和setter函數(shù)來實現(xiàn),使用起來較為簡單方便,是依賴注入最常用的方式之一。在本案例中,為了更好的演示項目開發(fā)的流程和規(guī)范,使用先設計接口后編碼實現(xiàn)的方式來進行項目開發(fā)。2依賴注入的實現(xiàn)創(chuàng)建工程打開Eclipse,選擇新建項目中的DynamicWebProject也就是動態(tài)Web項目。相關選項和配置使用默認的,給項目起一個名稱,最后點擊Finish完成即完成項目的創(chuàng)建。2依賴注入的實現(xiàn)項目的準備工作找到項目的lib文件夾,路徑為項目根目錄下src/main/webapp/WEB-INF/lib,從之前下載Spring框架的文件夾里找到項目所需的jar包,復制到項目lib文件夾下,完成jar包的導入。如下圖所示。圖10-3項目所需的jar包示意圖2依賴注入的實現(xiàn)編寫接口類的代碼在項目的根目錄下,新建一個接口類的包com.service,包里新建兩個接口類:Computer.java是被調(diào)用類的接口,Person.java是調(diào)用類的接口。Person.java01packagecom.service;02publicinterfacePerson{03voiduseComputer();04}Computer.java2依賴注入的實現(xiàn)編寫接口類的代碼01packagecom.service;02publicinterfaceComputer{03voidwork();04}接口定義的都較為簡單,Computer接口中有一個work()函數(shù),Person接口中有一個useComputer()函數(shù),用于調(diào)用其他對象。2依賴注入的實現(xiàn)編寫實現(xiàn)類的代碼編寫好接口類后,接下來編寫針對接口的實現(xiàn)類。在項目根目錄下創(chuàng)建實現(xiàn)類的包com.pojo,分別新建兩個實現(xiàn)類:Laptop.java是Computer.java的實現(xiàn)類,Student.java是Person.java。讀者在開發(fā)項目的時候需要注意,當類或接口較多時,盡量規(guī)范命名,使得從命名上也可以大致分辨不同類或接口的關系。Student.java01packagecom.pojo;02importcom.service.Computer;03importcom.service.Person;2依賴注入的實現(xiàn)}12publicvoidsetName(Stringname){13=name;14}15publicvoidsetComputer(Computercomputer){16puter=computer;17}18@Override19publicvoiduseComputer(){20//TODOAuto-generatedmethodstub2依賴注入的實現(xiàn)}21System.out.println("Student:"+name+"useComputer()");22computer.work();23}24}第04行代碼,implementsPerson聲明了該類是繼承了Person.java,因此類里面必須含有Person.java的函數(shù),對應第18~23行代碼。2依賴注入的實現(xiàn)}第05~06行代碼,對應Student類的兩個成員變量,一個是普通成員變量name,一個是其他的Java類對象Computer。第12~17行代碼分別對應兩個成員變量的setter函數(shù),這個在屬性注入的時候,會被Spring框架的底層容器機制調(diào)用。第18~23行代碼是接口的方法,內(nèi)容是打印出name屬性,并調(diào)用成員變量computer的work()方法,實現(xiàn)一個對象A調(diào)用另外一個對象B的方法。Laptop.java01packagecom.pojo;02importcom.service.Computer;2依賴注入的實現(xiàn)}03publicclassLaptopimplementsComputer{04@Override05publicvoidwork(){06//TODOAuto-generatedmethodstub07System.out.println("Uselaptopasacomputertowork(codingorphotoshop).");08}09}Laptop.java由于是被調(diào)用類,它的代碼相對較簡單,它繼承了Computer.java,需要實現(xiàn)接口里定義的work()方法。2依賴注入的實現(xiàn)編寫配置文件的代碼在項目代碼的根目錄也就是src/main/java下,創(chuàng)建Spring框架的配置文件applicationContext.xml。在配置文件中,主要是完成相關的命名空間設置、xml的schema配置,以及項目中需要用到的JavaBean的定義和配置。具體代碼如下所示。applicationContext.xml01<?xmlversion="1.0"encoding="UTF-8"?>02<beansxmlns="/schema/beans"2依賴注入的實現(xiàn)編寫配置文件的代碼08<propertyname="computer"ref="surface"/>09</bean>10<beanid="surface"class="com.pojo.Laptop"/>11</beans>第10行代碼,定義了一個id為surface的Java對象,對應com.pojo.Laptop類,它就是最終會被調(diào)用的Java對象。2依賴注入的實現(xiàn)編寫配置文件的代碼第06~09行代碼,定義了調(diào)用者的Java對象。id為stu01,對應com.pojo.Student類。然后通過property子元素,設置name屬性取值為Allen,設置computer屬性取值為第10行代碼定義的id為surface的Java對象。這里的07~08兩行代碼,就是屬性注入的具體實現(xiàn)方法。需要注意的是,對于普通的屬性值,直接用value指定對應的取值即可。如果是注入一個Java對象,則需要首先定義一個被注入或者說被調(diào)用的Java對象,然后用ref來指定id值,即可完成注入。2依賴注入的實現(xiàn)編寫項目的測試代碼在根目錄下創(chuàng)建Java包com.test,新建測試文檔TestMain.java,內(nèi)部代碼如下所示。TestMain.java01packagecom.test;02importorg.springframework.context.ApplicationContext;03importorg.springframework.context.support.ClassPathXmlApplicationContext;04importcom.pojo.Student;05importcom.pojo.Student2;2依賴注入的實現(xiàn)編寫項目的測試代碼06publicclassTestMain{07publicstaticvoidmain(String[]args){08//TODOAuto-generatedmethodstub09ApplicationContextcontext=newClassPathXmlApplicationContext("applicationContext.xml");10Studentstudent=context.getBean("stu01",Student.class);11student.useComputer();14}2依賴注入的實現(xiàn)}第09行代碼,通過讀入配置文件,來啟動Spring框架的容器。在Spring框架中,容器可以通過上下文對象ApplicationContext來獲取,構造函數(shù)ClassPathXmlApplicationContext需要傳入配置文件的路徑和文件名。第10行代碼,由于Spring的容器已經(jīng)啟動,定義好的Bean對象會直接被容器創(chuàng)建。這里只需要使用context.getBean來獲取Bean對象即可。第11行代碼,通過student.useComputer(),來調(diào)用student對象中的成員變量laptop對象。2依賴注入的實現(xiàn)項目測試結果項目代碼編寫完成后,在TestMain.java文件中點擊右鍵,點擊運行RunAs,選擇JavaApplication。項目運行結果如下圖所示。圖10-4Spring框架的屬性注入運行示意圖2依賴注入的實現(xiàn)項目測試結果從圖中可以看到,student對象和laptop對象都正常運行并輸出打印相關內(nèi)容。使用依賴注入最大的優(yōu)勢,就是業(yè)務代碼中沒有兩個對象的創(chuàng)建和管理的相關代碼,同時被調(diào)用對象和調(diào)用對象之間也沒有硬編碼耦合,我們可以隨時通過配置文件中的ref來指向另外一個不同的對象id從而完成新的調(diào)用關系。這種解耦的編程方式,有助于項目的長期維護。2依賴注入的實現(xiàn)2.2構造器注入的使用案例除了屬性注入可以實現(xiàn)依賴注入,還可以使用構造器注入。顧名思義,構造器注入需要在Java類中聲明帶有參數(shù)的構造函數(shù),通過構造函數(shù)的參數(shù)傳遞來完成依賴注入操作。除了注入方式的不同,其他方面和屬性注入基本一致。下面通過一個具體案例演示構造器注入的使用方法。2依賴注入的實現(xiàn)編寫實現(xiàn)類的代碼在前面的案例中,由于使用了屬性注入,Java類中必須實現(xiàn)成員變量的setter函數(shù)。本案例中使用構造器注入,因此Java類中可以不實現(xiàn)setter函數(shù),但是必須有帶參數(shù)的構造函數(shù)。Student2.java01packagecom.pojo;02importcom.service.Computer;03importcom.service.Person;04publicclassStudent2implementsPerson{05privateStringname;2依賴注入的實現(xiàn)編寫實現(xiàn)類的代碼06privateComputercomputer;07//搭配構造器注入,需

溫馨提示

  • 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. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論