JavaEE企業(yè)級(jí)應(yīng)用開發(fā)與實(shí)戰(zhàn)(微課版)教學(xué)課件全套_第1頁(yè)
JavaEE企業(yè)級(jí)應(yīng)用開發(fā)與實(shí)戰(zhàn)(微課版)教學(xué)課件全套_第2頁(yè)
JavaEE企業(yè)級(jí)應(yīng)用開發(fā)與實(shí)戰(zhàn)(微課版)教學(xué)課件全套_第3頁(yè)
JavaEE企業(yè)級(jí)應(yīng)用開發(fā)與實(shí)戰(zhàn)(微課版)教學(xué)課件全套_第4頁(yè)
JavaEE企業(yè)級(jí)應(yīng)用開發(fā)與實(shí)戰(zhàn)(微課版)教學(xué)課件全套_第5頁(yè)
已閱讀5頁(yè),還剩599頁(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章

初識(shí)SSM框架什么是SSMSSM框架的優(yōu)缺點(diǎn)理解SSM的概念及結(jié)構(gòu)理解SSM的用途及優(yōu)勢(shì)掌握Spring、MyBatis和SpringMVC的基本概念1.1什么是SSMSpring框架的興起MyBatis框架概述SpringMVC核心思想SSM結(jié)構(gòu)分析1.1什么是SSM1.1.1Spring框架的興起早在1996年,Java還只是一個(gè)新興的、初出茅廬的編程語(yǔ)言。人們之所以關(guān)注它僅僅是因?yàn)榭梢允褂肑ava的Applet來(lái)開發(fā)Web應(yīng)用,然而漸漸的,人們發(fā)現(xiàn)這個(gè)新興的語(yǔ)言還能做更多的事情,與之前的所有語(yǔ)言不同,Java的Bean設(shè)計(jì)讓模塊化構(gòu)建復(fù)雜的系統(tǒng)成為可能。復(fù)雜的應(yīng)用通常需要事務(wù)、安全、分布式等服務(wù)的支持,但JavaBean并未直接提供。所以到了1998年3月,Sun公司發(fā)布了EJB1.0規(guī)范,該規(guī)范把Java組件的設(shè)計(jì)理念延伸到了服務(wù)器端,并提供了許多必須的企業(yè)級(jí)服務(wù)?,F(xiàn)在Java組件開發(fā)理念重新回歸正軌,新的編程技術(shù)AOP和DI的不斷出現(xiàn),他們?yōu)镴avaBean提供了之前EJB才能擁有的強(qiáng)大功能。這些技術(shù)為POJO提供了類似EJB的聲明式編程模型,而沒(méi)有引入任何EJB的復(fù)雜性。一切從Bean開始1.1什么是SSM1.1.1Spring框架的興起早在2007年,一個(gè)基于Java語(yǔ)言的開源框架正式發(fā)布,取了一個(gè)非常有活力且美好的名字,叫做Spring。它是一個(gè)開源的輕量級(jí)JavaSE(Java標(biāo)準(zhǔn)版本)/JavaEE(Java企業(yè)版本)開發(fā)應(yīng)用框架,其目的是用于簡(jiǎn)化企業(yè)級(jí)應(yīng)用程序開發(fā)。這里我們可以認(rèn)為Spring是一個(gè)超級(jí)粘合大平臺(tái),除了自己提供功能外,還提供粘合其他技術(shù)和框架的能力,從而使我們可以更自由的選擇到底使用什么技術(shù)進(jìn)行開發(fā)。而且不管是JAVASE(C/S架構(gòu))應(yīng)用程序還是JAVAEE(B/S架構(gòu))應(yīng)用程序都可以使用這個(gè)平臺(tái)進(jìn)行開發(fā)。1.1什么是SSM1.1.1Spring框架的興起Spring是為解決企業(yè)級(jí)應(yīng)用開發(fā)的復(fù)雜性而設(shè)計(jì)的,它可以做很多事。但歸根到底支撐Spring的僅僅是少許的基本理念,而所有的這些基本理念都可以追溯到一個(gè)最根本的使命:簡(jiǎn)化開發(fā)。這是一個(gè)鄭重的承諾,其實(shí)許多框架都聲稱在某些方面做了簡(jiǎn)化。而Spring則立志于全方面的簡(jiǎn)化Java開發(fā)。對(duì)此,它主要采取了3個(gè)策略:面向Bean(BOP)依賴注入(DI)面向切面(AOP)這三個(gè)理念概括了整個(gè)Spring的精髓所在,這些知識(shí)點(diǎn)將在后續(xù)一一介紹。Spring的設(shè)計(jì)初衷1.1什么是SSM1.1.1Spring框架的興起在Spring框架出現(xiàn)之前,Java主要使用企業(yè)級(jí)JavaBean,即EJB(EnterpriceJavaBean)進(jìn)行企業(yè)級(jí)開發(fā),但是EJB框架過(guò)于依賴容器,并且加載緩慢,使用方式復(fù)雜。隨著需求的不斷升級(jí),EJB已經(jīng)不再適合傳統(tǒng)的企業(yè)級(jí)開發(fā)。Spring的出現(xiàn)解決了加載緩慢和使用復(fù)雜等問(wèn)題。Spring采用容器的概念,將需要使用的對(duì)象放到容器中,這些對(duì)象稱為Spring的Bean,當(dāng)這些Bean對(duì)象被使用時(shí)可以直接從容器中取出,不用重新創(chuàng)建,由此解決了對(duì)象的冗余問(wèn)題,并且減少了開發(fā)人員的編碼量。1.1什么是SSM1.1.1Spring框架的興起Spring框架中Bean對(duì)象的流程Spring對(duì)象由用戶創(chuàng)建,然后放入Spring容器,之后,用戶可以隨時(shí)取用此對(duì)象1.1什么是SSM1.1.1Spring框架的興起//實(shí)體類publicclassStudent{Integerid;Integerscore;

publicvoidsetScore(Integerscore){this.score=score;}}//業(yè)務(wù)類publicclassStudentService{

publicStudentaddScore(){

Studentstudent=newStudent();student.setScore(4);returnstudent;}}//實(shí)體類@ComponentpublicclassStudent{Integerid;Integerscore;

publicvoidsetScore(Integerscore){this.score=score;}}//業(yè)務(wù)類publicclassStudentService{

