《JavaEE企業(yè)級(jí)應(yīng)用開(kāi)發(fā)》初識(shí)Spring框架_第1頁(yè)
《JavaEE企業(yè)級(jí)應(yīng)用開(kāi)發(fā)》初識(shí)Spring框架_第2頁(yè)
《JavaEE企業(yè)級(jí)應(yīng)用開(kāi)發(fā)》初識(shí)Spring框架_第3頁(yè)
《JavaEE企業(yè)級(jí)應(yīng)用開(kāi)發(fā)》初識(shí)Spring框架_第4頁(yè)
《JavaEE企業(yè)級(jí)應(yīng)用開(kāi)發(fā)》初識(shí)Spring框架_第5頁(yè)
已閱讀5頁(yè),還剩78頁(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)介

第6章初識(shí)Spring框架《JavaEE企業(yè)級(jí)應(yīng)用開(kāi)發(fā)教程(Spring+SpringMVC+MyBatis)(第2版)》學(xué)習(xí)目標(biāo)/Target

了解Spring框架及其優(yōu)點(diǎn)

了解Spring框架的體系結(jié)構(gòu)與Spring5的新特性

熟悉Spring框架的下載及目錄結(jié)構(gòu)

學(xué)習(xí)目標(biāo)/Target

掌握Spring框架入門(mén)程序的編寫(xiě)

理解控制反轉(zhuǎn)的概念

掌握依賴注入的概念、類型和應(yīng)用

章節(jié)概述/Summary

Spring致力于解決JavaEE應(yīng)用中的各種問(wèn)題,對(duì)于一個(gè)Java開(kāi)發(fā)者來(lái)說(shuō),Spring框架的熟練使用是必備的技能之一。Spring具有良好的設(shè)計(jì)和分層結(jié)構(gòu),它克服了傳統(tǒng)重量型框架臃腫、低效的劣勢(shì),大大簡(jiǎn)化了項(xiàng)目開(kāi)發(fā)中的技術(shù)復(fù)雜性。本章將對(duì)Spring框架的基礎(chǔ)知識(shí)進(jìn)行詳細(xì)地講解。

目錄/Contents010203Spring介紹Spring的入門(mén)程序控制反轉(zhuǎn)與依賴注入Spring介紹6.16.1.1Spring概述先定一個(gè)小目標(biāo)!

先定一個(gè)小目標(biāo)!了解什么是Spring,能夠說(shuō)出Spring的作用STEP01

Spring是由RodJohnson組織和開(kāi)發(fā)的一個(gè)分層的JavaSE/EE一站式(full-stack)輕量級(jí)開(kāi)源框架。它最為核心的理念是IoC(控制反轉(zhuǎn))和AOP(面向切面編程),其中,IoC是Spring的基礎(chǔ),它支撐著Spring對(duì)JavaBean的管理功能;AOP是Spring的重要特性,AOP是通過(guò)預(yù)編譯方式和運(yùn)行期間動(dòng)態(tài)代理實(shí)現(xiàn)程序功能,也就是說(shuō)可以在不修改源代碼的情況下,給程序統(tǒng)一添加功能。STEP03String框架的核心技術(shù)6.1.1Spring概述STEP01(1)在表現(xiàn)層它提供了SpringMVC框架,并且Spring還可以與Struts框架整合。(2)在業(yè)務(wù)邏輯層可以管理事務(wù)、記錄日志等。(3)在持久層可以整合MyBatis、Hibernate、JdbcTemplate等技術(shù)。STEP03String在表現(xiàn)層、業(yè)務(wù)邏輯層和持久層的作用6.1.1Spring概述6.1.2Spring框架的優(yōu)點(diǎn)先定一個(gè)小目標(biāo)!

先定一個(gè)小目標(biāo)!了解Spring框架的優(yōu)點(diǎn),能夠說(shuō)出Spring框架的優(yōu)點(diǎn)STEP01

Spring作為JavaEE的一個(gè)全方位應(yīng)用程序框架,為開(kāi)發(fā)企業(yè)級(jí)應(yīng)用提供了一個(gè)健壯、高效的解決方案。它不僅可以應(yīng)用于Java應(yīng)用的開(kāi)發(fā),也可以應(yīng)用于服務(wù)器端開(kāi)發(fā)。Spring之所以得到如此廣泛應(yīng)用,是因?yàn)镾pring框架具有以下幾個(gè)優(yōu)點(diǎn)。STEP03String框架的作用6.1.2Spring框架的優(yōu)點(diǎn)STEP01

