版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
模塊一基礎(chǔ)技能訓(xùn)練模塊《電商web云平臺(tái)開(kāi)發(fā)》思維導(dǎo)圖搭建電商平臺(tái)Spring業(yè)務(wù)層搭建電商平臺(tái)的Web項(xiàng)目—SpringMVC展示層搭建電商平臺(tái)數(shù)據(jù)處理MyBatis項(xiàng)目1目錄CONTENTS23電商平臺(tái)SSM三層框架整合4項(xiàng)目一
搭建電商平臺(tái)Spring業(yè)務(wù)層項(xiàng)目背景SSM框架是Spring+SpringMVC+MyBatis三大框架的整合,是目前比較主流的JavaEE企業(yè)級(jí)框架,用于搭建各種大小型的企業(yè)級(jí)應(yīng)用系統(tǒng)。Spring是一個(gè)控制反轉(zhuǎn)(IoC)和面向切面(AOP)的容器框架,SpringMVC是一個(gè)基于MVC設(shè)計(jì)模式的輕量級(jí)web框架,MyBatis是一個(gè)基于java的持久層框架。SpringSpringMVCMyBatisSSM框架本章節(jié)主要針對(duì)Spirng框架的學(xué)習(xí)和應(yīng)用做詳細(xì)的講解,故本章主要研究?jī)?nèi)容如下:研究?jī)?nèi)容認(rèn)知Spring概念、作用、特性Spring的IOC和依賴注入Spring的AOP實(shí)現(xiàn)模式學(xué)習(xí)目標(biāo)1.了解Spring結(jié)構(gòu)體系;2.理解Spring與IoC的概念和思想;3.認(rèn)識(shí)SpringAOP(面像切面編程)。知識(shí)目標(biāo)1.能夠熟練使用Spring配置文件進(jìn)行配置;2.能夠熟練使用BeanFactory等方法實(shí)現(xiàn)Bean的裝備;3.能夠熟練使用基于XML方式的DI、基于注解的DI;4.能夠熟練使用自動(dòng)代理、Spring-Aop的切面、Spring-AspectJ配置事務(wù)管理。技能目標(biāo)1.培養(yǎng)學(xué)生的主動(dòng)性、執(zhí)行力;2.鍛煉學(xué)生工作中膽大心細(xì);3.鍛煉學(xué)生邏輯思維能力;4.培養(yǎng)學(xué)生有探索創(chuàng)新精神。素養(yǎng)目標(biāo)任務(wù)一認(rèn)知Spring概念、作用、特性預(yù)備知識(shí)一、Spring框架介紹面向切面(AOP)依賴注入(DI)輕量級(jí)的控制反轉(zhuǎn)(IoC)Spring框架Spring框架是為了解決企業(yè)應(yīng)用開(kāi)發(fā)的復(fù)雜性而誕生的,它簡(jiǎn)化了Java應(yīng)用開(kāi)發(fā),提高了開(kāi)發(fā)的可測(cè)試性和可重用性。簡(jiǎn)單來(lái)說(shuō),Spring是一個(gè)輕量級(jí)的控制反轉(zhuǎn)(IoC)、依賴注入(DI)和面向切面(AOP)的容器框架。預(yù)備知識(shí)一、Spring框架介紹2314控制反轉(zhuǎn)(IoC)控制反轉(zhuǎn)是一種編程思想,也是一種軟件設(shè)計(jì)思想。事務(wù)事務(wù)是一系列操作合起來(lái)的總稱(chēng),是為了保證數(shù)據(jù)的完整性而出現(xiàn)的一種工具。依賴注入(DI)依賴注入使用“反射”等底層技術(shù),根據(jù)類(lèi)名生成相應(yīng)的對(duì)象,注入依賴項(xiàng)和執(zhí)行方法。面向切面編程(AOP)面向切面的編程思想是將這些輔助功能封裝成切面,利用AOP容器的功能將切面織入到主要業(yè)務(wù)邏輯中。Spring框架特點(diǎn)預(yù)備知識(shí)一、Spring框架介紹原子性(atomicity)AB一致性(consistency)事務(wù)必須具有四大特征C隔離性(isolation)D持久性(durability)預(yù)備知識(shí)二、Spring概念為代碼“解耦”降低代碼間的耦合度提高靈活性Spring主要作用主業(yè)務(wù)邏輯代碼系統(tǒng)級(jí)業(yè)務(wù)邏輯代碼系統(tǒng)代碼分類(lèi)預(yù)備知識(shí)二、Spring概念I(lǐng)oC使得主業(yè)務(wù)在相互調(diào)用過(guò)程中,不需要再自己創(chuàng)建使用對(duì)象了,統(tǒng)一由Spring容器管理,以自動(dòng)“注入”的方式完成“織入”,使得系統(tǒng)級(jí)服務(wù)得到了最大復(fù)用,且不用再由程序員手工將系統(tǒng)級(jí)服務(wù)“混雜”到主業(yè)務(wù)邏輯中了。IoC
01AOP02降低耦合度的方式預(yù)備知識(shí)二、Spring概念數(shù)據(jù)訪問(wèn)/集成Web與遠(yuǎn)程調(diào)用面向切面編程應(yīng)用服務(wù)器設(shè)備管理消息發(fā)送核心容器測(cè)試Spring框架是由20多個(gè)模塊組成預(yù)備知識(shí)二、Spring概念核心體系中,從下往上,各部分依次是Test、CoreContainer、AOP、Aspects、DataAccess/Integartion五部分。是Spring對(duì)數(shù)據(jù)訪問(wèn)層的統(tǒng)一和封裝DataAccess/Integartion是Spring對(duì)AspectJ框架的整合Aspects對(duì)應(yīng)spring-aop.jarAOPSpring的核心組件CoreContainerSpring提供的測(cè)試工具Test32154實(shí)施準(zhǔn)備要在Java項(xiàng)目中使用Spring框架,首先需要安裝jdk,來(lái)搭建java的開(kāi)發(fā)環(huán)境,本項(xiàng)目采用的jdk版本為1.8。然后需要前往Spring的官網(wǎng)下載Spring的核心包,最后創(chuàng)建JavaProject并導(dǎo)入下載到本地的Spring框架核心jar包。至此Spring學(xué)習(xí)的準(zhǔn)備工作就好了。任務(wù)實(shí)施與分析步驟1:jdk的安裝和環(huán)境變量的配置我的電腦A屬性B高級(jí)C環(huán)境變量D系統(tǒng)變量E添加環(huán)境變量F注意:添加和修改的是下面的系統(tǒng)變量,并非上面的用戶變量;“Path”是首字母大寫(xiě),不能改成“PATH”,bin后面要有分號(hào)“;”;用戶變量中不要有其他“JAVA_HOME”和“Path”,以避免被干擾。任務(wù)實(shí)施與分析步驟2:Spring相關(guān)的核心包步驟2.1:下載Spring相關(guān)的核心包進(jìn)入Spring官網(wǎng)選擇“4.3.14.RELEASE/”選擇“spring-framework-4.3.14.RELEASE-dist.zip”下載解壓并雙擊打開(kāi)任務(wù)實(shí)施與分析步驟2:Spring相關(guān)的核心包步驟2.1:下載Spring相關(guān)的核心包雙擊打開(kāi)壓縮包之后,會(huì)看到有3個(gè)文件夾和3個(gè)TXT文件,它們分別是:
docs:文檔文件夾
libs:jar包文件夾
schema:約束文件夾
license.txt:許可
notice.txt:注意
readme.txt:說(shuō)明在我們的生活中,有很多的人都會(huì)使用盜版軟件,使用盜版軟件對(duì)正版公司的權(quán)力受到了侵害,那么使用盜版的軟件侵害的是對(duì)方的著作權(quán)嗎?思政小課堂從法律的角度來(lái)看,如果是使用盜版軟件的話一般屬于侵權(quán),但是情節(jié)比較輕微。從目前的市場(chǎng)上的大眾行為來(lái)看,常見(jiàn)的盜版行為主要有生產(chǎn)商仿制軟件光盤(pán)、銷(xiāo)售商在所售計(jì)算機(jī)中預(yù)裝軟件、互聯(lián)網(wǎng)在線軟件盜版、用戶未經(jīng)著作權(quán)人授權(quán)使用軟件、將只讀光盤(pán)中的軟件進(jìn)行復(fù)制并銷(xiāo)售等。如果已經(jīng)使用了盜版的軟件,這個(gè)時(shí)候侵害的就是對(duì)方的著作權(quán),也是知識(shí)產(chǎn)權(quán),但是使用軟件只是侵權(quán)行為非常輕微的情況,一般不需要承擔(dān)比較嚴(yán)重的法律責(zé)任。拓展知識(shí)一、Spring中jar包的作用Spring中有很多包,使用Spring框架不必引入所有的jara包,要使用基本功能的話,只需要圖中選中的最基本的四個(gè)jar包即可。拓展知識(shí)一、Spring中jar包的作用
spring-core.jar:spring其他組件都要使用到這個(gè)包里的類(lèi),是其他組件的基本核心
spring-beans.jar:所有應(yīng)用都需要使用
spring-aop.jar:使用基于AOP的Spring特性,如聲明型事務(wù)管理等
spring-context.jar:為Spring核心提供了大量擴(kuò)展
spring-jdbc.jar:包含對(duì)Spring對(duì)JDBC數(shù)據(jù)訪問(wèn)進(jìn)行封裝的所有類(lèi)
SpringAspects:提供的對(duì)AspectJ框架的整合
Springexpression:Spring表達(dá)式語(yǔ)言
SpringInstrument:Spring對(duì)服務(wù)器的代理接口拓展知識(shí)一、Spring中jar包的作用
spring-instrument-tomcat:Spring對(duì)tomcat連接池的集成
SpringJMS:為簡(jiǎn)化Jmsapi的使用做的簡(jiǎn)單封裝
Springorm:封裝第三方orm實(shí)現(xiàn)
Springoxm:Spring對(duì)于Object/XML映射的支持,可以讓JAVA與XML之間來(lái)回切換
Springtest:對(duì)JUnit等測(cè)試框架的簡(jiǎn)單封裝
Springtx:為JDBC、Hibernate、JDO、JPA等提供的一致的聲明式和編程式事務(wù)管理
Springweb:包含Web應(yīng)用開(kāi)發(fā)時(shí),用到Spring框架時(shí)所需的核心類(lèi)
Springwebmvc:包含SpringMVC框架相關(guān)的所有類(lèi)拓展知識(shí)二、Spring中都用到了哪些設(shè)計(jì)模式裝飾器模式適配器模式觀察者模式模板方法模式代理模式工廠設(shè)計(jì)模式單例設(shè)計(jì)模式思考與總結(jié)什么是Spring框架?其特點(diǎn)是什么?能力提升本章開(kāi)始我們將建立一個(gè)電商網(wǎng)站項(xiàng)目,該項(xiàng)目基于SSM框架開(kāi)發(fā),通過(guò)各個(gè)章節(jié)的學(xué)習(xí)將逐步完善該電商網(wǎng)站項(xiàng)目,本章將引導(dǎo)同學(xué)們創(chuàng)建項(xiàng)目并引入Spring框架,請(qǐng)同學(xué)們完善電商網(wǎng)站項(xiàng)目的以下內(nèi)容:
搭建java運(yùn)行環(huán)境,保證jdk安裝成功,查看jdk版本狀態(tài);
創(chuàng)建JavaProject項(xiàng)目;
從官網(wǎng)下載Spring相關(guān)的jar包;
將Spring相關(guān)的jar包導(dǎo)入項(xiàng)目,并添加至構(gòu)建路徑。任務(wù)訓(xùn)練1.在開(kāi)發(fā)工具中創(chuàng)建自己的電商網(wǎng)站項(xiàng)目Javaproject;2.將下載好的Spring相關(guān)jar包導(dǎo)入到項(xiàng)目中。《電商web云平臺(tái)開(kāi)發(fā)》感謝觀看!模塊一基礎(chǔ)技能訓(xùn)練模塊《電商web云平臺(tái)開(kāi)發(fā)》思維導(dǎo)圖搭建電商平臺(tái)Spring業(yè)務(wù)層搭建電商平臺(tái)的Web項(xiàng)目—SpringMVC展示層搭建電商平臺(tái)數(shù)據(jù)處理MyBatis項(xiàng)目1目錄CONTENTS23電商平臺(tái)SSM三層框架整合4項(xiàng)目一
搭建電商平臺(tái)Spring業(yè)務(wù)層項(xiàng)目背景SSM框架是Spring+SpringMVC+MyBatis三大框架的整合,是目前比較主流的JavaEE企業(yè)級(jí)框架,用于搭建各種大小型的企業(yè)級(jí)應(yīng)用系統(tǒng)。Spring是一個(gè)控制反轉(zhuǎn)(IoC)和面向切面(AOP)的容器框架,它最主要的使命就是為了簡(jiǎn)化java開(kāi)發(fā),通過(guò)其核心的的Beanfactory實(shí)現(xiàn)底層類(lèi)的實(shí)例化和生命周期管理。SpringMVC是一個(gè)基于MVC設(shè)計(jì)模式的輕量級(jí)web框架,由于SpringMVC是Spring框架的一部分,所以可以與Spring框架無(wú)縫集成。MyBatis是一個(gè)基于java的持久層框架,因?yàn)樗膬?nèi)部封裝了JDBC,所以MyBatis可以通過(guò)注解或XML的方式進(jìn)行配置,最后執(zhí)行SQL語(yǔ)句并將結(jié)果映射成Java對(duì)象返回。本章節(jié)主要針對(duì)Spirng框架的學(xué)習(xí)和應(yīng)用做詳細(xì)的講解,故本章主要研究?jī)?nèi)容如下:研究?jī)?nèi)容認(rèn)知Spring概念、作用、特性Spring的IOC和依賴注入Spring的AOP實(shí)現(xiàn)模式學(xué)習(xí)目標(biāo)1.了解Spring結(jié)構(gòu)體系;2.理解Spring與IOC的概念和思想;3.認(rèn)識(shí)SpringAOP(面像切面編程)。知識(shí)目標(biāo)1.能夠熟練使用Spring配置文件進(jìn)行配置;2.能夠熟練使用BeanFactory等方法實(shí)現(xiàn)Bean的裝備;3.能夠熟練使用基于XML方式的DI;4.能夠熟練使用基于注解的DI;5.能夠熟練使用自動(dòng)代理;6.能夠熟練使用Spring-Aop的切面;7.能夠熟練使用Spring-AspectJ配置事務(wù)管理。技能目標(biāo)1.培養(yǎng)學(xué)生的主動(dòng)性、執(zhí)行力;2.鍛煉學(xué)生工作中膽大心細(xì);3.鍛煉學(xué)生邏輯思維能力;4.培養(yǎng)學(xué)生有探索創(chuàng)新精神。素養(yǎng)目標(biāo)任務(wù)二Spring的IoC和依賴注入預(yù)備知識(shí)一、控制反轉(zhuǎn)和依賴注入的概念控制反轉(zhuǎn)(IoC):控制權(quán)的轉(zhuǎn)移就是所謂的反轉(zhuǎn),指依賴對(duì)象的控制權(quán)從應(yīng)用程序本身轉(zhuǎn)移到外部容器,其實(shí)現(xiàn)策略一般有依賴查找和依賴注入兩種。依賴查找(DL):是JavaEE中傳統(tǒng)的依賴管理方式,首先需要注冊(cè)依賴或服務(wù),然后再通過(guò)容器提供的API查找依賴對(duì)象和資源。依賴查找依賴注入控制反轉(zhuǎn)預(yù)備知識(shí)一、控制反轉(zhuǎn)和依賴注入的概念依賴注入:依賴對(duì)象通過(guò)注入的方式進(jìn)行創(chuàng)建,由容器負(fù)責(zé)組建和注入,即程序在運(yùn)行時(shí),若需要調(diào)用另一個(gè)對(duì)象進(jìn)行協(xié)助時(shí),不用重新創(chuàng)建被調(diào)用者代碼,直接依賴外部容器創(chuàng)建后傳遞給程序,這是更為流行的IoC實(shí)現(xiàn)策略。實(shí)施準(zhǔn)備
認(rèn)識(shí)了Spring容器在框架中的作用及配置,掌握了Spring的基礎(chǔ)配置及Jar包目錄結(jié)構(gòu)相關(guān)的知識(shí)點(diǎn),通過(guò)下載安裝jdk,配置環(huán)境變量,為本任務(wù)的開(kāi)展做好前期準(zhǔn)備工作。接下來(lái),將開(kāi)啟Spring的IoC和依賴注入的相關(guān)學(xué)習(xí)任務(wù)。任務(wù)實(shí)施與分析創(chuàng)建javaproject步驟1.1步驟1.3步驟1.2導(dǎo)入核心jar包導(dǎo)入日志相關(guān)的jar包步驟1:導(dǎo)入核心jar包任務(wù)實(shí)施與分析步驟3.1創(chuàng)建Spring配置文件。步驟2.1:步驟3.2在applicationContext.xml配置文件中注冊(cè)Service。步驟2.2步驟2:定義接口與實(shí)體類(lèi)新建com.freamwork.service包,在com.freamwork.service包下定義ISomeService接口。創(chuàng)建SomeServiceImpl實(shí)現(xiàn)類(lèi)實(shí)現(xiàn)ISomeService接口。步驟3:創(chuàng)建Spring配置文件任務(wù)實(shí)施與分析步驟4定義測(cè)試類(lèi)在src下建立com.framework.test包,并創(chuàng)建MyTest.java類(lèi)編寫(xiě)測(cè)試內(nèi)容后執(zhí)行。步驟4.1步驟5.1查看ApplicationContext與BeanFactory接口容器并掌握他們的區(qū)別步驟4.2創(chuàng)建SomeServiceImpl實(shí)現(xiàn)類(lèi)實(shí)現(xiàn)ISomeService接口。步驟5.2配置注冊(cè)Service。步驟5.3創(chuàng)建ISomeService接口的doSome方法。步驟5掌握bean的默認(rèn)裝配方式步驟5.4編寫(xiě)測(cè)試類(lèi)。任務(wù)實(shí)施與分析步驟9:bean后處理器步驟9.1:創(chuàng)建ISomeService接口。步驟9.2:創(chuàng)建SomeServiceImpl實(shí)現(xiàn)類(lèi)實(shí)現(xiàn)ISomeService接口。步驟9.3:創(chuàng)建MyBeanPostProcessor類(lèi)實(shí)現(xiàn)BeanPostProcessor。步驟9.4:實(shí)現(xiàn)執(zhí)行目標(biāo)方法。步驟9.5:配置注冊(cè)Bean后處理器。步驟9.6:編寫(xiě)測(cè)試類(lèi)測(cè)試。步驟6:動(dòng)態(tài)工廠Bean步驟6.1:將動(dòng)態(tài)工廠Bean作為普通Bean使用。步驟6.2:使用Spring的動(dòng)態(tài)工廠Bean。步驟7:靜態(tài)工廠Bean步驟8:容器中bean的作用域步驟8.1:注冊(cè)Service單例模式。步驟8.2:編寫(xiě)測(cè)試類(lèi)并運(yùn)行。任務(wù)實(shí)施與分析步驟10:了解并定制bean的生命始末步驟11:bean的生命周期步驟11.1:注冊(cè)Service,為adao和bdao注入指aaa,bbb步驟11.2:SomeServiceImpl的實(shí)現(xiàn)步驟12:注入分類(lèi)步驟12.1:設(shè)值注入步驟12.2:構(gòu)造注入步驟13:對(duì)于域?qū)傩宰詣?dòng)注入步驟14:使用SpEL注入步驟15:使用同類(lèi)抽象Bean注入步驟16:使用異類(lèi)抽象Bean注入步驟17:為應(yīng)用指定多個(gè)Spring配置文件步驟18:定義Bean@Component注解步驟18.1:導(dǎo)入AOP的Jar包步驟18.2:更換配置文件頭步驟18.3:在Spring配置文件中配置組件掃描器步驟18.4:在類(lèi)上使用注解@Component任務(wù)實(shí)施與分析步驟21:按類(lèi)型注入域?qū)傩訞Autowired步驟19:Bean的作用域@Scope步驟20:基本類(lèi)型屬性注入@Value步驟22:按名稱(chēng)注入域?qū)傩訞Autowired與@Qualifier步驟23:域?qū)傩宰⒔釦Resource拓展知識(shí)一、實(shí)例化Bean的三種方式實(shí)例化Bean的方式默認(rèn)無(wú)參構(gòu)造函數(shù)(推薦)靜態(tài)工廠模式動(dòng)態(tài)工廠模式<beanid="StudentBeanFactory"class="com.framework.di07.StudentBeanFactory"></bean><beanid="myStudent3"factory-bean=”StudentBeanFactory”factory-method=”constructorStudentBean”></bean><beanid="myStudent2"class="com.framework.di07.StudentBeanFactory"factory-method=”staticStudentBean”></bean><beanid="myStudent"class="com.framework.di07.Student"></bean>拓展知識(shí)二、IoC和DI常用的幾個(gè)注解(一)IoC注解■@Component:屬性有value,指定bean的id,如果不指定value屬性,默認(rèn)bean的id是當(dāng)前類(lèi)的類(lèi)名,首字母小寫(xiě)?!鯜Controller:一般用于表現(xiàn)層;■@Service:用于業(yè)務(wù)層;■@Repository:用于持久層。(二)DI注解■@Autowired(默認(rèn)按類(lèi)型裝配)相當(dāng)于<propertyname=""ref="">?!鯜Resource(默認(rèn)按名稱(chēng)裝配)相當(dāng)于<propertyname=""value="">。拓展知識(shí)三、Spring擴(kuò)展接口BeanPostProcessor接口BeanFactoryPostProcessor接口InitializingBean接口FactoryBean接口思考與總結(jié)同學(xué)們通過(guò)以上操作,完成了對(duì)Spring的IoC和DI的學(xué)習(xí),請(qǐng)同學(xué)們?cè)诖嘶A(chǔ)上,體會(huì)學(xué)習(xí)過(guò)程,進(jìn)行思考并回答以下問(wèn)題:Spring的作用是什么?Bean工廠創(chuàng)建Bean的三種方式都有哪些?請(qǐng)回答IoC最大的好處是什么?能力提升在上一節(jié)中,我們已經(jīng)對(duì)電商網(wǎng)站項(xiàng)目引入了Spring框架開(kāi)發(fā)的相關(guān)jar包,本節(jié)將對(duì)電商網(wǎng)站項(xiàng)目的商品類(lèi)別業(yè)務(wù)進(jìn)行實(shí)現(xiàn),請(qǐng)同學(xué)們結(jié)合本節(jié)所學(xué)內(nèi)容,繼續(xù)完成電商網(wǎng)站項(xiàng)目的以下內(nèi)容:能力提升1.創(chuàng)建商品類(lèi)別的業(yè)務(wù)接口CategoryService,定義商品類(lèi)別查詢方法;2.創(chuàng)建商品類(lèi)別的接口實(shí)現(xiàn)類(lèi)CategoryServiceImpl,實(shí)現(xiàn)商品類(lèi)別的查詢方法,輸出任意字符串;3.創(chuàng)建Spring的配置文件并進(jìn)行Service注冊(cè);4.定義測(cè)試類(lèi),執(zhí)行商品類(lèi)別查詢方法。1234任務(wù)訓(xùn)練1.練習(xí)在Spring配置文件中對(duì)Service類(lèi)進(jìn)行注冊(cè)。2.創(chuàng)建商品查詢的業(yè)務(wù)接口與業(yè)務(wù)實(shí)現(xiàn)類(lèi)。3.驗(yàn)證商品業(yè)務(wù)表的查詢結(jié)果,在控制臺(tái)中輸出查詢結(jié)果。任務(wù)訓(xùn)練掃碼進(jìn)入課程網(wǎng)站,獲取對(duì)應(yīng)任務(wù)單,閱讀任務(wù)目標(biāo),根據(jù)任務(wù)步驟,完成拓展任務(wù)并提交。《電商web云平臺(tái)開(kāi)發(fā)》感謝觀看!模塊一基礎(chǔ)技能訓(xùn)練模塊《電商web云平臺(tái)開(kāi)發(fā)》思維導(dǎo)圖目錄CONTENTS搭建電商平臺(tái)Spring業(yè)務(wù)層搭建電商平臺(tái)的Web項(xiàng)目—SpringMVC展示層搭建電商平臺(tái)數(shù)據(jù)處理MyBatis項(xiàng)目123電商平臺(tái)SSM三層框架整合4項(xiàng)目一
搭建電商平臺(tái)Spring業(yè)務(wù)層項(xiàng)目背景SSM框架是Spring+SpringMVC+MyBatis三大框架的整合,是目前比較主流的JavaEE企業(yè)級(jí)框架,用于搭建各種大小型的企業(yè)級(jí)應(yīng)用系統(tǒng)。Spring是一個(gè)控制反轉(zhuǎn)(IoC)和面向切面(AOP)的容器框架,SpringMVC是一個(gè)基于MVC設(shè)計(jì)模式的輕量級(jí)web框架,MyBatis是一個(gè)基于java的持久層框架。SpringSpringMVCMyBatisSSM框架本章節(jié)主要針對(duì)Spirng框架的學(xué)習(xí)和應(yīng)用做詳細(xì)的講解,故本章主要研究?jī)?nèi)容如下:研究?jī)?nèi)容認(rèn)知Spring概念、作用、特性Spring的IOC和依賴注入Spring的AOP實(shí)現(xiàn)模式學(xué)習(xí)目標(biāo)1.了解Spring結(jié)構(gòu)體系;2.理解Spring與IoC的概念和思想;3.認(rèn)識(shí)SpringAOP(面像切面編程)。知識(shí)目標(biāo)1.能夠熟練使用Spring配置文件進(jìn)行配置;2.能夠熟練使用BeanFactory等方法實(shí)現(xiàn)Bean的裝備;3.能夠熟練使用基于XML方式的DI、基于注解的DI;4.能夠熟練使用自動(dòng)代理、Spring-Aop的切面、Spring-AspectJ配置事務(wù)管理。技能目標(biāo)1.培養(yǎng)學(xué)生的主動(dòng)性、執(zhí)行力;2.鍛煉學(xué)生工作中膽大心細(xì);3.鍛煉學(xué)生邏輯思維能力;4.培養(yǎng)學(xué)生有探索創(chuàng)新精神。素養(yǎng)目標(biāo)任務(wù)三Spring的AOP實(shí)現(xiàn)模式預(yù)備知識(shí)一、AOP簡(jiǎn)介ABC日志記錄安全控制參數(shù)校驗(yàn)GFED事務(wù)處理統(tǒng)一異常處理緩存:實(shí)現(xiàn)緩存存取和清除統(tǒng)一發(fā)信、聽(tīng)通知預(yù)備知識(shí)二、AOP編程術(shù)語(yǔ)切面(Aspect)泛指交叉業(yè)務(wù)邏輯。實(shí)際就是對(duì)主業(yè)務(wù)邏輯的一種增強(qiáng)??椚耄╓eaving)是指將切面代碼插入到目標(biāo)對(duì)象的過(guò)程。連接點(diǎn)(JoinPoint)指可以被切面織入的方法。通常業(yè)務(wù)接口中的方法均為連接點(diǎn)。切入點(diǎn)(Pointcut)被標(biāo)記為final的方法是不能作為連接點(diǎn)與切入點(diǎn)的。目標(biāo)對(duì)象(Target)指將要被增強(qiáng)的對(duì)象,即包含主業(yè)務(wù)邏輯的類(lèi)的對(duì)象。通知(Advice)是切面的一種實(shí)現(xiàn),可以完成簡(jiǎn)單織入功能。顧問(wèn)(Advisor)是切面的另一種實(shí)現(xiàn)是將通知包裝為更復(fù)雜切面的裝配器。預(yù)備知識(shí)三、了解AspectJCBA編譯后利用ajc編譯器向.class文件和.jar文件中織入增強(qiáng)代碼編譯時(shí)使用ajc編譯器替代javac編譯器,在源文件編譯成.class文件時(shí)織入增強(qiáng)代碼加載時(shí)利用aspectjweaver.jar,使用動(dòng)態(tài)dialing的方式在類(lèi)加載期間織入切面AspectJ不同階段的實(shí)現(xiàn)方式:(一)AspectJ的簡(jiǎn)介預(yù)備知識(shí)三、了解AspectJ(二)AspectJ的切入點(diǎn)表達(dá)式04010302
[declaring-type-pattern]全限定性類(lèi)名name-pattern(param-pattern)方法名(參數(shù)名)
execution[modifiers-pattern]訪問(wèn)權(quán)限類(lèi)型
ret-type-pattern返回值類(lèi)型注意:表達(dá)式中加[]的部分表示可省略部分,各部分間用空格分開(kāi)。預(yù)備知識(shí)三、了解AspectJ(二)AspectJ的切入點(diǎn)表達(dá)式符號(hào)意義*0至多個(gè)任意字符..用在方法參數(shù)中,標(biāo)識(shí)任意多個(gè)參數(shù),用在包名后,表示當(dāng)前包及其子包路徑+用在類(lèi)名后,標(biāo)識(shí)當(dāng)前類(lèi)及其子類(lèi),用在接口后,標(biāo)識(shí)當(dāng)前接口及其實(shí)現(xiàn)類(lèi)表達(dá)式中還可以使用以下符號(hào)舉例execution(*set*(..))指定切入點(diǎn)為:任何一個(gè)以“set”開(kāi)始的方法。預(yù)備知識(shí)四、了解Spring事務(wù)管理的接口(一)事務(wù)管理器接口是PlatformTransactionManager接口對(duì)象,其主要功能是實(shí)現(xiàn)完成事務(wù)的提交、回滾及獲取事務(wù)的狀態(tài)信息。預(yù)備知識(shí)四、了解Spring事務(wù)管理的接口(一)事務(wù)管理器接口DataSourceTransactionManager使用JDBC或iBatis進(jìn)行持久化數(shù)據(jù)時(shí)使用HibernateTransactionManager使用Hibernate進(jìn)行持久化數(shù)據(jù)時(shí)使用1.PlatformTransactionManager接口的兩個(gè)實(shí)現(xiàn)類(lèi)LOREM預(yù)備知識(shí)四、了解Spring事務(wù)管理的接口(一)事務(wù)管理器接口2.Spring的回滾方式Throwable類(lèi)是Java語(yǔ)言中所有錯(cuò)誤或異常的超類(lèi)。Error是程序在運(yùn)行過(guò)程中出現(xiàn)的無(wú)法處理的錯(cuò)誤。預(yù)備知識(shí)四、了解Spring事務(wù)管理的接口(一)事務(wù)管理器接口在代碼編寫(xiě)時(shí)要求必須捕獲或拋出的異常,若不處理則無(wú)法通過(guò)編譯。受查異常是RuntimeException類(lèi)或其子類(lèi)在運(yùn)行時(shí)才出現(xiàn)的異常。運(yùn)行時(shí)異常3.異常預(yù)備知識(shí)四、了解Spring事務(wù)管理的接口(二)事務(wù)定義接口231事務(wù)隔離級(jí)別事務(wù)定義接口TransactionDefinition中定義了事務(wù)描述相關(guān)的三類(lèi)常量。事務(wù)傳播行為事務(wù)默認(rèn)超時(shí)時(shí)限預(yù)備知識(shí)四、了解Spring事務(wù)管理的接口(二)事務(wù)定義接口1.事務(wù)隔離級(jí)別DEFAULT采用DB默認(rèn)的事務(wù)隔離級(jí)別READ_UNCOMMITTED讀未提交。未解決任何并發(fā)問(wèn)題READ_COMMITTED讀已提交。解決臟讀,存在不可重復(fù)讀與幻讀REPEATABLE_READ可重復(fù)讀。解決臟讀、不可重復(fù)讀,存在幻讀SERIALIZABLE串行化。不存在并發(fā)問(wèn)題預(yù)備知識(shí)四、了解Spring事務(wù)管理的接口(二)事務(wù)定義接口2.事務(wù)傳播行為REQUIRED:指定的方法必須在事務(wù)內(nèi)執(zhí)行。NOT_SUPPORTED:指定的方法不能在事務(wù)環(huán)境中執(zhí)行。REQUIRES_NEW:總是新建一個(gè)事務(wù)。SUPPORTS:指定的方法支持當(dāng)前事務(wù)。MANDATORY:指定的方法必須在當(dāng)前事務(wù)內(nèi)執(zhí)行。NEVER:指定的方法不能在事務(wù)環(huán)境下執(zhí)行。NESTED:指定的方法必須在事務(wù)內(nèi)執(zhí)行。預(yù)備知識(shí)四、了解Spring事務(wù)管理的接口(二)事務(wù)定義接口3.事務(wù)默認(rèn)超時(shí)時(shí)限常量TIMEOUT_DEFAULT定義了事務(wù)底層默認(rèn)的超時(shí)時(shí)限和不支持事務(wù)超時(shí)時(shí)限設(shè)置的none值。它定義了默認(rèn)事務(wù)的超時(shí)時(shí)限。需要注意:由于影響事務(wù)超時(shí)時(shí)限發(fā)揮作用的條件比較多、超時(shí)的時(shí)間計(jì)算比較復(fù)雜,該值一般就使用默認(rèn)值即可。實(shí)施準(zhǔn)備我們認(rèn)識(shí)了Spring的IoC和依賴注入相關(guān)的知識(shí)與開(kāi)發(fā)技術(shù)之后,需進(jìn)一步理解并掌握AOP切面的基礎(chǔ)知識(shí),包括AOP應(yīng)用場(chǎng)景、AOP編程術(shù)語(yǔ)、AspectJ的切入點(diǎn)表達(dá)式、Spring事務(wù)管理的接口等,為搭建AOP開(kāi)發(fā)環(huán)境和開(kāi)發(fā)AOP實(shí)現(xiàn)模式提前做好準(zhǔn)備。任務(wù)實(shí)施與分析步驟1.AOP開(kāi)發(fā)環(huán)境搭建在原有Spring基本jar包的基礎(chǔ)上再導(dǎo)入AOP聯(lián)盟的規(guī)范(接口)包及Spring對(duì)其的實(shí)現(xiàn)包。步驟1.1:導(dǎo)入jar包步驟1.2:使用原Beans的約束<?xmlversion="1.0"encoding="UTF-8"?><beansxmlns="/schema/beans"xmlns:xsi="/2001/XMLSchema-instance"xsi:schemaLocation="/schema/beans/spring-beans.xsd">任務(wù)實(shí)施與分析步驟2:掌握通知adivce//主業(yè)務(wù)接口publicinterfaceISomeService{
//目標(biāo)方法 voiddoFirst();
//目標(biāo)方法 voiddoSecond();}//目標(biāo)類(lèi)publicclassSomeServiceImplimplementsISomeService{ @Override publicvoiddoFirst(){
System.out.println("執(zhí)行doFirst()方法"); } @Override publicvoiddoSecond(){
System.out.println("執(zhí)行doSecond()方法"); }}在目標(biāo)方法執(zhí)行之前先執(zhí)行010302不改變目標(biāo)方法執(zhí)行的結(jié)果不改變目標(biāo)方法的執(zhí)行流程,前置通知代碼不能阻止目標(biāo)方法執(zhí)行步驟2.1:學(xué)習(xí)前置通知MethodBeforeAdvice任務(wù)實(shí)施與分析步驟2:掌握通知adivce步驟2.1:學(xué)習(xí)前置通知MethodBeforeAdvice//前置通知publicclassMyMethodBeforeAdviceimplementsMethodBeforeAdvice{
//當(dāng)前方法在目標(biāo)方法執(zhí)行之前執(zhí)行
//method:目標(biāo)方法 //args:目標(biāo)方法的參數(shù)列表
//target:目標(biāo)對(duì)象 @Override publicvoidbefore(Methodmethod,Object[]args,Objecttarget) throwsThrowable{
//對(duì)于目標(biāo)方法的增強(qiáng)代碼就應(yīng)該寫(xiě)在這里
System.out.println("執(zhí)行前置通知方法"); }}(1)定義前置通知任務(wù)實(shí)施與分析步驟2:掌握通知adivce步驟2.1:學(xué)習(xí)前置通知MethodBeforeAdvice<!--注冊(cè)目標(biāo)對(duì)象--><beanid="someService"class="com.framework.aop01.SomeServiceImpl"/><!--注冊(cè)切面:通知--><beanid="myAdvice"class="com.framework.aop01.MyMethodBeforeAdvice"/><!--生成代理對(duì)象--><beanid="serviceProxy"class="org.springframework.aop.framework.ProxyFactoryBean"> <!--<propertyname="targetName"value="someService"/>--> <!--指定目標(biāo)對(duì)象--> <propertyname="target"ref="someService"/> <!--指定切面--> <propertyname="interceptorNames"value="myAdvice"/></bean>(2)配置文件配置任務(wù)實(shí)施與分析步驟2:掌握通知adivce步驟2.1:學(xué)習(xí)前置通知MethodBeforeAdvice@Testpublicvoidtest01(){ //創(chuàng)建容器對(duì)象,加載Spring配置文件 Stringresource="com/framework/aop01/applicationContext.xml"; ApplicationContextac=newClassPathXmlApplicationContext(resource); ISomeServiceservice=(ISomeService)ac.getBean("serviceProxy"); service.doFirst(); System.out.println("=================="); service.doSecond();}(3)編寫(xiě)測(cè)試類(lèi)進(jìn)行測(cè)試任務(wù)實(shí)施與分析步驟2:掌握通知adivce步驟2.2:學(xué)習(xí)后置通知AfterReturningAdvice0301
02在目標(biāo)方法執(zhí)行之后執(zhí)行不改變目標(biāo)方法執(zhí)行的結(jié)果不改變目標(biāo)方法的執(zhí)行流程,后置通知代碼不能阻止目標(biāo)方法執(zhí)行IBAOTU.COMIBAOTU.COMIBAOTU.COM任務(wù)實(shí)施與分析步驟2:掌握通知adivce步驟2.2:學(xué)習(xí)后置通知AfterReturningAdvice@OverridepublicStringdoSecond(){
System.out.println("執(zhí)行doSecond()方法"); return"abcde";}(1)修改業(yè)務(wù)接口與實(shí)現(xiàn)類(lèi)任務(wù)實(shí)施與分析步驟2:掌握通知adivce步驟2.2:學(xué)習(xí)后置通知AfterReturningAdvice//后置通知:可以獲取到目標(biāo)方法的返回結(jié)果,但無(wú)法改變目標(biāo)方法的結(jié)果publicclassMyAfterReturningAdviceimplementsAfterReturningAdvice{ //在目標(biāo)方法執(zhí)行之后執(zhí)行 //returnValue:目標(biāo)方法的返回值 @Override publicvoidafterReturning(ObjectreturnValue,Methodmethod, Object[]args,Objecttarget)throwsThrowable{ System.out.println("執(zhí)行后置通知方法returnValue="+returnValue); if(returnValue!=null){ returnValue=((String)returnValue).toUpperCase(); System.out.println("修改過(guò)的結(jié)果returnValue="+returnValue); } }}(2)定義切面:通知任務(wù)實(shí)施與分析步驟2:掌握通知adivce步驟2.2:學(xué)習(xí)后置通知AfterReturningAdvice!--注冊(cè)目標(biāo)對(duì)象--><beanid="someService"class="com.framework.aop02.SomeServiceImpl"/><!--注冊(cè)切面:通知--><beanid="myAdvice"class="com.framework.aop02.MyAfterReturningAdvice"/><!--生成代理對(duì)象--><beanid="serviceProxy"class="org.springframework.aop.framework.ProxyFactoryBean"> <propertyname="target"ref="someService"/> <propertyname="interceptorNames"value="myAdvice"/></bean>(3)修改配置文件配置任務(wù)實(shí)施與分析步驟2:掌握通知adivce步驟2.3:環(huán)繞通知MethodInterceptor//環(huán)繞通知:可以修改目標(biāo)方法的返回結(jié)果publicclassMyMethodInterceptorimplementsMethodInterceptor{ @Override publicObjectinvoke(MethodInvocationinvocation)throwsThrowable{
System.out.println("執(zhí)行環(huán)繞通知:目標(biāo)方法執(zhí)行之前");
//執(zhí)行目標(biāo)方法
Objectresult=invocation.proceed();
System.out.println("執(zhí)行環(huán)繞通知:目標(biāo)方法執(zhí)行之后"); if(result!=null){ result=((String)result).toUpperCase(); } returnresult; }}(1)定義環(huán)繞通知,即方法攔截器。需要注意的是,環(huán)繞通知需要添加MethodInterceptor包。任務(wù)實(shí)施與分析步驟2:掌握通知adivce步驟2.3:環(huán)繞通知MethodInterceptor<!--注冊(cè)目標(biāo)對(duì)象--><beanid="someService"class="com.framework.aop03.SomeServiceImpl"/><!--注冊(cè)切面:通知--><beanid="myAdvice"class="com.framework.aop03.MyMethodInterceptor"/><!--生成代理對(duì)象--><beanid="serviceProxy"class="org.springframework.aop.framework.ProxyFactoryBean"> <propertyname="target"ref="someService"/> <propertyname="interceptorNames"value="myAdvice"/></bean>(2)修改配置文件配置為環(huán)繞通知配置。任務(wù)實(shí)施與分析步驟2:掌握通知adivce步驟2.3:環(huán)繞通知MethodInterceptor@Testpublicvoidtest01(){ //創(chuàng)建容器對(duì)象,加載Spring配置文件 Stringresource="com/framework/aop03/applicationContext.xml"; ApplicationContextac=newClassPathXmlApplicationContext(resource); ISomeServiceservice=(ISomeService)ac.getBean("serviceProxy"); service.doFirst(); System.out.println("=================="); Stringresult=service.doSecond(); System.out.println(result);}(3)執(zhí)行測(cè)試類(lèi),返回結(jié)果被修改。任務(wù)實(shí)施與分析步驟2:掌握通知adivce步驟2.4:異常通知ThrowsAdviceafterThrowing()方法重載的四種形式常用的形式是:publicvoidafterThrowing(自定義的異常類(lèi)e)。這里的參數(shù)“e”為與具體業(yè)務(wù)相關(guān)的用戶自定義的異常類(lèi)對(duì)象。容器會(huì)根據(jù)異常類(lèi)型的不同,自動(dòng)選擇不同的該方法執(zhí)行。任務(wù)實(shí)施與分析步驟2:掌握通知adivce步驟2.4:異常通知ThrowsAdvice@OverridepublicvoiddoFirst(){
System.out.println("執(zhí)行doFirst()方法"+3/0);}//異常通知publicclassMyThrowsAdviceimplementsThrowsAdvice{ //當(dāng)目標(biāo)方法拋出與指定類(lèi)型的異常具有is-a關(guān)系的異常時(shí),執(zhí)行當(dāng)前方法 publicvoidafterThrowing(Exceptionex){ System.out.println("執(zhí)行異常通知方法"); }}(1)創(chuàng)建異常方法(2)實(shí)現(xiàn)異常通知任務(wù)實(shí)施與分析步驟2:掌握通知adivce步驟2.4:異常通知ThrowsAdvice<!--注冊(cè)目標(biāo)對(duì)象--><beanid="someService"class="com.framework.aop04.SomeServiceImpl"/><!--注冊(cè)切面:通知--><beanid="myAdvice"class="com.framework.aop04.MyThrowsAdvice"/><!--生成代理對(duì)象--><beanid="serviceProxy"class="org.springframework.aop.framework.ProxyFactoryBean"> <propertyname="target"ref="someService"/> <propertyname="interceptorNames"value="myAdvice"/></bean>(3)修改配置文件為配置異常任務(wù)實(shí)施與分析步驟2:掌握通知adivce步驟2.4:異常通知ThrowsAdvice//創(chuàng)建容器對(duì)象,加載Spring配置文件Stringresource="com/framework/aop04/applicationContext.xml";ApplicationContextac=newClassPathXmlApplicationContext(resource);ISomeServiceservice=(ISomeService)ac.getBean("serviceProxy");service.doFirst();(4)創(chuàng)建測(cè)試類(lèi)執(zhí)行異常方法。任務(wù)實(shí)施與分析步驟2:掌握通知adivce步驟2.5:學(xué)習(xí)無(wú)接口的CGLIB代理生成(1)配置代理,并去掉實(shí)現(xiàn)的接口類(lèi)<!--生成代理對(duì)象--><beanid="serviceProxy"class="org.springframework.aop.framework.ProxyFactoryBean"> <propertyname="target"ref="someService"/> <propertyname="interceptorNames"value="myAdvice"/></bean>(2)在測(cè)試類(lèi)加斷點(diǎn),查看使用的代理任務(wù)實(shí)施與分析步驟2:掌握通知adivce步驟2.6:學(xué)習(xí)有接口的CGLIB代理生成<!--生成代理對(duì)象--><beanid="serviceProxy"class="org.springframework.aop.framework.ProxyFactoryBean"> <propertyname="target"ref="someService"/> <propertyname="interceptorNames"value="myAdvice"/> <!--<propertyname="optimize"value="true"/>--> <propertyname="proxyTargetClass"value="true"/></bean>在配置文件中增加一個(gè)proxyTargetClass屬性設(shè)置,指定是否對(duì)類(lèi)進(jìn)行代理。任務(wù)實(shí)施與分析步驟3:掌握顧問(wèn)AdvisorNameMatchMethodPointcutAdvisor名稱(chēng)匹配方法切入點(diǎn)顧問(wèn)ARegexpMethodPointcutAdvisor正則表達(dá)式匹配方法切入點(diǎn)顧問(wèn)BPointcutAdvisor是顧問(wèn)的一種,可以指定具體的切入點(diǎn)。PointcutAdvisor接口有兩個(gè)較為常用的實(shí)現(xiàn)類(lèi):任務(wù)實(shí)施與分析步驟3:掌握顧問(wèn)Advisor步驟3.1:學(xué)習(xí)名稱(chēng)匹配方法切入點(diǎn)顧問(wèn)<!--注冊(cè)切面:顧問(wèn)--><beanid="myAdvisor"
class="org.springframework.aop.support.NameMatchMethodPointcutAdvisor"> <propertyname="advice"ref="myAdvice"/>
<!--指定切入點(diǎn):這里匹配的對(duì)象是簡(jiǎn)單方法名--> <!--<propertyname="mappedName"value="doFirst"/>--> <!--<propertyname="mappedNames"value="doFirst,doSecond"/>--> <propertyname="mappedNames"value="*ir*"/></bean>
<!--生成代理對(duì)象--><beanid="serviceProxy"
class="org.springframework.aop.framework.ProxyFactoryBean"> <propertyname="target"ref="someService"/> <propertyname="interceptorNames"value="myAdvisor"/></bean>(1)修改配置文件,mappedName配置簡(jiǎn)單方法名,mappedNames配置多個(gè)數(shù)組方法名。任務(wù)實(shí)施與分析步驟3:掌握顧問(wèn)Advisor步驟3.1:學(xué)習(xí)名稱(chēng)匹配方法切入點(diǎn)顧問(wèn)@Testpublicvoidtest01(){ //創(chuàng)建容器對(duì)象,加載Spring配置文件 Stringresource="com/framework/aop07/applicationContext.xml"; ApplicationContextac=newClassPathXmlApplicationContext(resource); ISomeServiceservice=(ISomeService)ac.getBean("serviceProxy"); service.doFirst(); System.out.println("=================="); service.doSecond(); System.out.println("=================="); service.doThird();}(2)運(yùn)行測(cè)試類(lèi),輸出結(jié)果調(diào)用doFirst,doThird方法任務(wù)實(shí)施與分析步驟3:掌握顧問(wèn)Advisor步驟3.2:學(xué)習(xí)正則表達(dá)式方法切入點(diǎn)顧問(wèn)(1)修改配置文件,用正則表達(dá)式配置切入點(diǎn)。<!--注冊(cè)切面:顧問(wèn)--><beanid="myAdvisor"class="org.springframework.aop.support.RegexpMethodPointcutAdvisor"> <propertyname="advice"ref="myAdvice"/> <!--這里的正則表達(dá)式匹配的對(duì)象是全限定性方法名--> <!--<propertyname="pattern"value=".*doFirst"/>--> <!--<propertyname="patterns"value=".*doFirst,.*doSecond"/>--> <!--<propertyname="pattern"value=".*doFirst|.*doSecond"/>--> <propertyname="pattern"value=".*S.*"/></bean><!--生成代理對(duì)象--><beanid="serviceProxy"class="org.springframework.aop.framework.ProxyFactoryBean"> <propertyname="target"ref="someService"/> <propertyname="interceptorNames"value="myAdvisor"/></bean>任務(wù)實(shí)施與分析步驟3:掌握顧問(wèn)Advisor步驟3.2:學(xué)習(xí)正則表達(dá)式方法切入點(diǎn)顧問(wèn)(2)運(yùn)行測(cè)試類(lèi)測(cè)試。@Testpublicvoidtest01(){ //創(chuàng)建容器對(duì)象,加載Spring配置文件 Stringresource="com/framework/aop08/applicationContext.xml"; ApplicationContextac=newClassPathXmlApplicationContext(resource); ISomeServiceservice=(ISomeService)ac.getBean("serviceProxy"); service.doFirst(); System.out.println("=================="); service.doSecond(); System.out.println("=================="); service.doThird();}任務(wù)實(shí)施與分析步驟4:掌握自動(dòng)代理生成器,默認(rèn)advisor、Bean名稱(chēng)默認(rèn)advisor自動(dòng)代理生成器Bean名稱(chēng)自動(dòng)代理生成器
需要注意的是:自動(dòng)代理生成器的Bean也沒(méi)有id屬性,客戶類(lèi)直接使用目標(biāo)對(duì)象Bean的id。任務(wù)實(shí)施與分析步驟4:掌握自動(dòng)代理生成器,默認(rèn)advisor、Bean名稱(chēng)步驟4.1配置自動(dòng)代理生成器<!--注冊(cè)切面:顧問(wèn)--><beanid="myAdvisor"class="org.springframework.aop.support.NameMatchMethodPointcutAdvisor"> <propertyname="advice"ref="myAdvice"/> <propertyname="mappedNames"value="doFirst"/></bean><beanid="myAdvisor2"class="org.springframework.aop.support.NameMatchMethodPointcutAdvisor"> <propertyname="advice"ref="myAdvice"/> <propertyname="mappedNames"value="doSecond"/></bean>
<!--注冊(cè)自動(dòng)代理生成器--><beanclass="org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator"/>任務(wù)實(shí)施與分析步驟4:掌握自動(dòng)代理生成器,默認(rèn)advisor、Bean名稱(chēng)步驟4.2:Bean名稱(chēng)自動(dòng)代理生成器注意:只需要修改配置文件中的代理生成配置,及測(cè)試類(lèi)中的通過(guò)getBean()獲取的Bean的id為目標(biāo)類(lèi)beanId即可。<!--注冊(cè)切面:顧問(wèn)--><beanid="myAdvisor"class="org.springframework.aop.support.NameMatchMethodPointcutAdvisor"> <propertyname="advice"ref="myAdvice"/> <propertyname="mappedNames"value="doFirst"/></bean><beanid="myAdvisor2"class="org.springframework.aop.support.NameMatchMethodPointcutAdvisor"> <propertyname="advice"ref="myAdvice"/> <propertyname="mappedNames"value="doSecond"/></bean>
<!--注冊(cè)自動(dòng)代理生成器--><beanclass="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator"> <propertyname="beanNames"value="someService"/> <propertyname="interceptorNames"value="myAdvisor"/></bean>(1)修改配置自動(dòng)代理,只調(diào)用MyAdvisor。任務(wù)實(shí)施與分析步驟4:掌握自動(dòng)代理生成器,默認(rèn)advisor、Bean名稱(chēng)步驟4.2:Bean名稱(chēng)自動(dòng)代理生成器@Testpublicvoidtest01(){ //創(chuàng)建容器對(duì)象,加載Spring配置文件 Stringresource="com/framework/aop10/applicationContext.xml"; ApplicationContextac=newClassPathXmlApplicationContext(resource); ISomeServiceservice=(ISomeService)ac.getBean("someService"); service.doFirst(); System.out.println("=================="); service.doSecond(); System.out.println("=================="); service.doThird(); System.out.println("-----------------------------"); ISomeServiceservice2=(ISomeService)ac.getBean("someService2"); service2.doFirst(); System.out.println("=================="); service2.doSecond(); System.out.println("=================="); service2.doThird();}(2)執(zhí)行測(cè)試類(lèi)測(cè)試,了解DefaultAdvisorAutoProxyCreator存在的三個(gè)問(wèn)題。任務(wù)實(shí)施與分析步驟5:掌握AspectJ對(duì)AOP的實(shí)現(xiàn)步驟5.1:搭建AspectJ的開(kāi)發(fā)環(huán)境
AOP相關(guān)約束
Spring支持庫(kù)解壓目錄中的子目錄org.aspectj下的兩個(gè)子包任務(wù)實(shí)施與分析步驟5:掌握AspectJ對(duì)AOP的實(shí)現(xiàn)步驟5.2:AspectJ基于注解的AOP的實(shí)現(xiàn)//主業(yè)務(wù)接口publicinterfaceISomeService{
//目標(biāo)方法 voiddoFirst();
//目標(biāo)方法
StringdoSecond();
//目標(biāo)方法 voiddoThird();}//目標(biāo)類(lèi)publicclassSomeServiceImplimplementsISomeService{ @Override publicvoiddoFirst(){
System.out.println("執(zhí)行doFirst()方法"); } @Override publicStringdoSecond(){
System.out.println("執(zhí)行doSecond()方法"); return"abcde"; } @Override publicvoiddoThird(){
System.out.println("執(zhí)行doThird()方法"+3/0);
System.out.println("執(zhí)行doThird()方法"); }}(1)定義業(yè)務(wù)接口與實(shí)現(xiàn)類(lèi)。任務(wù)實(shí)施與分析步驟5:掌握AspectJ對(duì)AOP的實(shí)現(xiàn)步驟5.2:AspectJ基于注解的AOP的實(shí)現(xiàn)@Aspect//表示當(dāng)前類(lèi)為切面publicclassMyAspect{ @Before("execution(**..ISomeService.doFirst(..))") publicvoidmyBefore(){ System.out.println("執(zhí)行前置通知方法");}(2)定義切面Pojo類(lèi),在定義的Pojo類(lèi)上添加@Aspect注解任務(wù)實(shí)施與分析步驟5:掌握AspectJ對(duì)AOP的實(shí)現(xiàn)步驟5.2:AspectJ基于注解的AOP的實(shí)現(xiàn)@Before("execution(**..ISomeService.doFirst(..))") publicvoidmyBefore(){ System.out.println("執(zhí)行前置通知方法"); } @Before("execution(**..ISomeService.doFirst(..))") publicvoidmyBefore(JoinPointjp){ System.out.println("執(zhí)行前置通知方法jp="+jp); } @AfterReturning("execution(**..ISomeService.doSecond(..))") publicvoidmyAfterReturning(){ System.out.println("執(zhí)行后置通知方法");}(3)在Pojo類(lèi)的普通方法上上添加通知注解任務(wù)實(shí)施與分析步驟5:掌握AspectJ對(duì)AOP的實(shí)現(xiàn)步驟5.2:AspectJ基于注解的AOP的實(shí)現(xiàn)<!--注冊(cè)切面--> <beanid="myAspect"class="com.framework.aspectj01.MyAspect"/> <!--注冊(cè)目標(biāo)對(duì)象--> <beanid="someService"class="com.framework.aspectj01.SomeServiceImpl"/> <!--注冊(cè)AspectJ的自動(dòng)代理--><aop:aspectj-autoproxy/>}(4)編寫(xiě)配置文件,注冊(cè)目標(biāo)對(duì)象與Pojo切面類(lèi),注冊(cè)AspectJ的自動(dòng)代理。其工作原理是:<aop:aspectj-autoproxy/>通過(guò)掃描找到@Aspect定義的切面類(lèi),再由切面類(lèi)根據(jù)切入點(diǎn)找到目標(biāo)類(lèi)的目標(biāo)方法,再由通知類(lèi)型找到切入的時(shí)間點(diǎn)。任務(wù)實(shí)施與分析步驟5:掌握AspectJ對(duì)AOP的實(shí)現(xiàn)步驟5.2:AspectJ基于注解的AOP的實(shí)現(xiàn)@Testpublicvoidtest01(){ //創(chuàng)建容器對(duì)象,加載Spring配置文件 Stringresource="com/framework/aspectj01/applicationContext.xml"; ApplicationContextac=newClassPathXmlApplicationContext(resource); ISomeServiceservice=(ISomeService)ac.getBean("someService"); service.doFirst(); System.out.println("----------------------------"); service.doSecond(); System.out.println("----------------------------"); service.doThird();}(5)編寫(xiě)測(cè)試類(lèi)進(jìn)行測(cè)試。任務(wù)實(shí)施與分析步驟5:掌握AspectJ對(duì)AOP的實(shí)現(xiàn)步驟5.3:測(cè)試類(lèi)中使用的目標(biāo)對(duì)象及注解知識(shí)點(diǎn)。(1)@Before前置通知-增強(qiáng)方法有JoinPoint參數(shù)@AfterReturning后置通知-注解有returning屬性@Before("execution(**..ISomeService.doFirst(..))")publicvoidmyBefore(){
System.out.println("執(zhí)行前置通知方法");}
@AfterReturning(value="execution(**..ISomeService.doSecond(..))",returning="result") publicvoidmyAfterReturning(Objectresult){ System.out.println("執(zhí)行后置通知方法result="+result);}(2)任務(wù)實(shí)施與分析步驟5:掌握AspectJ對(duì)AOP的實(shí)現(xiàn)步驟5.3:測(cè)試類(lèi)中使用的目標(biāo)對(duì)象及注解知識(shí)點(diǎn)。@Around("execution(**..ISomeService.doSecond(..))")publicObjectmyAround(ProceedingJoinPointpjp)throwsThrowable{
System.out.println("執(zhí)行環(huán)繞通知方法,目標(biāo)方法執(zhí)行之前");
//執(zhí)行目標(biāo)方法
Objectresult=pjp.proceed();
System.out.println("執(zhí)行環(huán)繞通知方法,目標(biāo)方法執(zhí)行之后"); if(result!=null){ result=((String)result).toUpperCase(); } returnresult;}(3)@Around環(huán)繞通知-增強(qiáng)方法有ProceedingJoinPoint參數(shù)任務(wù)實(shí)施與分析步驟5:掌握AspectJ對(duì)AOP的實(shí)現(xiàn)步驟5.3:測(cè)試類(lèi)中使用的目標(biāo)對(duì)象及注解知識(shí)點(diǎn)。(4)@AfterThrowing異常通知-注解中有throwing屬性@AfterThrowing("execution(**..ISomeService.doThird(..))")publicvoidmyAfterThrowing(){ System.out.println("執(zhí)行異常通知方法");}(5)@After最終通知@After("doThirdPointcut()")publicvoidmyAfter(){ System.out.println("執(zhí)行最終通知方法");}任務(wù)實(shí)施與分析步驟5:掌握AspectJ對(duì)AOP的實(shí)現(xiàn)步驟5.3:測(cè)試類(lèi)中使用的目標(biāo)對(duì)象及注解知識(shí)點(diǎn)。//定義了一個(gè)切入點(diǎn),叫doThirdPointcut()@Pointcut("execution(**..ISomeService.doThird(..))")publicvoiddoThirdPointcu
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年菊花膏項(xiàng)目可行性研究報(bào)告
- 2025至2030年長(zhǎng)梁葉片鎖項(xiàng)目投資價(jià)值分析報(bào)告
- 2025至2030年玻璃鋼椅面項(xiàng)目投資價(jià)值分析報(bào)告
- 光伏組件背板項(xiàng)目風(fēng)險(xiǎn)識(shí)別與評(píng)估綜合報(bào)告
- 霓虹燈裝飾品行業(yè)市場(chǎng)發(fā)展及發(fā)展趨勢(shì)與投資戰(zhàn)略研究報(bào)告
- 2025年廣場(chǎng)綠化植被供應(yīng)與種植合同
- 2025年家用空調(diào)環(huán)保材料采購(gòu)與認(rèn)證合同
- 2025年度建筑廢棄物資源化利用合同頁(yè)6實(shí)施規(guī)范
- 2025年度國(guó)有資產(chǎn)資產(chǎn)評(píng)估及轉(zhuǎn)讓定價(jià)咨詢服務(wù)合同
- 2025年度公路貨物倉(cāng)儲(chǔ)與運(yùn)輸一體化合同
- 二零二五年度大型自動(dòng)化設(shè)備買(mǎi)賣(mài)合同模板2篇
- 江西省部分學(xué)校2024-2025學(xué)年高三上學(xué)期1月期末英語(yǔ)試題(含解析無(wú)聽(tīng)力音頻有聽(tīng)力原文)
- GA/T 2145-2024法庭科學(xué)涉火案件物證檢驗(yàn)實(shí)驗(yàn)室建設(shè)技術(shù)規(guī)范
- 2025年中國(guó)融通資產(chǎn)管理集團(tuán)限公司春季招聘(511人)高頻重點(diǎn)提升(共500題)附帶答案詳解
- 寵物護(hù)理行業(yè)客戶回訪制度構(gòu)建
- 電廠檢修管理
- 機(jī)動(dòng)車(chē)屬性鑒定申請(qǐng)書(shū)
- 2024年中考語(yǔ)文試題分類(lèi)匯編:非連續(xù)性文本閱讀(學(xué)生版)
- 2024年度窯爐施工協(xié)議詳例細(xì)則版B版
- 2024年北京市平谷區(qū)中考英語(yǔ)二模試卷
- 第一屆山東省職業(yè)能力大賽濟(jì)南市選拔賽制造團(tuán)隊(duì)挑戰(zhàn)賽項(xiàng)目技術(shù)工作文件(含樣題)
評(píng)論
0/150
提交評(píng)論