@AutowiredStudentstudent;publicStudentaddScore(){student.setScore(4);returnstudent;}}傳統(tǒng)創(chuàng)建對(duì)象方式Spring獲取對(duì)象減少了類與類之間的耦合性、減輕了開發(fā)人員的編碼量,并且減少了對(duì)象的創(chuàng)建1.1什么是SSM1.1.2MyBatis框架概述MyBatis原是apache的一個(gè)開源項(xiàng)目iBatis,2010年6月這個(gè)項(xiàng)目由apachesoftwarefoundation遷移到了googlecode,隨著開發(fā)團(tuán)隊(duì)轉(zhuǎn)投GoogleCode旗下,ibatis3.x正式更名為Mybatis,代碼于2013年11月遷移到Github。iBATIS一詞來(lái)源于“internet”和“abatis”的組合,是一個(gè)基于Java的持久層框架。iBATIS提供的持久層框架包括SQLMaps和DataAccessObjects(DAO)。MyBatis框架發(fā)展史1.1什么是SSM1.1.2MyBatis框架概述MyBatis是一個(gè)優(yōu)秀的持久層框架,它對(duì)jdbc的操作數(shù)據(jù)庫(kù)的過(guò)程進(jìn)行封裝,使開發(fā)者只需要關(guān)注SQL本身,而不需要花費(fèi)精力去處理例如注冊(cè)驅(qū)動(dòng)、創(chuàng)建connection、創(chuàng)建statement、手動(dòng)設(shè)置參數(shù)、結(jié)果集檢索等jdbc繁雜的過(guò)程代碼。MyBatis在java和sql之間提供更靈活的映射方案,MyBatis將sql語(yǔ)句和方法實(shí)現(xiàn),直接寫到xml文件中,實(shí)現(xiàn)和java程序解耦,此外,MyBatis只負(fù)責(zé)sql,建庫(kù)建表的工作由程序員完成。MyBatis框架簡(jiǎn)述1.1什么是SSM1.1.2MyBatis框架概述MyBatis是當(dāng)前主流的Java持久層框架,因其且具有高度靈活性、可優(yōu)化性和易于維護(hù)等特點(diǎn),而被廣大互聯(lián)網(wǎng)廠商所青睞。MyBatis本質(zhì)是一個(gè)ORM框架,ORM框架的全名為(ObjectRelationalMapping)即對(duì)象關(guān)系映射,其主要作用是將數(shù)據(jù)庫(kù)數(shù)據(jù)映射到常用的Java對(duì)象。MyBatis在SSM中是數(shù)據(jù)傳輸層框架,專業(yè)術(shù)語(yǔ)稱之為持久層框架。MyBatis負(fù)責(zé)將數(shù)據(jù)庫(kù)中查詢的信息封裝成Java對(duì)象MyBatis框架特點(diǎn)1.1什么是SSM1.1.2MyBatis框架概述MyBatis框架的工作流程MyBatis負(fù)責(zé)將數(shù)據(jù)庫(kù)表中的查詢出的數(shù)據(jù)轉(zhuǎn)化為Java對(duì)象,然后提供給用戶使用1.1什么是SSM1.1.3SpringMVC核心思想SpringMVC框架是基于MVC模式,使用Java語(yǔ)言開發(fā)實(shí)現(xiàn)的一個(gè)輕量級(jí)Web框架。SpringMVC是Spring家族的一員,正因?yàn)檫@一點(diǎn),通過(guò)簡(jiǎn)單的配置,就能夠讓SpringMVC框架和Spring容器一起使用。SpringMVC框架是以請(qǐng)求為驅(qū)動(dòng),圍繞Servlet設(shè)計(jì),將請(qǐng)求發(fā)給控制器,然后通過(guò)模型對(duì)象,分派器來(lái)展示請(qǐng)求結(jié)果視圖。SpringMVC中的核心類是DispatcherServlet,由此可以看到它也是一個(gè)Servlet,頂層是實(shí)現(xiàn)的Servlet接口的。1.1什么是SSM1.1.3SpringMVC核心思想SpringMVC是目前企業(yè)級(jí)開發(fā)常用的MVC框架,專業(yè)術(shù)語(yǔ)稱MVC為“模型-視圖-控制器模式”。MVC框架是Model、View和Controller三個(gè)模塊的縮寫,它負(fù)責(zé)規(guī)劃整個(gè)項(xiàng)目的目錄結(jié)構(gòu)以及業(yè)務(wù)交互。SpringMVC在SSM框架中負(fù)責(zé)處理前端的請(qǐng)求并返回相應(yīng)的結(jié)果,其與Spring的集成度非常高,可以在SSM中表現(xiàn)出良好的復(fù)用性和擴(kuò)展性。SpringMVC特點(diǎn)1.1什么是SSM1.1.3SpringMVC核心思想不同于以前框架只提供接口,然后讓使用者自己根據(jù)接口寫實(shí)現(xiàn)類來(lái)實(shí)現(xiàn)功能,SpringMVC提供了一整套完善的組件,可以直接使用。使用SpringMVC框架提供這些工具非常簡(jiǎn)單,通過(guò)一些簡(jiǎn)單的注解就可以使用SpringMVC的絕大多數(shù)功能,不需要編寫繁瑣冗長(zhǎng)的代碼。SpringMVC以強(qiáng)大的Spring容器為基礎(chǔ),與Spring的親和度很高,不需要額外的配置就可以在Spring中使用。SpringMVC優(yōu)點(diǎn)1.1什么是SSM1.1.4SSM結(jié)構(gòu)分析SSM框架由Spring+SpringMVC+MyBatis組成,是標(biāo)準(zhǔn)的MVC設(shè)計(jì)模式,將整個(gè)系統(tǒng)劃分為顯示層,Controller層,Service層,DAO層四層,分別由各個(gè)框架進(jìn)行管理。SSM框架是Web企業(yè)級(jí)開發(fā)常用的框架,它可以在開發(fā)中輔助編程人員快速搭建一個(gè)完整的Web應(yīng)用項(xiàng)目。SSM概述1.1什么是SSM1.1.4SSM結(jié)構(gòu)分析SSM整體結(jié)構(gòu)可以拆分為三個(gè)部分,分別為MyBatis、SpringMVC和Spring。MyBatis框架負(fù)責(zé)和數(shù)據(jù)庫(kù)交互,SpringMVC負(fù)責(zé)與前端交互,Spring負(fù)責(zé)掌控整個(gè)系統(tǒng)的運(yùn)行。SSM分層結(jié)構(gòu)分析1.2SSM框架優(yōu)缺點(diǎn)SSH框架SSH框架的優(yōu)缺點(diǎn)1.2SSM框架優(yōu)缺點(diǎn)1.2.1SSH框架SSH框架是Struts+Spring+Hibernate三個(gè)企業(yè)級(jí)應(yīng)用框架的首字母縮寫。與SSM中的Spring+SpringMVC+MyBatis作比較,SSH與SSM的不同點(diǎn)在于Struts和Hibernate框架。SSH將Hibernate框架作為數(shù)據(jù)庫(kù)持久化層,類似于SSM中的MyBatis框架;將Struts框架作為控制層,類似于SSM中的SpringMVC框架。SSH與SSM均使用Spring來(lái)管理全局對(duì)象的流轉(zhuǎn)。1.2SSM框架優(yōu)缺點(diǎn)1.2.1SSM框架的優(yōu)缺點(diǎn)Spring框架的優(yōu)缺點(diǎn)通過(guò)spring的ioc特性,將對(duì)象之間的依賴關(guān)系交給spring控制,方便解耦,簡(jiǎn)化了開發(fā).通過(guò)spring的aop特性,很容易實(shí)現(xiàn)事務(wù),日志,權(quán)限的控制提供了對(duì)其他優(yōu)秀開源框架的集成支持低侵入式配置文件或者注解使終端程序邏輯不直觀配置文件增加開發(fā)和維護(hù)工作優(yōu)點(diǎn)缺點(diǎn)1.2SSM框架優(yōu)缺點(diǎn)1.2.1SSM框架的優(yōu)缺點(diǎn)MyBatis框架的優(yōu)缺點(diǎn)與jdbc相比,減少了50%以上的代碼量.簡(jiǎn)單的持久化框架,小巧簡(jiǎn)單易學(xué)sql代碼從程序代碼中徹底的分離出來(lái),可重用提供了xml標(biāo)簽,支持編寫動(dòng)態(tài)sql提供了映射標(biāo)簽支持,支持對(duì)象與數(shù)據(jù)庫(kù)的ORM字段關(guān)系映射sql語(yǔ)句編寫工程量大,熟練度要高數(shù)據(jù)庫(kù)移植性差優(yōu)點(diǎn)缺點(diǎn)1.2SSM框架優(yōu)缺點(diǎn)1.2.1SSM框架的優(yōu)缺點(diǎn)SpringMVC框架的優(yōu)缺點(diǎn)使用了mvc設(shè)計(jì)思想的輕量級(jí)web框架,對(duì)web層進(jìn)行解耦,使得我們開發(fā)更加的簡(jiǎn)潔.與Spring無(wú)縫銜接.靈活的數(shù)據(jù)驗(yàn)證,格式化,數(shù)據(jù)綁定機(jī)制優(yōu)點(diǎn)1.2SSM框架優(yōu)缺點(diǎn)1.2.1SSM框架的優(yōu)缺點(diǎn)MyBatis具有小巧、高效、簡(jiǎn)單和半自動(dòng)化等特點(diǎn)。Hibernate的特點(diǎn)是龐大,全自動(dòng)、復(fù)雜、間接和全自動(dòng)化等。MyBatis框架對(duì)SQL的生成較為自由,Hibernate框架對(duì)SQL的生成追求全自動(dòng)化。MyBatis具有自由書寫SQL、支持動(dòng)態(tài)SQL和支持存儲(chǔ)過(guò)程等優(yōu)點(diǎn),可以靈活定義SQL語(yǔ)句,滿足各種開發(fā)需求和性能優(yōu)化的需要。此外MyBatis框架的操作較為簡(jiǎn)單,入門相較Hibernate框架更容易Hibernate框架與MyBatis框架1.2SSM框架優(yōu)缺點(diǎn)1.2.1SSM框架的優(yōu)缺點(diǎn)SpringMVC具有簡(jiǎn)單,便捷,強(qiáng)大等特點(diǎn),Struts的特點(diǎn)是復(fù)雜,繁瑣。在性能方面,SpringMVC實(shí)現(xiàn)了低配置,而Struts2是類級(jí)別的攔截,每次請(qǐng)求對(duì)應(yīng)實(shí)例就要新建一個(gè)Action,加載所有的屬性值并注入,所以,SpringMVC開發(fā)效率和性能高于Struts2。在集成方面,SpringMVC集成了Ajax,使用方便,只需要一個(gè)注解即可完成返回值設(shè)置。此外,SpringMVC與Spring的契合度較高,可以直接調(diào)用Spring的相關(guān)方法,而Struts需要編寫額外的整合配置,因此,在開發(fā)方面選用SpringMVC框架。Struts框架與SpringMVC框架課后小結(jié)本章首先講解了SSM的基本概念,接下來(lái)通過(guò)SSM和SSH框架的對(duì)比,講解了SSM框架的優(yōu)缺點(diǎn)。通過(guò)本章內(nèi)容的學(xué)習(xí),讀者需要深入理解SSM中三個(gè)框架的概念。第2章Spring基礎(chǔ)Spring概述Spring的核心體現(xiàn)Spring示例理解Spring的概念和優(yōu)勢(shì)理解Spring的體系結(jié)構(gòu)理解Spring的核心容器掌握SpringBean的創(chuàng)建與獲取的方法2.1Spring概述Spring簡(jiǎn)介Spring優(yōu)勢(shì)Spring體系結(jié)構(gòu)2.1Spring概述2.1.1Spring簡(jiǎn)介Spring是用于JavaSE/EE應(yīng)用的一站式輕量級(jí)開源框架,它最為核心的理念是控制反轉(zhuǎn)(InversionofControl),簡(jiǎn)稱IoC,和面向切面編程(AspectOrientedProgramming),簡(jiǎn)稱AOP。其中IoC概念支撐著Spring對(duì)Bean的管理,而AOP技術(shù)對(duì)Spring中事務(wù)管理等功能起到關(guān)鍵作用。Spring提供了展示層、持久層以及事務(wù)管理等一站式的企業(yè)級(jí)應(yīng)用技術(shù),除此之外,Spring已經(jīng)融入JavaEE開發(fā)的各個(gè)領(lǐng)域,它可以整合Java生態(tài)圈中眾多的第三方框架和類庫(kù),為企業(yè)開發(fā)提供全面的功能支持。2.1Spring概述2.1.2Spring優(yōu)勢(shì)通過(guò)Spring的核心容器,Spring框架可以管理對(duì)象的生命周期,控制對(duì)象之間的依賴關(guān)系,以此來(lái)降低對(duì)象與對(duì)象的耦合度,使系統(tǒng)易于維護(hù)。1.降低耦合度,方便開發(fā)Spring可以通過(guò)AOP對(duì)程序進(jìn)行權(quán)限攔截、安全監(jiān)控和事務(wù)管理等操作,使得各部分業(yè)務(wù)邏輯之間的耦合度降低,提高程序的可重用性。2.支持AOP編程2.1Spring概述2.1.2Spring優(yōu)勢(shì)事務(wù)分為兩種,一種是編程式事務(wù),另一種是聲明式事務(wù)。編程式事務(wù)需要手動(dòng)控制事務(wù)的開始與結(jié)束,而聲明式事務(wù)建立在AOP之上,只需制定規(guī)則即可自動(dòng)進(jìn)行事務(wù)管理,無(wú)需手動(dòng)控制。Spring支持聲明式事務(wù),可以直接通過(guò)Spring配置文件管理數(shù)據(jù)庫(kù)事務(wù),提升開發(fā)效率。3.支持聲明式事務(wù)Spring集成了JUnit,開發(fā)人員可以通過(guò)JUnit進(jìn)行單元測(cè)試。4.方便程序測(cè)試2.1Spring概述2.1.2Spring優(yōu)勢(shì)Spring提供了廣闊的平臺(tái),它不排斥各種優(yōu)秀的開源框架,內(nèi)部提供了對(duì)各種優(yōu)秀框架(如MyBatis、Hibernate、Quartz等)的直接支持。5.方便集成各種優(yōu)秀框架Spring封裝了JavaEE中使用難度較大的API,經(jīng)過(guò)封裝,這些API更容易被開發(fā)人員理解。6.降低JavaEEAPI的使用難度2.1Spring概述2.1.3Spring體系結(jié)構(gòu)Spring框架采用分層架構(gòu),由數(shù)據(jù)訪問(wèn)、Web交互層、AOP框架層、核心容器和測(cè)試模塊組成。數(shù)據(jù)訪問(wèn)層主要是對(duì)數(shù)據(jù)流轉(zhuǎn)的控制操作。Web交互層功能的實(shí)現(xiàn)基于Spring核心容器之上,它提供了Web應(yīng)用的各種工具類。AOP框架允許開發(fā)者自定義方法攔截器和切入點(diǎn),為面向切面編程提供多種實(shí)現(xiàn)方法。數(shù)據(jù)訪問(wèn)層Web交互層AOP框架,消息核心容器測(cè)試模塊Spring體系結(jié)構(gòu)JDBCORMTransactionWebServlet2.1Spring概述2.1.3Spring體系結(jié)構(gòu)數(shù)據(jù)訪問(wèn)層數(shù)據(jù)訪問(wèn)及集成JDBCORMTransactionOXMJMSJDBC模塊全稱是Java數(shù)據(jù)庫(kù)連接(JavaDatabaseConnectivity),JDBC模塊利用JDBC抽象層來(lái)間接控制所有的數(shù)據(jù)庫(kù)連接代碼,大大降低了編碼的復(fù)雜性。