Spring是一種非侵入式(non-invasive)框架,所謂非侵入式是指Spring框架的API不會(huì)在業(yè)務(wù)邏輯上出現(xiàn),也就是說(shuō)業(yè)務(wù)邏輯應(yīng)該是純凈的,不能出現(xiàn)與業(yè)務(wù)邏輯無(wú)關(guān)的代碼。由于業(yè)務(wù)邏輯中沒(méi)有Spring的API,所以業(yè)務(wù)邏輯代碼也可以從Spring框架快速地移植到其他框架。STEP03String框架的優(yōu)點(diǎn):a.非侵入式設(shè)計(jì)6.1.2Spring框架的優(yōu)點(diǎn)STEP01

Spring就是一個(gè)大工廠,可以將所有對(duì)象的創(chuàng)建和依賴關(guān)系的維護(hù)工作都交給Spring容器管理,大大降低了組件之間的耦合性。STEP03String框架的優(yōu)點(diǎn):b.降低耦合性6.1.2Spring框架的優(yōu)點(diǎn)STEP01

Spring提供了對(duì)AOP的支持,AOP可以將一些通用的任務(wù)進(jìn)行集中處理,如安全、事務(wù)和日志等,以減少通過(guò)傳統(tǒng)OOP方法帶來(lái)的代碼冗余和繁雜。STEP03String框架的優(yōu)點(diǎn):c.支持AOP編程6.1.2Spring框架的優(yōu)點(diǎn)STEP01

在Spring中,可以直接通過(guò)Spring配置文件管理數(shù)據(jù)庫(kù)事務(wù),省去了手動(dòng)編程的繁瑣,提高了開(kāi)發(fā)效率。STEP03String框架的優(yōu)點(diǎn):d.支持聲明式事務(wù)6.1.2Spring框架的優(yōu)點(diǎn)STEP01

Spring提供了對(duì)Junit的支持,開(kāi)發(fā)人員可以通過(guò)Junit進(jìn)行單元測(cè)試。STEP03String框架的優(yōu)點(diǎn):e.方便程序的測(cè)試6.1.2Spring框架的優(yōu)點(diǎn)STEP01

Spring提供了一個(gè)廣闊的基礎(chǔ)平臺(tái),其內(nèi)部提供了對(duì)各種框架的直接支持,如Struts、Hibernate、MyBatis、Quartz等,這些優(yōu)秀框架可以與Spring無(wú)縫集成。STEP03String框架的優(yōu)點(diǎn):f.方便集成框架6.1.2Spring框架的優(yōu)點(diǎn)STEP01

Spring對(duì)JavaEE開(kāi)發(fā)中的一些API(如JDBC、JavaMail等)都進(jìn)行了封裝,大大降低了這些API的使用難度。STEP03String框架的優(yōu)點(diǎn):g.降低JavaEEAPI的使用難度6.1.2Spring框架的優(yōu)點(diǎn)6.1.3Spring的體系結(jié)構(gòu)先定一個(gè)小目標(biāo)!

先定一個(gè)小目標(biāo)!了解Spring的體系結(jié)構(gòu),能夠說(shuō)出Spring的體系結(jié)構(gòu)中的主要模塊STEP01STEP03Spring的體系結(jié)構(gòu)圖6.1.3Spring的體系結(jié)構(gòu)STEP01

Spring框架主要有8大模塊,每個(gè)大模塊由多個(gè)或1個(gè)小模塊組成,如Spring的核心容器模塊(CoreContainer)是由Beans模塊、Core模塊、Context模塊和SpEL模塊組成。下面結(jié)合String的體系結(jié)構(gòu)圖對(duì)Spring體系結(jié)構(gòu)中的主要模塊進(jìn)行簡(jiǎn)單介紹。

STEP03Spring5框架組成模塊6.1.3Spring的體系結(jié)構(gòu)STEP01

