spring ioc容器深入理解上線(xiàn)資源包1課件_第1頁(yè)
spring ioc容器深入理解上線(xiàn)資源包1課件_第2頁(yè)
spring ioc容器深入理解上線(xiàn)資源包1課件_第3頁(yè)
spring ioc容器深入理解上線(xiàn)資源包1課件_第4頁(yè)
spring ioc容器深入理解上線(xiàn)資源包1課件_第5頁(yè)
已閱讀5頁(yè),還剩27頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

Spring

IoC容器深入理解SpringIoC容器深入理解—課程概要IoC概述Java反射機(jī)制資源訪問(wèn)工具類(lèi)BeanFactory和ApplicationContext的介紹Bean的生命周期SpringIoC容器深入理解IoC概述IoC概述IoC是Spring容器的內(nèi)核,AOP、聲明式事務(wù)等功能都依賴(lài)于此功能,它涉及代碼解耦,設(shè)計(jì)模式、代碼優(yōu)化等問(wèn)題的考量,我們將通過(guò)以下三方面來(lái)深入了解IoC:IoC的初步理解IoC的注入類(lèi)型IoC的注入方式IoC概述–IoC的初步理解IoC的概念重要但比較晦澀難懂,如下將通過(guò)一個(gè)小例子來(lái)說(shuō)明這個(gè)概念:示例場(chǎng)景:電影:無(wú)間道

-》角色:劉建明

-》演員:劉德華WuJianDao+tianTai():voidLiuDeHua+declare():void劇本和演員直接耦合WuJianDao+tianTai():voidLiuJianming+declare():voidLiuDeHua+declare():void<<create>>引入角色接口后的關(guān)系示例場(chǎng)景:電影:無(wú)間道

-》角色:劉建明