ORM模塊又稱對(duì)象關(guān)系映射模塊,這些主流的對(duì)象關(guān)系映射框架包括MyBatis、Hibernate和JDO等,除此之外,該模塊可將對(duì)象關(guān)系映射框架與Spring提供的數(shù)據(jù)庫(kù)連接模塊結(jié)合使用。OXM模塊與ORM框架類似,不過(guò)OXM提供的是XML和對(duì)象之間的映射,OXM是“ObjectXMLMapper”的縮寫,全稱為XML對(duì)象關(guān)系映射。JMS模塊是“JavaMessageService”的縮寫,全稱是Java消息傳遞服務(wù),在Spring的4.1版本之后,支持與Spring-message模塊的集成。Transaction模塊的功能是事務(wù)管理,它主要負(fù)責(zé)管理所有POJO類,同時(shí)處理聲明式和編程式事務(wù)。2.1Spring概述2.1.3Spring體系結(jié)構(gòu)Web交互層Web交互層WebServletWebSocketProtletWeb模塊提供了基本的面向Web的集成功能,如文件上傳,Servlet監(jiān)聽器,面向Web的應(yīng)用程序上下文等。

Servlet模塊也稱為Spring-webMVC模塊,包含Spring的模型、視圖、控制器以及Web應(yīng)用程序的RESTWeb服務(wù)實(shí)現(xiàn)。WebSocket模塊是Spring4版本的新增模塊,用于適配不同的WebSocket引擎,并能夠全面支持WebSocket。Protlet模塊提供了一個(gè)在Protlet環(huán)境中使用的MVC實(shí)現(xiàn),功能上和Servlet模塊類似。2.1Spring概述2.1.3Spring體系結(jié)構(gòu)AOP框架層AOP框架層AOPInstrumentaionAspectAOP模塊譯為面向切面編程,此模塊的實(shí)現(xiàn)允許開發(fā)者自定義方法攔截器和切入點(diǎn)。