核心容器模塊在Spring的功能體系中起著支撐性作用,是其他模塊的基石。核心容器層主要由Beans模塊、Core模塊、Contex模塊和SpEL模塊組成。STEP03a.核心容器模塊(CoreContainer)6.1.3Spring的體系結(jié)構(gòu)STEP01(1)Beans模塊。它提供了BeanFactory類,是工廠模式的經(jīng)典實(shí)現(xiàn),Beans模塊的主要作用是創(chuàng)建和管理Bean對(duì)象。(2)Core模塊。它提供了Spring框架的基本組成部分,包括IoC和DI功能。(3)Context模塊。它構(gòu)建于Beans模塊和Core模塊的基礎(chǔ)之上,它可以通過(guò)ApplicationContext接口提供上下文信息。(4)SpEL模塊。它是Spring3.0后新增的模塊,提供了對(duì)SpEL表達(dá)式語(yǔ)言(SpringExpressionLanguage)的支持,SpEL表達(dá)式語(yǔ)言是一個(gè)在程序運(yùn)行時(shí)支持操作對(duì)象圖的表達(dá)式語(yǔ)言。STEP03核心容器模塊各模塊組成6.1.3Spring的體系結(jié)構(gòu)STEP01

數(shù)據(jù)訪問(wèn)及集成模塊用于訪問(wèn)和操作數(shù)據(jù)庫(kù)中的數(shù)據(jù),它主要包含JDBC模塊、ORM模塊、OXM模塊、JMS模塊和Transactions模塊。STEP03b.數(shù)據(jù)訪問(wèn)及集成模塊(DataAccess/Integration)6.1.3Spring的體系結(jié)構(gòu)STEP01(1)

JDBC模塊。它提供了一個(gè)JDBC的抽象層,消除了冗長(zhǎng)的JDBC編碼并能夠解析數(shù)據(jù)庫(kù)供應(yīng)商特有的錯(cuò)誤代碼。(2)ORM模塊。它為主流的對(duì)象關(guān)系映射API提供了集成層,用于集成主流的對(duì)象關(guān)系映射框架。(3)OXM模塊。它提供了對(duì)XML映射的抽象層的支持,如JAXB、Castor等。(4)JMS模塊。它主要用于傳遞消息,包含消息的生產(chǎn)和消費(fèi)。自4.1版本后,JMS模塊支持與Spring-message模塊的集成。(5)Transactions模塊。它的主要功能是事務(wù)管理。STEP03數(shù)據(jù)訪問(wèn)及集成模塊各模塊組成6.1.3Spring的體系結(jié)構(gòu)STEP01

Web模塊的實(shí)現(xiàn)基于APPlicationContext基礎(chǔ)之上,它提供了Web應(yīng)用的各種工具類,包括了Web模塊、Servlet模塊、WebSocket模塊和Portlet模塊。STEP03c.Web模塊6.1.3Spring的體系結(jié)構(gòu)STEP01(1)

Web模塊。它提供了針對(duì)Web開(kāi)發(fā)的集成特性,如大部分文件上傳功能等。此外,Web模塊還包含一個(gè)HTTP客戶端和Spring遠(yuǎn)程處理支持的Web相關(guān)部分。(2)Servlet模塊。它提供了Spring的模型、視圖、控制器以及Web應(yīng)用程序的RESTWeb服務(wù)實(shí)現(xiàn)。(3)WebSocket模塊。它是Spring4.0以后新增的模塊,它提供了WebSocket和SockJS的實(shí)現(xiàn),以及對(duì)STOMP的支持。(4)Portlet模塊。它類似Servlet模塊的功能,提供了Portlet環(huán)境下的MVC實(shí)現(xiàn)。STEP03Web模塊各模塊組成6.1.3Spring的體系結(jié)構(gòu)STEP01

Spring框架的其他模塊還有AOP模塊、Aspects模塊、Instrumentation模塊以及Test模塊。STEP03d.其他模塊6.1.3Spring的體系結(jié)構(gòu)STEP01(1)