-》演員:劉德華IoC概述–IoC的初步理解WuJianDao+tianTai():voidDirector+directMovie():voidLiuJianming+declare():void<<create>>LiuDeHua+declare():voidIoC的字面理解:其一:控制其二:反轉(zhuǎn)DI概念的引入:讓調(diào)用類(lèi)對(duì)某一接口實(shí)現(xiàn)類(lèi)的依賴(lài)關(guān)系由第三方注入,以移除調(diào)用類(lèi)對(duì)某一接口實(shí)現(xiàn)類(lèi)的依賴(lài)引入導(dǎo)演,劇本和飾演者完全解耦I(lǐng)oC概述–IoC的注入類(lèi)型從注入方法上看,主要?jiǎng)澐譃槿N類(lèi)型:構(gòu)造函數(shù)注入屬性注入接口注入IoC概述–IoC的注入類(lèi)型構(gòu)造函數(shù)注入:通過(guò)調(diào)用類(lèi)的構(gòu)造函數(shù),將接口實(shí)現(xiàn)類(lèi)通過(guò)構(gòu)造函數(shù)變量傳入:PublicclassWuJianDao{privateLiuJianmingljm;//1:注入劉建明的具體扮演者publicWuJianDao(LiuJianmingljm){this.ljm=ljm;}publicvoidtianTai(){ljm.declare(“我想做一個(gè)好人!”)}}PublicclassDirector{publicvoiddirect(){//2.指定角色的扮演者LiuJianmingljm=newLiuDeHua();//3.注入具體扮演者到劇本中WuJianDaowjd=newWuJianDao(ljm);wjd.tianTai();}}IoC概述–IoC的注入類(lèi)型屬性注入:通過(guò)Setter方法完成調(diào)用類(lèi)所需依賴(lài)的注入,更加靈活方便:PublicclassWuJianDao{privateLiuJianmingljm;//1.屬性注入方法publicvoidsetLjm(LiuJianminljm){this.ljm=ljm;}publicvoidtianTai(){ljm.declare(“我想做一個(gè)好人!”)}}PublicclassDirector{publicvoiddirect(){LiuJianmingljm=newLiuDeHua();WuJianDaowjd=newWuJianDao();//2.調(diào)用屬性Setter方法注入wjd.setLjm(ljm);wjd.tianTai();}IoC概述–IoC的注入類(lèi)型接口注入:將調(diào)用類(lèi)所有依賴(lài)注入的方法抽取到一個(gè)接口中,調(diào)用類(lèi)通過(guò)實(shí)現(xiàn)該接口提供相應(yīng)的注入方法。PublicclassWuJianDaoimplementsActorArrangable{privateLiuJianmingljm;//1.實(shí)現(xiàn)接口方法publicvoidinjectLjm(LiuJianmingljm){this.ljm=ljm;}publicvoidtianTai(){ljm.declare(“我想做一個(gè)好人!”)}}PublicclassDirector{publicvoiddirect(){LiuJianmingljm=newLiuDeHua();WuJianDaowjd=newWuJianDao();wjd.injectLjm(ljm);wjd.tianTai();}}PublicinterfaceActorArrangable{voidinjectLjm(LiuJianmingljm);}IoC概述–IoC的注入方式Spring作為一個(gè)容器,通過(guò)配置文件或者注解描述類(lèi)和類(lèi)之間的依賴(lài)關(guān)系,自動(dòng)完成類(lèi)的初始化和依賴(lài)注入的工作,下面是對(duì)以上實(shí)例進(jìn)行配置的配置文件片段://1.實(shí)現(xiàn)類(lèi)實(shí)例化<beanid=“l(fā)jm"class=“LiuDeHua"/>//2.通過(guò)ljm-ref建立依賴(lài)關(guān)系<beanid=“wjd"class=“WuJianDao"p:ljm-ref=“l(fā)jm”/></beans>SpringIoC容器深入理解Java反射機(jī)制Java反射機(jī)制Java語(yǔ)言允許通過(guò)程序化的方式間接對(duì)Class的對(duì)象實(shí)例操作,Class文件由類(lèi)裝載器裝載后,在JVM中將形成一份描述Class結(jié)構(gòu)的元信息對(duì)象,通過(guò)該元信息對(duì)象可以獲知Class的結(jié)構(gòu)信息,如構(gòu)造函數(shù)、屬性和方法等:示例講解:通過(guò)實(shí)例探訪Java反射機(jī)制ClassLoader:介紹ClassLoader的工作機(jī)制以及重要方法Java反射機(jī)制:深入講解Java的反射機(jī)制與IoC的關(guān)系:通過(guò)實(shí)例介紹Java反射機(jī)制與Spring

IoC之間的關(guān)系Java反射機(jī)制–示例講解編寫(xiě)一個(gè)簡(jiǎn)單示例開(kāi)始探訪Java反射機(jī)制的征程,通過(guò)比較傳統(tǒng)方法以及反射機(jī)制創(chuàng)建類(lèi)實(shí)例的不同,來(lái)介紹Java反射機(jī)制的原理:Car類(lèi):擁有兩個(gè)構(gòu)造函數(shù),一個(gè)方法以及三個(gè)屬性傳統(tǒng)調(diào)用方法,使用構(gòu)造函數(shù)設(shè)置屬性或者set方法設(shè)置屬性1.構(gòu)造函數(shù)方法:Carcar=newCar(“紅旗轎車(chē)”,“黑色”,“180”);2.Set方法:Carcar=newCar();car.setBrand(“紅旗轎車(chē)”);Java反射機(jī)制,以一種更加通用的方式間接地操作目標(biāo)類(lèi)Java反射機(jī)制–ClassLoader類(lèi)裝載器就是尋找類(lèi)的字節(jié)碼文件并構(gòu)造出類(lèi)在JVM內(nèi)部表示的對(duì)象組件,主要工作由ClassLoader及其子類(lèi)負(fù)責(zé),ClassLoader是一個(gè)重要的Java運(yùn)行時(shí)系統(tǒng)組件,它負(fù)責(zé)在運(yùn)行時(shí)查找和裝入Class字節(jié)碼文件:重要方法:ClassloadClass(Stringname)ClassdefineClass(Stringname,byte[]b,intoff,intlen)ClassfindSystemClass(Stringname)ClassfindLoadedClass(Stringname)ClassLoadergetParent()工作機(jī)制:裝載:查找和導(dǎo)入Class文件鏈接:執(zhí)行校驗(yàn),準(zhǔn)備和解析步驟初始化:對(duì)類(lèi)的靜態(tài)變量、靜態(tài)代碼塊執(zhí)行初始化工作Java反射機(jī)制–Java反射機(jī)制Class反射對(duì)象描述類(lèi)語(yǔ)義結(jié)構(gòu),可以從Class對(duì)象中獲取構(gòu)造函數(shù),成員變量,方法等類(lèi)元素的反射對(duì)象,并以編程的方式通過(guò)這些反射對(duì)象對(duì)目標(biāo)類(lèi)對(duì)象進(jìn)行操作。這些反射對(duì)象類(lèi)在java.reflect包中定義,下面是最主要的三個(gè)反射類(lèi):ConstructorMethodClassgetReturnType()Class[]getParameterTypes()Class[]getExceptionTypes()Annotation[][]getParameterAnnotations()FieldJava反射機(jī)制–與IoC的關(guān)系

在Spring中,通過(guò)IOC可以將實(shí)現(xiàn)類(lèi)、參數(shù)信息等配置在其對(duì)應(yīng)的配置文件中,那么當(dāng)需要更改實(shí)現(xiàn)類(lèi)或參數(shù)信息時(shí),只需要修改配置文件即可,

我們還可以對(duì)某對(duì)象所需要的其它對(duì)象進(jìn)行注入,這種注入都是在配置文件中做的。Spring的IOC的實(shí)現(xiàn)原理利用的就是Java的反射機(jī)制,Spring的工廠類(lèi)會(huì)幫我們完成配置文件的讀取、利用反射機(jī)制注入對(duì)象等工作,我們可以通過(guò)bean的名稱(chēng)獲取對(duì)應(yīng)的對(duì)象。SpringIoC容器深入理解資源訪問(wèn)工具類(lèi)JDK所提供的訪問(wèn)資源的類(lèi)并不能很好的滿(mǎn)足各種底層資源的訪問(wèn)需求,因此,Spring設(shè)計(jì)了一個(gè)Resource接口,它為應(yīng)用提供了更強(qiáng)大的訪問(wèn)底層資源的能力:資源訪問(wèn)工具類(lèi)具體實(shí)現(xiàn)類(lèi):ByteArrayResourceClassPathResourceFileSystemResourceInputStreamResourceServletContextResourceUrlResource主要方法:booleanexists()booleanisOpen()URLgetURL()FilegetFile()InputStreamgetInputStream()為了訪問(wèn)不同類(lèi)型的資源,必須使用相應(yīng)的Resource實(shí)現(xiàn)類(lèi),這是比較麻煩的,Spring提供了一個(gè)強(qiáng)大的加載資源的機(jī)制,能夠自動(dòng)識(shí)別不同的資源類(lèi)型:資源訪問(wèn)工具類(lèi)Ant風(fēng)格的匹配符:?:匹配文件名中的一個(gè)字符*:匹配文件名中的任意字符**:匹配多層路徑Ant風(fēng)格的資源路徑示例:

/t*st.xmlFile:D:/conf/*.xml/**/test.xmlClasspath:org/springframework/**/*.xml資源類(lèi)型地址前綴:classpath/jike/bean.xmlFile/jike/bean.xmlhttp://ftp/bean.xml無(wú)前綴com/jike/bean.xmlSpring定義了一套資源加載的接口,并提供了實(shí)現(xiàn)類(lèi),如下:資源訪問(wèn)工具類(lèi)ResourcePatternResolver+getResource(StringlocationPattern):ResourceResourceLoader+getResource(Stringlocation):ResourcePathMatchingResourcePatternResolverResource+getFile():FileResourcePatternResolverresolver=newPathMatchingResourcePatternResolver();//加載所有類(lèi)包c(diǎn)om(及子孫包)下的以xml為后綴的資源Resourceresources[]=resolver.getResources("classpath*/**/*.xml");for(Resourceresource:resources){System.out.println(resource.getDescription());}SpringIoC容器深入理解BeanFactory和ApplicationContext的介紹BeanFactory和ApplicationContext的介紹BeanFactory是Spring框架最核心的接口,它提供了高級(jí)IoC的配置機(jī)制。ApplicationContext建立在BeanFactory基礎(chǔ)之上,提供了更多面向應(yīng)用的功能,它提供了國(guó)際化支持和框架事件體系,更易于創(chuàng)建實(shí)際應(yīng)用一般成BeanFactory為IoC容器,而稱(chēng)ApplicationContext為應(yīng)用上下文:BeanFactory是一個(gè)類(lèi)工廠,可以創(chuàng)建并管理各種類(lèi)的對(duì)象,Spring稱(chēng)這些創(chuàng)建和管理的Java對(duì)象為Bean。在Spring中,Java對(duì)象的范圍更加寬泛。接下來(lái)我們對(duì)BeanFactory的類(lèi)體系結(jié)構(gòu)以及裝載初始化順序進(jìn)行說(shuō)明:類(lèi)體系結(jié)構(gòu):XmlBeanFactoryListableBeanFactoryHierarhicalBeanFactoryConfigurableBeanFactoryAutowireCapableBeanFactorySingletonBeanFactoryBeanDefinitionRegistry初始化順序:創(chuàng)建配置文件裝載配置文件啟動(dòng)IoC容器獲取Bean實(shí)例BeanFactory和ApplicationContext的介紹–BeanFactory的介紹ApplicationContext由BeanFactory派生而來(lái),提供了更多面向?qū)嶋H應(yīng)用的功能。在BeanFactory中,很多功能需要以編程的方式方式實(shí)現(xiàn),而在ApplicationContext中則可以通過(guò)配置的方式實(shí)現(xiàn)。接下來(lái)介紹一下ApplicationContext的實(shí)現(xiàn)類(lèi)以及類(lèi)體系結(jié)構(gòu):具體實(shí)現(xiàn)類(lèi):ClassPathXmlApplicationContextFileSystemXmlApplicationContextConfigurableApplicationContext擴(kuò)展接口:ApplicationEventPublisherMessageSourceReaourcePatternResolverLifeCycleBeanFactory和ApplicationContext的介紹–ApplicationContext的介紹和BeanFactory初始化相似,ApplicationContext的初始化也很簡(jiǎn)單,根據(jù)配置文件路徑不同可以選擇不同的實(shí)現(xiàn)類(lèi)加載:ClassPathXmlApplicationContextFileSystemXmlApplicationContextBean的實(shí)例化問(wèn)題BeanFactory和ApplicationContext的介紹–ApplicationContext的介紹SpringIoC容器深入理解Bean的生命周期Bean的生命周期Spring容器中的Bean擁有明確的生命周期,由多個(gè)特定的生命階段組成,每個(gè)生命階段都允許外界對(duì)Bean施加控制。在Spring中,我們從Bean的作用范圍和實(shí)例化Bean時(shí)所經(jīng)歷的一系列階段來(lái)描述Bean的生命周期:BeanFactory中的Bean的生命周期ApplicationContext中的Bean的生命周期如下通過(guò)一個(gè)圖形化的方式進(jìn)行描述BeanFactory中的Bean的生命周期:調(diào)用InstantiationAwareBeanPostProssor的postProcessBeforeInstantiation()方法調(diào)用BeanNameAware的setBeanName()方法調(diào)用InstantiationAwareBeanPostProssor的postProcessPropertyValues()方法調(diào)用InstantiationAwareBeanPostProssor的postProcessAfterInstantiation()方法實(shí)例化設(shè)置屬性值調(diào)用BeanFactoryAware的setBeanFactory()方法調(diào)用InitializingBean的afterPropertiesSet()方法調(diào)用BeanPostProcessor的postProcessBeforeInitialization()方法調(diào)用BeanPostProcessor的postProcessAfterInitialization()方法調(diào)用init-method屬性配置的初始化方法將準(zhǔn)備就緒的Bean交給使用者Spring緩存池中準(zhǔn)備就緒的Bean調(diào)用DisposableBean的afterPropertiesSet()方法調(diào)用destroy-method屬性配置的銷(xiāo)毀方法【singleton】【prototype】【容器銷(xiāo)毀】Bean的生命周期–BeanFactory中的Bean的生命周期如下通過(guò)一個(gè)圖形化的方式進(jìn)行描述BeanFactory中的Bean的生命周期:調(diào)用InstantiationAwareBeanPostProssor的postProcessBeforeInstantiation()方法調(diào)用BeanNameAware的setBeanName()方法調(diào)用InstantiationAwareBeanPostProssor的postProcessPropertyValues()方法調(diào)用InstantiationAwareBeanPostProssor的po

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論