Aspect模塊主要用于集成AspectJ,Aspect是一個(gè)功能強(qiáng)大且成熟的AOP框架,為面向切面編程提供多種實(shí)現(xiàn)方法。Instrumentation模塊提供了類植入的支持和類加載器的實(shí)現(xiàn),通常在特定的服務(wù)器使用。2.1Spring概述2.1.3Spring體系結(jié)構(gòu)核心容器層核心容器層BeansContextCoreBeans和Core模塊是Spring中較為核心的模塊,其提供了IoC和DI思想的實(shí)現(xiàn),規(guī)定了創(chuàng)建、配置和管理Bean的方式。

Context模塊在Beans和Core模塊的基礎(chǔ)之上提供了框架式Bean的訪問(wèn)方式,通過(guò)ApplicationContext接口可以獲取上下文信息。SpEL模塊提供了一個(gè)強(qiáng)大的表達(dá)式語(yǔ)言,該語(yǔ)言用于在Spring運(yùn)行時(shí)查詢和操作對(duì)象。SpEL2.2Spring的核心體現(xiàn)IoC與DISpring容器Spring中的Bean2.2Spring的核心體現(xiàn)2.2.1IoC與DIIoC為InversionofControl(控制反轉(zhuǎn))的縮寫,是一個(gè)設(shè)計(jì)思想,指將對(duì)象的控制權(quán)交由容器控制。Spring采用這種思想后,開發(fā)人員無(wú)需編寫管理依賴關(guān)系的代碼,由Spring容器根據(jù)配置自動(dòng)完成。DI為DependencyInjection(依賴注入)的縮寫,是IoC思想的一種體現(xiàn),即通過(guò)注入方式來(lái)避免調(diào)用類對(duì)其他類的強(qiáng)依賴關(guān)系,方便開發(fā),減少代碼冗余。配置元數(shù)據(jù)JavaBeanIoC容器Java應(yīng)用控制反轉(zhuǎn)與依賴注入2.2Spring的核心體現(xiàn)2.2.1IoC與DI以下代碼是一個(gè)普通的學(xué)生類,每個(gè)學(xué)生包含了一個(gè)電腦。在實(shí)例化此學(xué)生類時(shí),需要?jiǎng)?chuàng)建Student類和Computer類,并將Computer類賦值給Student類。此時(shí)類與類之間具有依賴關(guān)系。publicclassStudent{Computercomputer;

publicvoidsetComputer(Computercomputer){puter=computer;}}2.2Spring的核心體現(xiàn)2.2.1IoC與DI以下代碼展示的是一個(gè)被Spring管理的學(xué)生Bean對(duì)象(添加@Component注解即可將此類放入容器),當(dāng)需要此類的實(shí)例化時(shí),從容器中取用即可,無(wú)需其他操作。在此過(guò)程中,Spring容器會(huì)掃描到computer屬性上面的@Autowired注解,檢索容器中是否有Computer類,此時(shí)將Computer類加上@Component注解,Spring將從容器中找到Computer類把將其自動(dòng)注入Student類的computer屬性,無(wú)需手動(dòng)賦值。@ComponentpublicclassStudent{@AutowiredComputercomputer;}2.2Spring的核心體現(xiàn)2.2.2Spring容器Spring容器是根據(jù)IoC思想來(lái)構(gòu)建的,因此,Spring容器又稱為SpringIoC容器。Spring容器的概念有多種實(shí)現(xiàn)接口,其中,重要的實(shí)現(xiàn)接口是BeanFactory和ApplicationContext。接下來(lái),詳細(xì)介紹Spring容器在代碼中的體現(xiàn)。2.2Spring的核心體現(xiàn)2.2.2Spring容器BeanFactory是一個(gè)接口,它代表Spring的抽象容器,其中封裝了許多與Bean有關(guān)的抽象方法,其中常用的有獲取Bean信息的方法和判斷此Bean是否單例的方法。BeanFactorypublicinterfaceBeanFactory{//獲取此BeanObjectgetBean(Stringvar1)throwsBeansException;//判斷容器中是否含有此BeanbooleancontainsBean(Stringvar1);//判斷此Bean是否是單例booleanisSingleton(Stringvar1);//判斷此Bean是否是多例booleanisPrototype(Stringvar1);//獲取此Bean的類型@NullableClass<?>getType(Stringvar1);}2.2Spring的核心體現(xiàn)2.2.2Spring容器ApplicationContext是BeanFactory的子接口,直譯又稱作應(yīng)用上下文,是重要的Spring應(yīng)用容器,它包含了BeanFactory中所有的功能,并且額外支持國(guó)際化、資源訪問(wèn),事件傳播等,是開發(fā)中經(jīng)常涉及的接口。ApplicationContext的子類ClassPathXmlApplicationContext是開發(fā)中常用的工具類,它可以通過(guò)指定一個(gè)配置文件來(lái)完成容器的創(chuàng)建,在配置文件中通產(chǎn)含有配置完成的Bean對(duì)象。容器創(chuàng)建完成后,其中的Bean對(duì)象將會(huì)被創(chuàng)建完畢,開發(fā)人員可以根據(jù)Bean的名稱獲取容器中的Bean對(duì)象、Bean類型等其他信息。ApplicationContextClassPathXmlApplicationContextclassPathXmlApplicationContext=newClassPathXmlApplicationContext("配置文件的類路徑");2.2Spring的核心體現(xiàn)2.2.2Spring容器在日常開發(fā)中,使用Spring容器時(shí)選用ApplicationContext的子類ClassPathXmlApplicationContext來(lái)使用。

classPathXmlApplicationContext=newClassPathXmlApplicationContext("配置文件的類路徑");classPathXmlApplicationContext

是ApplicationContext的子類,擁有ApplicationContext容器所有的方法,此外還擴(kuò)展了對(duì)配置文件的解析。在開發(fā)中可以更方便的使用。

在使用classPathXmlApplicationContext

時(shí),將配置文件的類路徑傳入其中,容器就可以自動(dòng)解析配置文件中的配置,將Bean對(duì)象加入到Spring容器中。2.2Spring的核心體現(xiàn)2.2.3Spring中的BeanSpring中的Bean對(duì)象就是被Spring管理的對(duì)象。例如,在此創(chuàng)建Student學(xué)生對(duì)象,此對(duì)象一旦被Spring管理,就將其稱為Bean對(duì)象。通常Bean對(duì)象在容器加載時(shí)就會(huì)被加入容器,容器銷毀時(shí)才會(huì)被銷毀。在整個(gè)容器的運(yùn)行過(guò)程中,一般不會(huì)再向容器中添加Bean對(duì)象,在容器在加載完成后,開發(fā)人員僅可在容器運(yùn)行期間對(duì)Bean對(duì)象進(jìn)行取用、賦值和查看。2.3Spring示例Spring依賴下載Web環(huán)境搭建Bean的添加與獲取2.3Spring示例2.3.1Spring依賴下載本書示例采用Spring5.0.8版本,在使用前,需要下載相關(guān)依賴。首先訪問(wèn)官方的SpringJAR包下載地址。2.3Spring示例2.3.1Spring依賴下載然后訪問(wèn)官方CommonsLogging包的下載地址,下載commons-logging-1.2-bin.zip包。2.3Spring示例2.3.2Web環(huán)境搭建Spring的運(yùn)行不需要Web環(huán)境的支持,但是使用Spring來(lái)做Web開發(fā)時(shí),需要配置相應(yīng)的Web環(huán)境,因此,首先搭建Web環(huán)境,在新建的項(xiàng)目中添加Web環(huán)境支持。首先打開IDEA,單擊NewProject創(chuàng)建項(xiàng)目,在彈出的新建框中選中Java項(xiàng)目,隨后單擊Next。1.創(chuàng)建項(xiàng)目2.3Spring示例2.3.2Web環(huán)境搭建進(jìn)入下一步之后,再次單擊Next1.創(chuàng)建項(xiàng)目2.3Spring示例2.3.2Web環(huán)境搭建最后一步,填寫此項(xiàng)目的項(xiàng)目名及目錄,填寫完畢后單擊Finish。1.創(chuàng)建項(xiàng)目2.3Spring示例2.3.2Web環(huán)境搭建項(xiàng)目創(chuàng)建完成以后,右鍵單擊項(xiàng)目,在彈出的快捷菜單中添加框架支持2.為項(xiàng)目添加Web框架2.3Spring示例2.3.2Web環(huán)境搭建在彈出框架支持框后,勾選WebApplication框架以及Createweb.xml,單擊OK按鈕,完成添加。2.為項(xiàng)目添加Web框架2.3Spring示例2.3.2Web環(huán)境搭建右鍵點(diǎn)擊WEB-INF文件夾,在彈出的快捷菜單中選擇New→Directory,創(chuàng)建lib文件夾。3.添加依賴包2.3Spring示例2.3.2Web環(huán)境搭建將之前下載完成的Spring包中l(wèi)ib文件夾下的所有JAR包,commons-logging包和下載的AOP注解依賴包復(fù)制到lib文件夾下3.添加依賴包2.3Spring示例2.3.2Web環(huán)境搭建選中所有的JAR包,右鍵單擊之后,彈出快捷菜單,單擊AddasLibrary,將JAR包添加到Library。3.添加依賴包2.3Spring示例2.3.2Web環(huán)境搭建右鍵單擊File后,在彈出的快捷菜單中單擊ProjectStructure,打開項(xiàng)目結(jié)構(gòu)。3.添加依賴包2.3Spring示例2.3.2Web環(huán)境搭建在項(xiàng)目結(jié)構(gòu)面板中單擊Artifacts,在中間出現(xiàn)的頁(yè)面中,選中發(fā)布包,隨后在右側(cè)雙擊commons-logging包,將其添加到現(xiàn)有項(xiàng)目中,最后單擊apply按鈕將此包應(yīng)用到項(xiàng)目中。3.添加依賴包2.3Spring示例2.3.2Web環(huán)境搭建單擊操作欄中的下拉按鈕,單擊EditConfigurations,進(jìn)入配制頁(yè)面4.配置tomcat2.3Spring示例2.3.2Web環(huán)境搭建單擊頁(yè)面左上角的“”,在彈出的快捷菜單中選擇TomcatServer下的Local,在右側(cè)出現(xiàn)的面板中配置Tomcat,單擊Configure,并選擇本地安裝的Tomcat后,單擊Deployment,即可進(jìn)入war包發(fā)布頁(yè)面。4.配置tomcat2.3Spring示例2.3.2Web環(huán)境搭建進(jìn)入war包配置界面后,單擊加號(hào),在下拉框中單擊Artifact,將war包添加進(jìn)Tomcat,隨后單擊Apply。至此,Web環(huán)境搭建完畢4.配置tomcat2.3Spring示例2.3.3Bean的添加與獲取Bean對(duì)象的添加需要?jiǎng)?chuàng)建一個(gè)Student對(duì)象,然后在Spring配置文件中配置Bean元素,最后啟動(dòng)Spring容器即可將Bean對(duì)象添加到容器中。Bean對(duì)象的獲取需要通過(guò)ClassPathXmlApplicationContext容器的getBean()方法,將Bean對(duì)象的id作為參數(shù),來(lái)獲取相應(yīng)的Bean對(duì)象。2.3Spring示例2.3.3Bean的添加與獲取使用ClassPathXmlApplicationContext的getBean方法可以獲取到容器中的Bean對(duì)象。Bean的添加Bean的獲取在Spring的配置文件中通過(guò)<bean>標(biāo)簽配置Bean對(duì)象,在容器啟動(dòng)時(shí),此配置會(huì)將Bean標(biāo)簽中的配置轉(zhuǎn)化為Bean對(duì)象,并添加進(jìn)Spring容器2.3Spring示例2.3.3Bean的添加與獲取將一個(gè)類裝入Spring容器,需要?jiǎng)?chuàng)建此類,并將此類寫入配置文件。在此舉例運(yùn)用。首先在工程的src目錄下創(chuàng)建一個(gè)Student類(省略set,get方法)。創(chuàng)建BeanpublicclassStudent{Stringname="張三";intage=18;}2.3Spring示例2.3.3Bean的添加與獲取單擊src,在彈出的快捷菜單中單擊New→XMLconfigurationFile→SpringConfig創(chuàng)建Spring配置文件,命名為applicationContext。編寫配置文件2.3Spring示例2.3.3Bean的添加與獲取創(chuàng)建完畢后,打開目錄結(jié)構(gòu),隨后單擊Modules,在中間面板中選擇springTest中的Spring,之后單擊右側(cè)面板的“+”,在彈出面板中勾選新建的applicationContext文件,單擊OK按鈕,再單擊Apply按鈕,完成配置操作。編寫配置文件2.3Spring示例2.3.3Bean的添加與獲取編寫配置文件,其中<bean>元素為指定將一個(gè)對(duì)象注入容器,id為此Bean對(duì)象的別名,此別名將會(huì)在獲取此Bean時(shí)用到,class為指定需要裝配對(duì)象的路徑,編寫配置文件<?xmlversion="1.0"encoding="UTF-8"?><beansxmlns="/schema/beans"xmlns:xsi="/2001/XMLSchema-instance"xsi:schemaLocation="/schema/beans/schema/beans/spring-beans.xsd"><!--id為裝入Spring容器時(shí)此對(duì)象的別名class為對(duì)象相對(duì)于src的路徑--><beanid="student"class="Student"></bean></beans>2.3Spring示例2.3.3Bean的添加與獲取在src下創(chuàng)建一個(gè)Test類,利用ApplicationContext容器的子類來(lái)加載配置文件,此配置文件路徑為相對(duì)于src的路徑容器加載配置文件publicclassTest{publicstaticvoidmain(String[]args){ClassPathXmlApplicationContextclassPathXmlApplicationContext=newClassPathXmlApplicationContext("applicationContext.xml");Objectstudent=classPathXmlApplicationContext.getBean("student");System.out.println(student);}}2.3Spring示例2.3.3Bean的添加與獲取使用getBean()方法獲取classPathXmlApplicationContext容器中名為student的Bean對(duì)象容器加載配置文件課后小結(jié)本章首先講解了IoC容器的概念與Spring中Bean對(duì)象的概念,接下來(lái)通過(guò)示例講解了Bean對(duì)象的添加與獲取。通過(guò)本章的學(xué)習(xí),讀者需要掌握向Spring容器中添加Bean對(duì)象的方法。第3章Spring中Bean的注入