AOP模塊。它提供了對(duì)面向切面編程的支持,程序可以定義方法攔截器和切入點(diǎn),將代碼按照功能進(jìn)行分離,以降低程序的耦合性。(2)Aspects模塊。它提供了與AspectJ集成的支持。(3)Instrumentation模塊。它提供了對(duì)類工具的支持,并且實(shí)現(xiàn)了類加載器,該模塊可以在特定的應(yīng)用服務(wù)器中使用。(4)Messaging模塊。它是Spring4.0以后新增的模塊,它提供了對(duì)消息傳遞體系結(jié)構(gòu)和協(xié)議的支持。(5)Test模塊。它提供了對(duì)程序單元測(cè)試和集成測(cè)試的支持。STEP03其他模塊各模塊組成6.1.3Spring的體系結(jié)構(gòu)6.1.4Spring

5的新特性先定一個(gè)小目標(biāo)!

先定一個(gè)小目標(biāo)!了解Spring

5的新特性,能夠說(shuō)出Spring

5有哪些新特性STEP01

Spring

5是Spring當(dāng)前最新的版本,與歷史版本對(duì)比,Spring5對(duì)Spring核心框架進(jìn)行了修訂和更新,增加了很多新特性,如支持響應(yīng)式編程等。STEP03Spring

5與其他版本的比較6.1.4Spring

5的新特性STEP01因?yàn)镾pring

5代碼庫(kù)運(yùn)行于JDK8之上,所以Spring

5對(duì)JDK的最低要求是JDK8,這可以促進(jìn)Spring的使用者積極運(yùn)用Java8新特性。STEP03Spring

5新特性:a.更新JDK基線6.1.4Spring

5的新特性STEP01(1)基于JDK8的反射增強(qiáng),通過(guò)Spring5提供的方法可以更加高效的對(duì)類或類的參數(shù)進(jìn)行訪問(wèn)。

(2)核心的Spring接口提供了基于JDK8的默認(rèn)方法構(gòu)建的選擇性聲明。

(3)用@Nullable和@NotNull注解來(lái)表明可為空的參數(shù)以及返回值,可以在編譯時(shí)處理空值而不是在運(yùn)行時(shí)拋出NullPointerExceptions異常。STEP03Spring

5新特性:b.修訂核心框架6.1.4Spring

5的新特性STEP01

Spring

5支持候選組件索引作為類路徑掃描的替代方案。從索引讀取實(shí)體類,會(huì)使加載組件索引開(kāi)銷更低,因此,Spring程序的啟動(dòng)時(shí)間將會(huì)縮減。STEP03Spring

5新特性:c.更新核心容器6.1.4Spring

5的新特性STEP01

響應(yīng)式編程是另外一種編程風(fēng)格,它專注于構(gòu)建對(duì)事件做出響應(yīng)的應(yīng)用程序。Spring5包含響應(yīng)流和Reactor(ReactiveStream的Java實(shí)現(xiàn)),響應(yīng)流和Reactor支撐了Spring自身的功能及相關(guān)API。STEP03Spring

5新特性:d.支持響應(yīng)式編程6.1.4Spring

5的新特性STEP01

Spring

5提供了一個(gè)函數(shù)式Web框架。該框架使用函數(shù)式編程風(fēng)格來(lái)定義端點(diǎn),它引入了兩個(gè)基本組件:

HandlerFunction和RouterFunction。HandlerFunction

表示處理接收到的請(qǐng)求并生成響應(yīng)函數(shù);RouterFunction替代了@RequestMapping注解,用于將接收到的請(qǐng)求轉(zhuǎn)發(fā)到處理函數(shù)。STEP03Spring

5新特性:e.支持函數(shù)式Web框架6.1.4Spring

5的新特性STEP01

Spring5提供了對(duì)Kotlin語(yǔ)言的支持。Kotlin是一種支持函數(shù)式編程風(fēng)格的面向?qū)ο笳Z(yǔ)言,它運(yùn)行在JVM之上,可以讓代碼更具有表現(xiàn)力、簡(jiǎn)潔性和可讀性。有了對(duì)Kotlin的支持,開(kāi)發(fā)人員可以進(jìn)行深度的函數(shù)式Spring編程,這拓寬了Spring的應(yīng)用領(lǐng)域。STEP03Spring

5新特性:f.支持Kotlin6.1.4Spring

5的新特性STEP01

Spring5完全支持Junit5Jupiter,因此可以使用Junit5編寫(xiě)測(cè)試代碼。除此之外,Spring

