0014-每特教育螞蟻課堂spring技術(shù)知識(shí)與springaop_第1頁(yè)
0014-每特教育螞蟻課堂spring技術(shù)知識(shí)與springaop_第2頁(yè)
0014-每特教育螞蟻課堂spring技術(shù)知識(shí)與springaop_第3頁(yè)
0014-每特教育螞蟻課堂spring技術(shù)知識(shí)與springaop_第4頁(yè)
0014-每特教育螞蟻課堂spring技術(shù)知識(shí)與springaop_第5頁(yè)
已閱讀5頁(yè),還剩10頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、Spring 基礎(chǔ)知識(shí)和 SprinP一、課程目標(biāo)Spring 的概述 Spring 的環(huán)境搭建 SpringIOC 與 AOP二、Spring 的概述Spring 框架,可以解決對(duì)象創(chuàng)建以及對(duì)象之間依賴關(guān)系的一種框架。且可以和其他框架一起使用;Spring 與 Struts,Spring 與 hibernate (起到整合(粘合)作用的一個(gè)框架)Spring 提供了一站式解決方案:1)2)spring 的功能: IOC 容器, 解決對(duì)象創(chuàng)建及依賴關(guān)系Spring CoreSpring WebSpring 對(duì) web 模塊的支持。- 可以與 struts 整合,讓struts 的 action

2、 創(chuàng)建交給 spring- spring mvc 模式Spring 對(duì)jdbc 操作的支持 【JdbcTemplate 模板工具類】spring 對(duì) orm 的支持:3)4)SpringSpring ORM 既可以與 hibernate 整合,【ses】 也可以使用 spring 的對(duì) hibernate 操作的封裝P切面編程spring 對(duì) javaEE 其他模塊的支持5)Sprin 6)SpringEE三、Spring 的環(huán)境搭建3.1spring 環(huán)境需要 maven 坐標(biāo)4.0.0com.itmayieduitmayiedu-spring0.0.1-SNAPSHOT.springfra

3、meworkspring-core3.0.6.RELEASE.springframeworkspring-context3.0.6.RELEASE.springframeworksprinp3.0.6.RELEASE.springframeworkspring-orm3.0.6.RELEASE.aspectjaspectjrt1.6.1aspectjaspectjweaver1.5.3cglibcglib2.1_23.2 需要交給 Spring 管理注入類3.3spring 配置文件3.4 測(cè)試類public class SpringTest public claserEntity priva

4、te String name; privateeger age; public String getName() return name;public void setName(String name) = name;publiceger getAge() return age;public void setAge(eger age) this.age = age;3.5 驗(yàn)證問(wèn)題,spring bean id 重復(fù)會(huì)怎么辦?四、Spring 加載過(guò)程4.1 spring 是單例還是多例?4.2 spring 作用域4.2.1singleton 作用域4.2.2singleton它交給客戶端,

5、隨后就對(duì)該 prototype 實(shí)例了。不管何種作用域,容器都會(huì)調(diào)用所有對(duì)象的初始化生命周期回調(diào)方法,而對(duì) prototype 而言,任何配置好的析構(gòu)生命周期回調(diào)prototype 作用域部署的 bean,每一次請(qǐng)求(將其注入到另一個(gè) bean 中,或者以程序的方式調(diào)用容器的 getBean()方法)都會(huì)產(chǎn)生一個(gè)新的 bean 實(shí)例,相當(dāng)與一個(gè) new 的操作,對(duì)于 prototype 作用域的 bean,有一點(diǎn)非常重要,那就是 Spring 不能對(duì)一個(gè) prototype bean的整個(gè)生命周期負(fù)責(zé),容器在初始化、配置、裝飾或者是裝配完一個(gè) prototype 實(shí)例后,將Prototype當(dāng)

6、一個(gè)bean 的 作用域設(shè)置為singleton, 那么Spring IOC 容器中只會(huì)存在一個(gè)共享的bean實(shí)例,并且所有對(duì)bean 的請(qǐng)求,只要id 與該bean 定義相匹配,則只會(huì)返回bean 的同一實(shí)例。換言之,當(dāng)把 一個(gè)bean 定義設(shè)置為 singleton 作用域時(shí),Spring IOC 容器只會(huì)創(chuàng)建該 bean 定義的唯一實(shí)例。這個(gè)單一實(shí)例會(huì)被到單例緩存(singleton cache)中,并且所有針對(duì)該bean 的后續(xù)請(qǐng)求和都 將返回被緩存的對(duì)象實(shí)例,這里要注意的是 singleton 作用域和 GOF 設(shè)計(jì)模式中的單例是完全不同的,單例設(shè)計(jì)模式表示一個(gè)ClassLoader