Bean的注入方式Bean的復(fù)雜注入Bean的作用域利用注解管理Bean理解Spring中Bean的作用域理解Bean的生命周期掌握Bean的注入方法掌握Bean的注解管理3.1Bean的注入方式構(gòu)造器注入屬性注入3.1Bean的注入方式Bean的注入即構(gòu)建帶有屬性值的Bean對(duì)象,專業(yè)術(shù)語(yǔ)也稱之為Bean的實(shí)例化。Bean的注入一般分為三種,分別為構(gòu)造器注入、屬性注入和接口注入。其中,接口注入方式不要求掌握。屬性注入需要重點(diǎn)掌握。3.1Bean的注入方式3.1.1構(gòu)造器注入構(gòu)造器注入指的是在被注入的類中聲明一個(gè)構(gòu)造方法,此構(gòu)造方法可以是有參或無(wú)參的。Spring在讀取配置信息后,會(huì)通過(guò)反射方式調(diào)用構(gòu)造方法,創(chuàng)建Bean對(duì)象。開發(fā)中,使用<constructor-arg>元素配置構(gòu)造函數(shù),然后在配置文件中傳入該類的構(gòu)造器的值,之后Spring就會(huì)將此類以配置文件中的參數(shù)實(shí)例化并加入到容器中3.1Bean的注入方式3.1.2屬性注入屬性注入是開發(fā)中常用的注入手段,此種方式通過(guò)Bean的set()方法直接設(shè)置屬性值,具體步驟與構(gòu)造器注入類似。不同的是,屬性注入使用的是<property>元素來(lái)設(shè)置屬性的值。3.1Bean的注入方式測(cè)試構(gòu)造器與屬性注入的結(jié)果當(dāng)屬性注入或構(gòu)造器注入完成時(shí),容器啟動(dòng)時(shí)會(huì)將對(duì)應(yīng)的Bean構(gòu)造完畢并放入容器中,此時(shí)需要使用getBean()方法來(lái)從容器中獲取相應(yīng)的Bean對(duì)象3.2Bean的復(fù)雜注入Bean的屬性集合與對(duì)象的注入Bean之間屬性的傳遞3.2Bean的復(fù)雜注入3.2.1Bean的屬性Bean對(duì)象關(guān)于自身的詳細(xì)配置在工作中常用的屬性有class、id和scope屬性。通過(guò)在<bean>標(biāo)簽中的配置,可以控制Bean對(duì)象的行為,監(jiān)控Bean對(duì)象的生命周期等。3.2Bean的復(fù)雜注入3.2.2集合與對(duì)象的注入首先創(chuàng)建實(shí)體類對(duì)象。publicclassTeacher{MyClassmyClass;List<String>position;List<Student>students;Map<String,Integer>score;String[]vacation;}publicclassStudent{intage;Stringname;}publicclassMyClass{Stringname="三班";}班級(jí)老師學(xué)生3.2Bean的復(fù)雜注入3.2.2集合與對(duì)象的注入在Spring配置文件中,添加實(shí)體類Bean的相關(guān)配置。當(dāng)注入集合和對(duì)象時(shí),需要使用<list>元素和<ref>元素,在<list>元素當(dāng)中,可以使用<value>元素來(lái)填充此List集合的內(nèi)容。在<ref>元素中可以使用bean屬性來(lái)指向一個(gè)Bean對(duì)象,從而完成對(duì)象屬性的賦值。在<property>元素中,添加<ref>元素,在<ref>元素的bean屬性中寫上需要引入的Bean對(duì)象的id。在<property>元素中,添加<list>元素,在<list>元素中添加<value>元素,隨后寫上相應(yīng)值,<value>元素中的內(nèi)容將作為值加入到List集合中。3.2Bean的復(fù)雜注入3.2.3Bean之間屬性的傳遞Bean對(duì)象之間可以進(jìn)行屬性傳遞,即使用表達(dá)式“#{}”,來(lái)取用Bean中相關(guān)屬性的值。3.3Bean的作用域作用域的種類singleton與prototype作用域3.3Bean的作用域3.3.1作用域的種類Bean的作用域指的是此Bean相對(duì)于其他Bean的可見范圍,通俗的來(lái)講,Bean的作用域指的是一個(gè)范圍,在這個(gè)范圍內(nèi)內(nèi)取到的Bean都是相同的,如果出了此范圍,獲取到的Bean就是不同的。用戶1用戶2用戶在和此Bean相同的作用域下時(shí),每次獲取的此Bean對(duì)象都是相同的用戶在和此Bean不同的作用域下時(shí),每次獲取的此Bean對(duì)象都是不同的3.3Bean的作用域3.3.1作用域的種類Spring中Bean的作用域有7種,分別為singleton、prototype、request、session、globalSession、application和websocket,接下來(lái)將以最為常用的singleton、prototype作用域作為示例講解。3.3Bean的作用域3.3.2singleton與prototype作用域在SpringBean的作用域當(dāng)中,最為常用的作用域是singleton和prototype.當(dāng)Bean元素被設(shè)置為singleton作用域時(shí),此Bean的每次獲取都將獲取到同一個(gè)對(duì)象。當(dāng)Bean元素被設(shè)置為prototype作用域時(shí),此Bean的每次獲取都將獲取到不同的對(duì)象。當(dāng)設(shè)置Bean對(duì)象的作用域時(shí),需要在配置文件的bean標(biāo)簽中添加scope屬性3.3Bean的作用域3.3.2singleton與prototype作用域測(cè)試singleton與prototype作用域publicstaticvoidmain(String[]args){ClassPathXmlApplicationContextcontext=new