5還提供了在Spring

TestContext

Framework中進(jìn)行并行測(cè)試的擴(kuò)展。針對(duì)響應(yīng)式編程模型,Spring5引入了支持Spring

webFlux的WebTestClient集成測(cè)試。STEP03Spring

5新特性:g.提升測(cè)試功能6.1.4Spring

5的新特性6.1.5Spring的下載及目錄結(jié)構(gòu)先定一個(gè)小目標(biāo)!

先定一個(gè)小目標(biāo)!熟悉如何Spring下載以及Spring的目錄結(jié)構(gòu),能夠下載Spring并知道它目錄下存放的文件類別STEP01

Spring是一個(gè)獨(dú)立的框架,它不需要依賴任何Web服務(wù)器或容器,既可以在獨(dú)立的JavaSE項(xiàng)目中使用,也可以在JavaEE項(xiàng)目中使用。在使用Spring之前需要獲取它的jar包,這些jar包可以在Spring官網(wǎng)下載。STEP03Spring框架簡(jiǎn)單介紹6.1.5Spring的下載及目錄結(jié)構(gòu)STEP016.1.5Spring的下載及目錄結(jié)構(gòu)使用瀏覽器訪問(wèn)Spring的官方下載地址,訪問(wèn)org→springframework→spring路徑,就可以看到Spring框架各個(gè)版本壓縮包的下載鏈接,這里選擇5.2.8.RELEASE版本,單擊鏈接下載該文件。在官網(wǎng)單擊下面這個(gè)鏈接下載該文件。spring-5.2.8.RELEASE-dist.zip下載Spring的相關(guān)jar包可按如下步驟進(jìn)行。STEP026.1.5Spring的下載及目錄結(jié)構(gòu)下載完成后,將文件解壓得到一個(gè)名為spring-framework-5.2.8.RELEASE的文件夾。STEP01

docs文件夾:該文件夾下存放Spring的相關(guān)文檔,包括開(kāi)發(fā)指南、API參考文檔。

libs文件夾:該文件夾下存放開(kāi)發(fā)所需的jar包和源碼。整個(gè)Spring框架由21個(gè)模塊組成,libs目錄下Spring為每個(gè)模塊都提供了三個(gè)壓縮包,因此,libs文件夾下一共有63個(gè)jar包。這63個(gè)jar包分為三類。

schema文件夾:該文件夾下存放Spring各種配置文件的XMLSchema文檔。STEP03Spring目錄結(jié)構(gòu)下文件夾介紹6.1.5Spring的下載及目錄結(jié)構(gòu)STEP036.1.5Spring的下載及目錄結(jié)構(gòu)加載JAR包。

在使用Spring開(kāi)發(fā)時(shí),除了要使用自帶的jar包外,Spring的核心容器還需要依賴commons.logging的jar包。該jar包可以通過(guò)commons的官方地址下載。下載完成后,會(huì)得到一個(gè)名為commons-logging-1.2-bin.zit的壓縮包。將壓縮包解壓到自定義目錄后,即可找到commons.logging對(duì)應(yīng)jar包c(diǎn)ommons-logging-1.2.jar。Spring的入門(mén)程序6.26.2Spring的入門(mén)程序先定一個(gè)小目標(biāo)!

先定一個(gè)小目標(biāo)!掌握Spring的入門(mén)程序,能夠?qū)崿F(xiàn)Spring入門(mén)程序的編寫(xiě)STEP016.2Spring的入門(mén)程序在IDEA中創(chuàng)建名稱為chapter06的Maven項(xiàng)目,然后在pom.xml文件中加載需使用到的Spring四個(gè)基礎(chǔ)包以及Spring依賴包。<!--此處只展示了一個(gè)--><dependency>

<groupId>org.springframework</groupId> <artifactId>spring-expression</artifactId>