7、 中 只有一個(gè)class 存在,而這里的 singleton 則表示一個(gè)容器對(duì)應(yīng)一個(gè)bean,也就是說(shuō)當(dāng)一個(gè)bean 被標(biāo)識(shí)為singleton 時(shí) 候,spring 的IOC 容器中只會(huì)存在一個(gè)該bean。public sic void main(String args) ClassPathXmlApplicationContext applicationContext = newClassPathXmlApplicationContext(applicationContext.xml); UserEntity userEntity = (UserEntity)applicationCont

8、ext.getBean(userEntity); System.out.prln(userEntity);方法都將不會(huì)被調(diào)用。 清除 prototype 作用域的對(duì)象并任何 prototype bean 所持有的昂貴資源,都是客戶端代碼的職責(zé)。(讓 Spring 容器被 singleton 作用域 bean 占用資源的一種可行方式是,通過(guò)使用 bean 的后置處理器,該處理器持有要被清除的 bean 的引 用。)4.2.3singleton4.2.4singleton sesses 作用域表示該針對(duì)每一次 HTTP 請(qǐng)求都會(huì)產(chǎn)生一個(gè)新的 bean,同時(shí)該 bean 僅在當(dāng)前 HTTP ses

9、內(nèi)有效五、SpringIOC 容器SpringIOC 容器,是 spring內(nèi)容。作用: 創(chuàng)建對(duì)象 & 處理對(duì)象的依賴關(guān)系5.1 IOC 容器創(chuàng)建對(duì)象:創(chuàng)建對(duì)象, 有幾種方式:1)2)3)調(diào)用無(wú)參數(shù)構(gòu)造器帶參數(shù)構(gòu)造器工廠創(chuàng)建對(duì)象工廠類,靜態(tài)方法創(chuàng)建對(duì)象工廠類,非靜態(tài)方法創(chuàng)建對(duì)象request 表示該針對(duì)每一次HTTP 請(qǐng)求都會(huì)產(chǎn)生一個(gè)新的bean,同時(shí)該bean 僅在當(dāng)前HTTPrequest 內(nèi)有效,配置實(shí)例:request、ses、global ses使用的時(shí)候首先要在初始化web 的web.xml 中做如下配置:request5.2 依賴注入:Spring 中,如何給對(duì)象的屬性賦值?通過(guò)

10、構(gòu)造函數(shù)通過(guò) set 方法給屬性注入值p 名稱空間注解【DI,依賴注入】#(常用)Set 方法注入值思考下,為什么需要生成 set 方法才能賦值?# p 名稱空間注入屬性值 (優(yōu)化)!- 傳統(tǒng)的注入:-# 注解版本使用注解方式可以簡(jiǎn)化 spring 的 IOC 容器的配置!使用注解步驟:1)先引入 context 名稱空間xmlns:context= 2)開(kāi)啟注解掃描通過(guò)注解的方式,把對(duì)象加入 ioc 容器。創(chuàng)建對(duì)象以及處理對(duì)象依賴關(guān)系,相關(guān)的注解:Component指定把一個(gè)對(duì)象加入 IOC 容器itory作用同Component; 在持久層使用Re作用同Component; 在業(yè)務(wù)邏輯層使

11、用ServiceController作用同Component; 在控制層使用屬性注入Resource總結(jié):使用注解,可以簡(jiǎn)化配置,且可以把對(duì)象加入 IOC 容器,及處理依賴關(guān)系(DI)注解可以和 XML 配置一起使用。Resource 與autiwer五、模式5.1 概述(Proxy)是一種設(shè)計(jì)模式, 提供了對(duì)目標(biāo)對(duì)象另外的方式;即通過(guò)目標(biāo)對(duì)象。 這樣好處: 可以在目標(biāo)對(duì)象實(shí)現(xiàn)的基礎(chǔ)上,增強(qiáng)額外的功能操作。(擴(kuò)展目標(biāo)對(duì)象的功能)。舉例:(目標(biāo))-經(jīng)紀(jì)人用戶()模式的關(guān)鍵點(diǎn):對(duì)象與目標(biāo)對(duì)象。5.2 靜態(tài)靜態(tài),1)對(duì)象,要實(shí)現(xiàn)與目標(biāo)對(duì)象一樣的接口;2) 舉例:保存用戶(模擬),直接保存Proxy,