ClassPathXmlApplicationContext("applicationContext.xml");ObjectmyClass1=context.getBean("myClass");ObjectmyClass2=context.getBean("myClass");System.out.println(myClass1);System.out.println(myClass2);}singleton作用域prototype作用域3.4利用注解管理BeanBean相關(guān)的注解注解的應(yīng)用3.4利用注解管理Bean利用配置文件注入Bean的方法,這種做法不宜整理和維護(hù)。本節(jié)講解利用注解注入Bean的方式,開發(fā)人員只需填寫對(duì)應(yīng)的注解即可實(shí)現(xiàn)屬性的注入。此外,本節(jié)還介紹了包掃描組件,可以實(shí)現(xiàn)Bean的自動(dòng)裝配。3.4利用注解管理Bean3.4.1Bean相關(guān)的注解與Bean相關(guān)的注解有很多,這些注解負(fù)責(zé)管理Bean的相關(guān)功能,在開發(fā)中起到重要作用。在開發(fā)中常用的Bean注解分別為@Component、@Resource、@Autowired、@Value、@Scope、和@Qualifire注解。3.4利用注解管理Bean3.4.2

注解的應(yīng)用(1)類上方@Component注解的作用為將此對(duì)象加入到容器中,括號(hào)中的value屬性代表此Bean的名稱。此外,value字段為默認(rèn)字段,可以像Book類的@Component注解一樣省略掉。(2)age與name屬性上的是@Value注解,此注解將括號(hào)中的值注入到此屬性中。使用注解配置Bean對(duì)象后,不需要再使用Spring配置文件來(lái)配置3.4利用注解管理Bean3.4.2

注解的應(yīng)用(3)在@Component注解下方為@Scope注解,此注解規(guī)定了Student類在容器中的作用域,可選值為表3.2中的7個(gè)屬性。(4)Student類中book屬性的上方為@Resource注解,此注解搜索容器中的Bean注入到此屬性中。搜索過(guò)程為,先根據(jù)名稱搜索,若容器中沒(méi)有對(duì)應(yīng)名稱,則改為根據(jù)類型搜索。在@Resource注解中有name屬性,若指定此屬性,則直接按照名稱搜索。在此例中,先在容器中搜索名稱為book的Bean(Book類在注入容器中時(shí),名稱為myBook),未能找到,因此采用類型注入,搜尋容器中類型為Book的類,然后注入。3.4利用注解管理Bean3.4.2

注解的應(yīng)用(5)Student類中book1屬性的上方為@Autowired注解,此注解同樣將容器中的Book實(shí)體注入到此屬性中。與@Resource注解不同的是,此注解根據(jù)類型注入,若無(wú)對(duì)應(yīng)類型,則直接報(bào)錯(cuò),如果有多個(gè)此類型的Bean,同樣報(bào)錯(cuò)。在多個(gè)同類型Bean的情況下,需要@Qualifier注解指定某種類型,此注解默認(rèn)的value值為搜索的Bean名稱,Spring會(huì)根據(jù)此名稱搜索Bean來(lái)注入。使用注解配置Bean對(duì)象后,不需要再使用Spring配置文件來(lái)配置3.4利用注解管理Bean3.4.2