<version>5.2.8.RELEASE</version> </dependency>下面通過(guò)一個(gè)簡(jiǎn)單的入門(mén)程序演示Spring框架的使用,要求在控制臺(tái)打印“張三,歡迎來(lái)到Spring”,實(shí)現(xiàn)步驟具體如下。STEP026.2Spring的入門(mén)程序創(chuàng)建名為HelloSpring的類,在HelloSpring類中定義userName屬性和show()方法。packagecom.itheima;publicclassHelloSpring{privateStringuserName;publicvoidsetUserName(StringuserName){this.userName=userName; }publicvoidshow()

{

System.out.println(userName+":歡迎來(lái)到Spring"); }}STEP036.2Spring的入門(mén)程序新建applicationContext.xml文件作為HelloSpring類的配置文件,并在該配置文件中創(chuàng)建id為helloSpring的Bean。<!--將指定類配置給Spring,讓Spring創(chuàng)建HelloSpring

對(duì)象的實(shí)例--><beanid="helloSpring"class="com.itheima.HelloSpring"><!--為userName屬性賦值--><propertyname="userName"value="張">

</property></bean>6.2Spring的入門(mén)程序XML文件的約束信息配置

XML文件包含了很多約束信息,如果自己動(dòng)手去編寫(xiě),不但浪費(fèi)時(shí)間,還容易出錯(cuò)。XML的約束信息如下所示。其實(shí),在Spring的幫助文檔中,就可以找到這些約束信息。

<beansxmlns="/schema/beans"

xmlns:xsi="/2001/XMLSchema-instance"xsi:schemaLocation="/schema/beans /schema/beans/spring-beans.xsd">6.2Spring的入門(mén)程序Spring幫助文檔獲取約束信息步驟1步驟2步驟3打開(kāi)Spring目錄結(jié)構(gòu)下的docs文件夾,在spring-framework-reference文件夾的Spring的參考文件目錄下找到index.html文件。

6.2Spring的入門(mén)程序Spring幫助文檔獲取約束信息步驟1步驟2步驟3使用瀏覽器打開(kāi)index.html。6.2Spring的入門(mén)程序Spring幫助文檔獲取約束信息步驟1步驟2步驟3在步驟2中單擊“Core”鏈接進(jìn)入CoreTechnologies頁(yè)面,單擊1.TheIoCcontainer→1.2.Containeroverview→1.2.1.ConfigurationMetadata目錄,可以查看配置文件的約束信息。STEP046.2Spring的入門(mén)程序創(chuàng)建測(cè)試類TestHelloSpring,在main()方法中初始化Spring容器并加載applicationContext.xml配置文件,通過(guò)Spring容器獲取HelloSpring類的helloSpring實(shí)例,調(diào)用HelloSpring類中的show()方法在控制臺(tái)輸出信息。publicclassTestHelloSpring{publicstaticvoidmain(String[]args){//

初始化spring容器,加載applicationContext.xml配置ApplicationContextapplicationContext=newClassPathXmlApplicationContext("applicationContext.xml");//

通過(guò)容器獲取配置中helloSpring的實(shí)例HelloSpringhelloSpring=(HelloSpring)applicationContext.getBean("helloSpring");helloSpring.show();//

調(diào)用方法 }}STEP056.2Spring的入門(mén)程序在IDEA中啟動(dòng)測(cè)試類TestHelloSpring,控制臺(tái)會(huì)輸出結(jié)果。

控制反轉(zhuǎn)與依賴注入6.36.3.1控制反轉(zhuǎn)的概念先定一個(gè)小目標(biāo)!

先定一個(gè)小目標(biāo)!理解控制反轉(zhuǎn)的概念,能夠說(shuō)出控制反轉(zhuǎn)的設(shè)計(jì)原則STEP01

控制反轉(zhuǎn)(InversionofControl,縮寫(xiě)為IoC)是面向?qū)ο缶幊讨械囊粋€(gè)設(shè)計(jì)原則,用來(lái)降低程序代碼之間的耦合度。在傳統(tǒng)面向?qū)ο缶幊讨?,獲取對(duì)象的方式是用new關(guān)鍵字主動(dòng)創(chuàng)建一個(gè)對(duì)象,也就是說(shuō)應(yīng)用程序掌握著對(duì)象的控制權(quán)。傳統(tǒng)面向?qū)ο蟪绦蛟O(shè)計(jì)原則如圖。STEP03傳統(tǒng)面向?qū)ο蟪绦蛟O(shè)計(jì)原則6.3.1控制反轉(zhuǎn)的概念STEP01