12、 給保存方法添加事務(wù)處理總結(jié)靜態(tài):可以做到在不修改目標(biāo)對(duì)象的功能前提下,對(duì)目標(biāo)對(duì)象功能擴(kuò)展。缺點(diǎn):- 因?yàn)閷?duì)象,需要與目標(biāo)對(duì)象實(shí)現(xiàn)一樣的接口。所以會(huì)有很多類,類太多。- 一旦接口增加方法,目標(biāo)對(duì)象與對(duì)象都要。解決:工廠? 可以使用動(dòng)態(tài)。5.3 動(dòng)態(tài)動(dòng)態(tài),1)2)對(duì)象,不需要實(shí)現(xiàn)接口;對(duì)象的生成,是利用 JDKAPI, 動(dòng)態(tài)的在內(nèi)存中構(gòu)建對(duì)象(需要指定創(chuàng)建對(duì)象/目標(biāo)對(duì)象 實(shí)現(xiàn)的接口的類型;);3)動(dòng)態(tài), JDK, 接口;JDK 中生成|- Proxy對(duì)象的 API:sic Object newProxyInstance(ClassLoader loader,指定當(dāng)前目標(biāo)對(duì)象使用類加載器目標(biāo)對(duì)象實(shí)

13、現(xiàn)的接口的類型事件處理器Classerfa,InvocationHandler h)動(dòng)態(tài)總結(jié):對(duì)象不需要實(shí)現(xiàn)接口,但是目標(biāo)對(duì)象一定要實(shí)現(xiàn)接口;否則不能用動(dòng)態(tài)!(class$Proxy0implements Iuser)思考:有一個(gè)目標(biāo)對(duì)象,想要功能擴(kuò)展,但目標(biāo)對(duì)象沒(méi)有實(shí)現(xiàn)接口,怎樣功能擴(kuò)展?ClassUser/ 子類的方式ClasbclassextendsUser以子類的方式實(shí)現(xiàn)(cglib)5.4 Cglib,也叫做子類。在內(nèi)存中構(gòu)建一個(gè)子類對(duì)象從而實(shí)現(xiàn)對(duì)目標(biāo)對(duì)象功能的擴(kuò)展。CglibJDK 的動(dòng)態(tài)如果想有一個(gè)限制,就是使用動(dòng)態(tài)的對(duì)象必須實(shí)現(xiàn)一個(gè)或多個(gè)接口。沒(méi)有實(shí)現(xiàn)接口的類,就可以使用 CG

14、LIB 實(shí)現(xiàn)。CGLIB 是一個(gè)強(qiáng)大的高性能的代碼生成包,它可以在運(yùn)行期擴(kuò)展Java 類與實(shí)現(xiàn)Java接口。它廣泛的被許多 AOP 的框架使用,例如 Spring AOP 和 dynaop,為他們提供方法的erception()。CGLIB 包的底層是通過(guò)使用一個(gè)小而快的字節(jié)碼處理框架 ASM,來(lái)轉(zhuǎn)換字節(jié)碼并生成新的類。不鼓勵(lì)直接使用 ASM,因?yàn)樗竽惚仨殞?duì) JVM件的格式和指令集都很熟悉。結(jié)構(gòu)包括 class 文Cglib 子類:1) 需要引入 cglib jar 文件, 但是 spring 的引入 spring-core-3.2.5.jar 即可。包中已經(jīng)包括了cglib 功能,所以直