注解的應(yīng)用將注解配置完畢以后,需要讓Spring掃描到com包下的所有類,使這些注解生效。如下列代碼所示,配置applicationContext文件,加上包掃描注解context:component-scan,將被掃描的包填入即可,base-package是相對(duì)于src的包路徑。<?xmlversion="1.0"encoding="UTF-8"?><beansxmlns="/schema/beans"xmlns:xsi="/2001/XMLSchema-instance"xmlns:context="/schema/context"xsi:schemaLocation="/schema/beans/schema/beans/spring-beans.xsd/schema/context/schema/context/spring-context.xsd"><!--包掃描注解-->

<context:component-scanbase-package="com"></context:component-scan></beans>3.5Bean的生命周期Bean的生命周期主要是Bean對(duì)象由創(chuàng)建、初始化到銷毀的過(guò)程。首先Bean對(duì)象經(jīng)過(guò)Bean的實(shí)例化創(chuàng)建Bean對(duì)象,隨后向此Bean對(duì)象中添加屬性,最后進(jìn)行Bean對(duì)象的初始化工作,初始化完畢后,進(jìn)入正常的使用狀態(tài),直到被銷毀。在Bean的實(shí)例化階段,開發(fā)人員可以實(shí)現(xiàn)InstatiationAwareBeanPostProcessor接口,覆蓋其中的方法來(lái)進(jìn)行Bean實(shí)例化階段的相關(guān)工作。在Bean的屬性注入階段,開發(fā)人員可以實(shí)現(xiàn)相應(yīng)的Aware接口來(lái)對(duì)注入階段進(jìn)行控制。在Bean的初始化階段,開發(fā)人員可以實(shí)現(xiàn)BeanPostProcess接口,覆蓋其中的方法來(lái)控制Bean的初始化階段。同時(shí)可以為Bean對(duì)象指定相應(yīng)的Init-method方法,在Bean的初始化階段進(jìn)行相關(guān)工作。3.5Bean的生命周期Bean詳細(xì)的生命周期如右圖所示。3.5Bean的生命周期為了加深對(duì)Bean生命周期的理解,在此通過(guò)初始化和銷毀方法來(lái)對(duì)Bean的生命周期進(jìn)行干涉。首先使用注解方式。創(chuàng)建Student對(duì)象。通過(guò)@PostConstruct注解與@PreDestroy注解來(lái)標(biāo)注初始化方法和銷毀方法。在容器啟動(dòng)時(shí),初始化方法將會(huì)被執(zhí)行,在容器銷毀時(shí),銷毀方法將會(huì)被執(zhí)行。注解方式@Component(value="myStudent")publicclassStudent{

@PostConstructpublicvoidinit(){System.out.println("初始化");}@PreDestroypublicvoiddestroy(){System.out.println("銷毀");}}3.5Bean的生命周期在Spring配置文件當(dāng)中,配置init-method和destroy-method屬性,以此來(lái)指定某個(gè)方法為初始化方法和銷毀方法。配置文件方式<?xmlversion="1.0"encoding="UTF-8"?><beansxmlns="/schema/beans"xmlns:xsi="/2001/XMLSchema-instance"xmlns:context="/schema/context"xsi:schemaLocation="/schema/beans/schema/beans/spring-beans.xsd/schema/context/schema/context/spring-context.xsd">

<beanid="student"class="com.Student"init-method="init"destroy-method="destroy"></bean></beans>本章小結(jié)本章首先介紹了Bean的構(gòu)造器注入和屬性注入,接下來(lái)詳細(xì)的介紹了復(fù)雜注入中的集合注入和對(duì)象注入,之后講解了Bean的各種作用域和Bean的相關(guān)注解,最后講述了SpringBean的生命周期。第4章Spring中的AOPAOP簡(jiǎn)介Spring中AOP的實(shí)現(xiàn)方式AOP中切面的優(yōu)先級(jí)AOP的實(shí)現(xiàn)原理理解Spring中AOP的概念理解AOP的實(shí)現(xiàn)原理與實(shí)現(xiàn)方式掌握AOP的基本操作掌握AOP配置的優(yōu)先級(jí)4.1AOP簡(jiǎn)介AOP基本概念A(yù)OP中的核心概念4.1AOP簡(jiǎn)介4.1.1AOP基本概念與OOP面向?qū)ο蟮乃枷腩愃?,AOP指的是將重復(fù)加在業(yè)務(wù)前后的代碼抽取,通過(guò)切面方式應(yīng)用在方法上。首先創(chuàng)建一個(gè)BookHandler類,此次示例需要在addBook方法之前將此操作記錄到日志,并且在添加完畢后,將添加結(jié)果也記錄到日志里。packagecom;/*圖書處理類*/publicclassBookHandler{

publicvoidaddBook(Bookbook){/*添加Book操作*/System.out.println("添加book");}}4.1AOP簡(jiǎn)介4.1.1AOP基本概念首先以非AOP的方式完成日志記錄的需求,加粗的代碼為業(yè)務(wù)代碼,此業(yè)務(wù)代碼在實(shí)際開發(fā)中非常復(fù)雜,在業(yè)務(wù)代碼前后加入額外代碼來(lái)管理日志,會(huì)使得代碼更加臃腫。除此之外,在原有的業(yè)務(wù)類中附加代碼,侵入性過(guò)強(qiáng),且不易維護(hù)。在實(shí)際開發(fā)中,需要日志輸出的業(yè)務(wù)模塊很多,此種日志管理的方式復(fù)用性較差,因此,一般不采用此種方式處理日志。packagecom;/*圖書處理類*/@ComponentpublicclassBookHandler{publicvoidaddBook(Bookbook){/*添加發(fā)送日志*/System.out.println("開始添加");try{/*添加Book操作*/

System.out.println("添加book");}catch(Exceptione){/*添加失敗日志*/System.out.println("添加失敗");}/*添加成功日志*/System.out.println("添加成功");}

}4.1AOP簡(jiǎn)介4.1.1AOP基本概念接下來(lái)使用AOP方式進(jìn)行日志處理,創(chuàng)建AOP切面類,在此類中配置切面的相關(guān)信息,@Before注解表示在方法執(zhí)行前執(zhí)行,@Before注解的參數(shù)中指定了哪些方法,此處配置指向需要被日志切面處理的方法。同理@AfterReturning表示在方法執(zhí)行后執(zhí)行。@Component@AspectpublicclassLogAopAspect{/*在切點(diǎn)之前執(zhí)行*/

@Before("execution(*com.*Handler.add*(..))")publicvoiddealAddLog(JoinPointjoinPoint){/*記錄日志*/System.out.println("開始添加");}/*在切點(diǎn)返回之前執(zhí)行*/

@AfterReturning("execution(*com.*Handler.add*(..))")publicvoiddealAfterReturnAddLog(JoinPointjoinPoint){/*記錄日志*/System.out.println("添加成功");}}4.1AOP簡(jiǎn)介4.1.1AOP基本概念之后創(chuàng)建配置文件,。在Spring配置文件中添加<aop:aspectj-autoproxy/>代碼激活A(yù)OP相關(guān)注解。<?xmlversion="1.0"encoding="UTF-8"?><beansxmlns="/schema/beans"xmlns:xsi="/2001/XMLSchema-instance"xmlns:context="/schema/context"xmlns:aop="/schema/aop"xsi:schemaLocation="/schema/beans/schema/beans/spring-beans.xsd/schema/context/schema/context/spring-context.xsd/schema/aop/schema/aop/spring-aop-4.3.xsd">

<context:component-scanbase-package="com"></context:component-scan>