IoC控制反轉(zhuǎn)機(jī)制指的是對(duì)象由Ioc容器統(tǒng)一管理,當(dāng)程序需要使用對(duì)象時(shí),可以直接從IoC容器中獲取。這樣對(duì)象的控制權(quán)就從應(yīng)用程序轉(zhuǎn)移到了IoC容器。IoC設(shè)計(jì)原則如圖,它是借助于IoC容器實(shí)現(xiàn)具有依賴關(guān)系對(duì)象之間的解耦,各個(gè)對(duì)象類封裝之后,通過(guò)IoC容器來(lái)關(guān)聯(lián)這些對(duì)象類。STEP03IoC設(shè)計(jì)原則6.3.1控制反轉(zhuǎn)的概念6.3.2依賴注入的概念先定一個(gè)小目標(biāo)!

先定一個(gè)小目標(biāo)!掌握依賴注入的概念,能夠理解什么是依賴注入STEP01

依賴注入(DependencyInject,縮寫(xiě)DI)就是由IoC容器在運(yùn)行期間動(dòng)態(tài)地將某種依賴資源注入對(duì)象之中。例如,將對(duì)象B注入(賦值)給對(duì)象A的成員變量。依賴注入的基本思想是:明確地定義組件接口,獨(dú)立開(kāi)發(fā)各個(gè)組件,然后根據(jù)組件的依賴關(guān)系組裝運(yùn)行。STEP03什么是依賴注入6.3.2依賴注入的概念STEP01

依賴注入(DI)和控制反轉(zhuǎn)(IoC)是從不同角度來(lái)描述了同一件事情。依賴注入是從應(yīng)用程序的角度描述,即應(yīng)用程序依賴IoC容器創(chuàng)建并注入它所需要的外部資源;而控制反轉(zhuǎn)是從IoC容器的角度描述,即IoC容器控制應(yīng)用程序,由IoC容器反向地向應(yīng)用程序注入應(yīng)用程序所需要的外部資源。這里所說(shuō)的外部資源可以是外部實(shí)例對(duì)象,也可以是外部文件對(duì)象等。

STEP03依賴注入和控制反轉(zhuǎn)的比較6.3.2依賴注入的概念6.3.3依賴注入的類型先定一個(gè)小目標(biāo)!

先定一個(gè)小目標(biāo)!掌握依賴注入的類型,能夠使用構(gòu)造方法注入完成依賴注入STEP01

依賴注入的作用就是在使用Spring框架創(chuàng)建對(duì)象時(shí),動(dòng)態(tài)的將其所依賴的對(duì)象注入到Bean組件中。依賴注入通常有兩種實(shí)現(xiàn)方式,一種是構(gòu)造方法注入,另一種是屬性setter方法注入。這兩種實(shí)現(xiàn)方式具體介紹如下。STEP03依賴注入的實(shí)現(xiàn)方式6.3.3依賴注入的類型STEP01

構(gòu)造方法注入是指Spring容器調(diào)用構(gòu)造方法注入被依賴的實(shí)例,構(gòu)造方法可以是有參的或者是無(wú)參的。Spring在讀取配置信息后,會(huì)通過(guò)反射方式調(diào)用實(shí)例的構(gòu)造方法,如果是有參構(gòu)造方法,可以在構(gòu)造方法中傳入所需的參數(shù)值,最后創(chuàng)建類對(duì)象。STEP03構(gòu)造方法注入6.3.3依賴注入的類型STEP016.3.3依賴注入的類型編寫(xiě)用戶類:新建User1類,在User1類中定義id、name和password三個(gè)屬性。publicclassUser1{privateintid;

privateStringname;

privateStringpassword;

publicUser1(intid,Stringname,Stringpassword){this.id=id; =name;this.password=password;}publicStringtoString(){return"id="+id+",name="+name+",password="+password;}}下面通過(guò)案例演示構(gòu)造方法注入的實(shí)現(xiàn),具體步驟如下。STEP026.3.3依賴注入的類型獲取Bean的配置信息:創(chuàng)建applicationContext-User.xml文件,在該文件中添加User1類的配置信息。<beanid="user1"class="com.itheima.User1">

<constructor-argname="id"value="1">

</constructor-arg><constructor-argname="name"value="張三">