15、接引入功能包后,就可以在內(nèi)存中動(dòng)態(tài)構(gòu)建子類的類不能為 final, 否則報(bào)錯(cuò)。目標(biāo)對(duì)象的方法如果為 final/sic, 那么就不會(huì)被的業(yè)務(wù)方法。,即不會(huì)執(zhí)行目標(biāo)對(duì)象額外在 Spring 的 AOP 編程中,如果加入容器的目標(biāo)對(duì)象有實(shí)現(xiàn)接口,用 JDK;如果目標(biāo)對(duì)象沒(méi)有實(shí)現(xiàn)接口,用 Cglib;六、手動(dòng)實(shí)現(xiàn) AOP 編程AOP 面向切面的編程,AOP 可以實(shí)現(xiàn)“業(yè)務(wù)代碼”與“關(guān)注點(diǎn)代碼”分離/ 保存一個(gè)用戶public void add(User user) Sesses= null; Tran ion trans = null; try ses= HibernateSesFactoryUti

16、ls.getSes();/ 【關(guān)注點(diǎn)代碼】trans = ses.begranion();/ 【關(guān)注點(diǎn)代碼】ses.save(user);/業(yè)務(wù)代碼mit();/【關(guān)注點(diǎn)代碼】 catch (Exception e) e.prStackTrace(); if(trans != null)trans.rollback();/.【關(guān)注點(diǎn)代碼】 finallyHibernateSesFactoryUtils.closeSes(ses);/.【關(guān)注點(diǎn)代碼】分析總結(jié):關(guān)注點(diǎn)代碼,就是指重復(fù)執(zhí)行的代碼。業(yè)務(wù)代碼與關(guān)注點(diǎn)代碼分離,好處?- 關(guān)注點(diǎn)代碼寫(xiě)一次即可;-開(kāi)發(fā)者只需要關(guān)注業(yè)務(wù);-運(yùn)行時(shí)期,執(zhí)行業(yè)務(wù)代

17、碼時(shí)候動(dòng)態(tài)植入關(guān)注點(diǎn)代碼;【】如何分離?過(guò)程式/對(duì)象式/模式分離七、AOP 編程3.1 概述:Aop, aspect object programming面向切面編程功能: 讓關(guān)注點(diǎn)代碼與業(yè)務(wù)代碼分離!關(guān)注點(diǎn),重復(fù)代碼就叫做關(guān)注點(diǎn);切面,關(guān)注點(diǎn)形成的類,就叫切面(類)!面向切面編程,就是指 對(duì)很多功能都有的重復(fù)的代碼抽取,再在運(yùn)行的時(shí)候網(wǎng)業(yè)務(wù)方法上動(dòng)態(tài)植入“切面類代碼”。切入點(diǎn),執(zhí)行目標(biāo)對(duì)象方法,動(dòng)態(tài)植入切面代碼??梢酝ㄟ^(guò)切入點(diǎn)表達(dá)式,指定切面類代碼。哪些類的哪些方法; 給指定的類在運(yùn)行的時(shí)候植入3.2 注解方式實(shí)現(xiàn) AOP 編程步驟:1) 先引入 aop 相關(guān) jar 文件(aspectja

18、op 優(yōu)秀組件)【spring3.2 源碼】【spring2.5 源碼/lib/aopalliance】【spring2.5 源碼/lib/aspectj】或【aspectj-1.8.2lib】sprinp-3.2.5.RELEASE.jaraopalliance.jaraspectjweaver.jar【spring2.5 源碼/lib/aspectj】或【aspectj-1.8.2lib】aspectjrt.jar注意: 用到 spring2.5 版本的jar 文件,如果用jdk1.7 可能會(huì)有問(wèn)題。需要升級(jí) aspectj 組件,即使用 aspectj-1.8.2 版本中提供 jar 文

19、件提供。2) bean.xml 中引入 aop 名稱空間3) 開(kāi)啟 aop 注解4) 使用注解Aspect指定一個(gè)類為切面類Pocut(execution(* com.itmayiedu.service.UserService.add(.)指定切入點(diǎn)表達(dá)式前置通知: 目標(biāo)方法之前執(zhí)行后置通知:目標(biāo)方法之后執(zhí)行(始終執(zhí)行)返回后通知: 執(zhí)行方法結(jié)束前執(zhí)行(異常不執(zhí)行)異常通知:出現(xiàn)異常時(shí)候執(zhí)行環(huán)繞通知: 環(huán)繞目標(biāo)方法執(zhí)行Before(po Cut_()After(po Cut_()AfterReturning(po Cut_() AfterThrowing(po Cut_() Around(po Cut_()Component Aspectpublic class Aop Before(execution(* com.itmayiedu.service.UserService.add(.) public void begin() System.out.prln(前置通知);After(executio

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 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ì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論