<aop:aspectj-autoproxy/></beans>4.1AOP簡(jiǎn)介4.1.1AOP基本概念創(chuàng)建配置類,調(diào)用書籍方法,測(cè)試輸出。從圖可以看出,當(dāng)調(diào)用書籍類的addBook()方法后,日志完成了自動(dòng)記錄。此種方法對(duì)代碼的侵入性較小,適合傳統(tǒng)企業(yè)級(jí)開發(fā)使用。publicclassTest{publicstaticvoidmain(String[]args){ApplicationContextapplicationContext=newClassPathXmlApplicationContext("applicationContext.xml");BookHandlerbookHandler=(BookHandler)applicationContext.getBean("bookHandler");

bookHandler.addBook(newBook());}}4.1AOP簡(jiǎn)介4.1.2AOP中的核心概念在AOP中有很多核心概念,常用的核心概念有連接點(diǎn)、通知、切點(diǎn)、目標(biāo)對(duì)象、切面和織入。接下來(lái),詳細(xì)講解這些概念的含義。連接點(diǎn)是一個(gè)非常抽象的概念,它表示一個(gè)時(shí)機(jī),例如,在某個(gè)類的初始化完成后,某個(gè)方法執(zhí)行前,程序出現(xiàn)異常時(shí),都是一個(gè)連接點(diǎn)。通知表示的是在連接點(diǎn)上執(zhí)行的某段代碼,所有被通知注解標(biāo)注的方法均代表一個(gè)通知。切點(diǎn)是匹配連接點(diǎn)的一個(gè)抽象概念,例如execution(*com.BookHandler.addBook(..))表達(dá)式就代表一個(gè)切點(diǎn),此切點(diǎn)匹配了BookHandler類中的“addBook()方法執(zhí)行前”連接點(diǎn)和StudentHandler的“addStudent()方法執(zhí)行前”連接點(diǎn)。切點(diǎn)表達(dá)式如何匹配連接點(diǎn)是SpringAOP實(shí)現(xiàn)的核心要點(diǎn)。目標(biāo)對(duì)象是指需要被處理的目標(biāo)業(yè)務(wù)類,目標(biāo)方法通常指切點(diǎn)映射到的方法。切面代指一個(gè)被AOP處理的類,此類封裝了許多需要插入到其他類執(zhí)行的代碼,在本節(jié)的例子中,例4-5中的LogAopAspect類就是切面類??椚胧菍⑼ㄖ砑拥侥繕?biāo)類具體連接點(diǎn)的過(guò)程。例如,將dealAddLog()方法添加到“addStudent()方法執(zhí)行前”連接點(diǎn)的過(guò)程就是織入。4.1AOP簡(jiǎn)介4.1.2AOP中的核心概念@Component@AspectpublicclassLogAopAspect{/*在切點(diǎn)之前執(zhí)行*/

@Before("execution(*com.*Handler.add*(..))")publicvoiddealAddLog(JoinPointjoinPoint){/*記錄日志*/System.out.println("開始添加");}/*在切點(diǎn)返回之前執(zhí)行*/

@AfterReturning("execution(*com.*Handler.add*(..))")publicvoiddealAfterReturnAddLog(JoinPointjoinPoint){/*記錄日志*/System.out.println("添加成功");}}packagecom;/*圖書處理類*/publicclassBookHandler{

publicvoidaddBook(Bookbook){/*添加Book操作*/System.out.println("添加book");}}連接點(diǎn):方法執(zhí)行前連接點(diǎn):方法執(zhí)行后通知:dealAddLog()通知切點(diǎn):以Handler為結(jié)尾的切點(diǎn)目標(biāo)對(duì)象:BookHandler類目標(biāo)方法:addBook方法切面:LogAopAspect切面類織入:將通知放進(jìn)連接點(diǎn)執(zhí)行的過(guò)程就叫織入4.2Spring中AOP的實(shí)現(xiàn)方式基于注解實(shí)現(xiàn)AOPexecution表達(dá)式基于XML實(shí)現(xiàn)AOP4.2Spring中AOP的實(shí)現(xiàn)方式4.2.1基于注解實(shí)現(xiàn)AOP基于注解實(shí)現(xiàn)AOP為開發(fā)中常用的方式。為了開發(fā)方便,SpringAOP提供了一系列的注解來(lái)使用。4.2Spring中AOP的實(shí)現(xiàn)方式4.2.1基于注解實(shí)現(xiàn)AOP

@Pointcut("execution(*com.BookHandler.addBook(..))")publicvoidpointCut(){}

/*在目標(biāo)方法之前執(zhí)行*/

@Before("pointCut()")publicvoiddealAddBeforeLog(JoinPointjoinPoint){System.out.println("開始添加");}/*在目標(biāo)方法之后執(zhí)行*/

@After("pointCut()")publicvoiddealAddAfterLog(JoinPointjoinPoint){System.out.println("添加結(jié)束");}@Pointcut、@Before和@After注解被@Pointcut注解標(biāo)注的方法代表一個(gè)切點(diǎn),此切點(diǎn)需要用execution表達(dá)式指定。此表達(dá)式將在下節(jié)介紹。被@Before注解標(biāo)注的方法代表一個(gè)前置通知,此通知將會(huì)在指定的目標(biāo)函數(shù)之前執(zhí)行。在@Before注解中,可以添加切點(diǎn)的方法名來(lái)代替execution表達(dá)式。@After注解與@Before類似,@After注解標(biāo)注的通知在指定的目標(biāo)方法之后執(zhí)行,而@Before標(biāo)注的通知在目標(biāo)方法之前執(zhí)行。4.2Spring中AOP的實(shí)現(xiàn)方式4.2.1基于注解實(shí)現(xiàn)AOP@Around、@AfterReturning和@AfterThrowing注解

@Around("pointCut()")publicvoiddealAddAroundLog(ProceedingJoinPointpjb){System.out.println("執(zhí)行Around環(huán)繞添加之前");try{/*執(zhí)行目標(biāo)方法*/

ceed();}catch(Throwablee){System.out.println("發(fā)現(xiàn)異常");}System.out.println("執(zhí)行Around環(huán)繞處理完成");}被@Around注解標(biāo)注的方法代表一個(gè)環(huán)繞通知,環(huán)繞通知的參數(shù)為ProceedingJoinPoint類,此類代表一個(gè)執(zhí)行連接點(diǎn),通過(guò)調(diào)用此類的proceed()方法,即可執(zhí)行目標(biāo)方法,在調(diào)用此類的proceed()方法之前的所有代碼將會(huì)被放到目標(biāo)方法之前執(zhí)行,效果等同于@After注解標(biāo)注的前置通知,在調(diào)用proceed()方法之后的代碼將會(huì)被放到目標(biāo)方法之后執(zhí)行。4.2Spring中AOP的實(shí)現(xiàn)方式4.2.1基于注解實(shí)現(xiàn)AOP@Around、@AfterReturning和@AfterThrowing注解

@AfterReturning("pointCut()")publicvoiddealAfterReturnAddLog(JoinPointjoinPoint){System.out.println("方法返回成功");}/*在目標(biāo)方法拋出異常時(shí)執(zhí)行*/

@AfterThrowing("execution(*com.BookHandler.addBook(..))")publicvoiddealExceptionLog(JoinPointjoinPoint){System.out.println("添加失敗");}@AfterReturning注解與@After注解類似,不同的是@AfterReturning注解在目標(biāo)方法返回之后執(zhí)行,而@After注解在目標(biāo)方法執(zhí)行完畢后執(zhí)行。當(dāng)目標(biāo)方法內(nèi)有異常發(fā)生時(shí),@AfterReturning注解標(biāo)注的通知將不會(huì)被執(zhí)行,而@After注解標(biāo)注的通知正常執(zhí)行。@AfterThrowing注解標(biāo)注的通知只會(huì)在目標(biāo)對(duì)象拋出異常時(shí)執(zhí)行。4.2Spring中AOP的實(shí)現(xiàn)方式4.2.2execution表達(dá)式execution表達(dá)式可以來(lái)配置切點(diǎn)到目標(biāo)方法的映射,ex

溫馨提示

  • 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)論