</constructor-arg><constructor-argname="password" value="123"></constructor-arg></bean>6.3.3依賴注入的類型<constructor-arg>元素

一個(gè)<constructor-arg>元素表示構(gòu)造方法的一個(gè)參數(shù),且定義時(shí)不區(qū)分順序,只需要通過(guò)<constructor-arg>元素的name屬性指定參數(shù)即可。<constructor-arg>元素還提供了type屬性類指定參數(shù)的類型,避免字符串和基本數(shù)據(jù)類型的混淆。STEP036.3.3依賴注入的類型編寫(xiě)測(cè)試類:創(chuàng)建測(cè)試類TestUser1,用于測(cè)試依賴注入的結(jié)果。publicclassTestUser1{publicstaticvoidmain(String[]args)throwsException{//加載applicationContext.xml配置ApplicationContextapplicationContext=newClassPathXmlApplicationContext("applicationContext-User.xml");//獲取配置中的User1實(shí)例User1user1=applicationContext.getBean("user1",User1.class);System.out.println(user1);

}}6.3.3依賴注入的類型先定一個(gè)小目標(biāo)!

先定一個(gè)小目標(biāo)!掌握依賴注入的類型,能夠使用屬性setter方法注入完成依賴注入STEP01

屬性setter方法注入是Spring最主流的注入方法,這種注入方法簡(jiǎn)單、直觀,它是在被注入的類中聲明一個(gè)setter方法,通過(guò)setter方法的參數(shù)注入對(duì)應(yīng)的值。STEP03屬性setter方法注入6.3.3依賴注入的類型STEP016.3.3依賴注入的類型編寫(xiě)用戶類:新建User2類,在User2類中定義id、name和password三個(gè)屬性。publicclassUser2{privateintid; privateStringname;

privateStringpassword;

//省略getter/setter方法

publicStringtoString(){return"id="+id+",name="+name+",password="+password;

}}下面通過(guò)案例演示屬性setter方法注入的實(shí)現(xiàn),具體步驟如下。STEP026.3.3依賴注入的類型獲取Bean的配置信息:創(chuàng)建applicationContext-User2.xml文件,并在該文件的bean元素中添加User2類的配置信息。<beanid="user2"class="com.itheima.User2"><propertyname="id"value="2"></property><propertyname="name"value="李四"></property><propertyname="password"value="456"> </property></bean>STEP036.3.3依賴注入的類型編寫(xiě)測(cè)試類:創(chuàng)建測(cè)試類TestUser2,用于測(cè)試依賴注入的結(jié)果。publicclassTestUser2{publicstaticvoidmain(String[]args)throwsException{//加載applicationContext.xml配置ApplicationContextapplicationContext=newClassPathXmlApplicationContext("applicationContext-User2.xml");//獲取配置中的User2實(shí)例User2user2=applicationContext.getBean("user2",User2.class);System.out.println(user2);}}6.3.4依賴注入的應(yīng)用先定一個(gè)小目標(biāo)!

先定一個(gè)小目標(biāo)!掌握依賴注入的應(yīng)用,能夠在代碼中熟練運(yùn)用依賴注入STEP016.3.4依賴注入的應(yīng)用(1)編寫(xiě)DAO層:創(chuàng)建接口UserDao.java,在UserDao.java接口中添加方法login(),用于實(shí)現(xiàn)登錄功能。publicinterfaceUserDao{publicbooleanlogin(Stringname,Stringpassword);}下面以屬性setter方法注入為例,實(shí)現(xiàn)一個(gè)簡(jiǎn)單的登錄驗(yàn)證。具體實(shí)現(xiàn)步驟如下所示。STEP016.3.4依賴注入的應(yīng)用(2)編寫(xiě)DAO層的實(shí)現(xiàn)類:創(chuàng)建UserDao接口的實(shí)現(xiàn)類UserDaoImpl,在UserDaoImpl類中實(shí)現(xiàn)login()方法。publicclassUserDaoImplimplementsUserDao{@Overridepublicbooleanlogin(Stringname,Stringpassword){if(name.equals(“張三”)&&password.equals(“123”)){

returntrue;}returnfalse;

}}STEP026.3.4依賴注入的應(yīng)用(1)編寫(xiě)Service層:新建service包,在service

溫馨提示

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