《Java EE框架(SSM + Spring Boot + Vue.js 3)整合開發(fā)》 課件 第1章 Spring_第1頁
《Java EE框架(SSM + Spring Boot + Vue.js 3)整合開發(fā)》 課件 第1章 Spring_第2頁
《Java EE框架(SSM + Spring Boot + Vue.js 3)整合開發(fā)》 課件 第1章 Spring_第3頁
《Java EE框架(SSM + Spring Boot + Vue.js 3)整合開發(fā)》 課件 第1章 Spring_第4頁
《Java EE框架(SSM + Spring Boot + Vue.js 3)整合開發(fā)》 課件 第1章 Spring_第5頁
已閱讀5頁,還剩99頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

J

a

v

a

E

E框架整合開發(fā)創(chuàng)新·協(xié)作·分享T

I

P

C

C教案第一章SpringT

I

P

C

C教案本章目標(biāo)了解Spring的體系結(jié)構(gòu)理解Spring

IoC與AOP的基本原理了解Spring

Bean的生命周期、實(shí)例化以及作用域掌握Spring的事務(wù)管理T

I

P

C

C教案本章內(nèi)容Spring概述Spring開發(fā)環(huán)境的構(gòu)建Spring

IoCSpring

AOPSpring

BeanSpring的數(shù)據(jù)庫編程T

I

P

C

C教案1.1

Spring概述1.1.1

Spring的由來1.1.2

Spring的體系結(jié)構(gòu)T

I

P

C

C教案1.1.1

Spring的由來Spring是一個(gè)輕量級(jí)Java

開發(fā)框架,最

由Rod

Johnson創(chuàng)建,目的是為了解決企業(yè)級(jí)應(yīng)用開發(fā)的業(yè)務(wù)邏輯層和其它各層的耦合問題。它是一個(gè)分層的JavaSE/EEfull-stack(一站式)輕量級(jí)開源框架,為開發(fā)Java應(yīng)用程序提供全面的基礎(chǔ)架構(gòu)支持。Spring負(fù)責(zé)基礎(chǔ)架構(gòu),因此Java開發(fā)者可以專注于應(yīng)用程序的開發(fā)。?請(qǐng)思考為什么學(xué)習(xí)Spring框架?T

I

P

C

C教案1.1

Spring概述1.1.1

Spring的由來1.1.2

Spring的體系結(jié)構(gòu)T

I

P

C

C教案1.1.2

Spring的體系結(jié)構(gòu)T

I

P

C

C教案1.Core

Containerspring-beans模塊:提供了BeanFactory,是工廠模式的一個(gè)經(jīng)典實(shí)現(xiàn),Spring將管理對(duì)象稱為Bean。spring-core模塊:提供了框架的基本組成部分,包括控制反轉(zhuǎn)(Inversion

of

Control,IoC)和依賴注入(DependencyInjection,DI)功能。spring-context模塊:建立在spring-beans和spring-core模塊基礎(chǔ)上,提供一個(gè)框架式的對(duì)象訪問方式,是訪問定義和配置的任何對(duì)象媒介。spring-expression模塊:提供了強(qiáng)大的表達(dá)式語言去支持運(yùn)行時(shí)查詢和操作對(duì)象圖。T

I

P

C

C教案2.AOP和Instrumentationspring-aop模塊:提供了一個(gè)符合AOP要求的面向切面的編程實(shí)現(xiàn),允許定義方法攔截器和切入點(diǎn),將代碼按照功能進(jìn)行分離,以便干凈地解耦。spring-aspects模塊:提供了與AspectJ的集成功能,AspectJ是一個(gè)功能強(qiáng)大且成熟的AOP框架。spring-instrument模塊:提供了類植入(Instrumentation)支持和類加載器的實(shí)現(xiàn),可以在特定的應(yīng)用服務(wù)器中使用。

Instrumentation提供了一種虛擬機(jī)級(jí)別支持的AOP實(shí)現(xiàn)方式,使得開發(fā)者無需對(duì)JDK做任何升級(jí)和改動(dòng),就可以實(shí)現(xiàn)某些AOP的功能。T

I

P

C

C教案3.MessagingSpring

4.0以后新增了Messaging(spring-messaging)模塊,該模塊提供了對(duì)消息傳遞體系結(jié)構(gòu)和協(xié)議的支持。!注意:該模塊的版本!T

I

P

C

C教案4.Data

Access/Integration

spring-jdbc模塊:提供了一個(gè)JDBC的抽象層,消除了繁瑣的JDBC編碼和數(shù)據(jù)庫廠商特有的錯(cuò)誤代碼解析。

spring-orm模塊:為流行的對(duì)象關(guān)系映射(Object-RelationalMapping)API提供集成層,包括JPA和Hibernate。使用spring-orm模塊,可以將這些O/R映射框架與Spring提供的所有其它功能結(jié)合使用,例如聲明式事務(wù)管理功能。

spring-oxm模塊:提供了一個(gè)支持對(duì)象/XML映射的抽象層實(shí)現(xiàn),如

JAXB、Castor、JiBX和XStream。

spring-jms模塊(JavaMessagingService):指Java消息傳遞服務(wù),包含用于生產(chǎn)和使用消息的功能。自Spring

4.1后,提供了與

spring-messaging模塊的集成。spring-tx模塊(事務(wù)模塊):支持用于實(shí)現(xiàn)特殊接口和所有POJO(普通Java對(duì)象)類的編程和聲明式事務(wù)管理。T

I

P

C

C教案5.Web

spring-web模塊:提供了基本的Web開發(fā)集成功能。例如:多文件上傳功能、使用Servlet監(jiān)聽器初始化一個(gè)IoC容器以及Web應(yīng)用上下文。

spring-webmvc模塊:也稱為Web-Servlet模塊,包含用于Web應(yīng)用程序的Spring

MVC和REST

Web

Services實(shí)現(xiàn)。Spring

MVC框架提供了領(lǐng)域

模型代碼和Web表單之間的清晰分離,并與Spring

Framework的所有其它功能集成,本書后續(xù)章節(jié)將會(huì)詳細(xì)講解Spring

MVC框架。

spring-websocket模塊:Spring

4.0后新增的模塊,它提供了WebSocket和SockJS的實(shí)現(xiàn),主要是與Web前端的全雙工通訊的協(xié)議。

spring-webflux模塊:spring-webflux是一個(gè)新的非堵塞函數(shù)式ReactiveWeb框架,可以用來建立異步的、非阻塞、事件驅(qū)動(dòng)的服務(wù),并且擴(kuò)展性非常好。(該模塊是Spring

5新增模塊)。T

I

P

C

C教案6.TestTest(spring-test)模塊:支持使用JUnit或TestNG對(duì)Spring組件進(jìn)行單元測(cè)試和集成測(cè)試。T

I

P

C

C教案本章內(nèi)容Spring概述Spring開發(fā)環(huán)境的構(gòu)建Spring

IoCSpring

AOPSpring

BeanSpring的數(shù)據(jù)庫編程T

I

P

C

C教案1.2

Spring開發(fā)環(huán)境的構(gòu)建1.2.1使用Eclipse開發(fā)Java

Web應(yīng)用1.2.2

Spring的下載及目錄結(jié)構(gòu)1.2.3第一個(gè)Spring入門程序T

I

P

C

C教案1.2.1使用Eclipse開發(fā)Java

Web應(yīng)用eclipse-jee-2020-12-R-win32-x86_64自帶Java

SE

15,因此,使用此版本的Eclipse開發(fā)JavaWeb應(yīng)用,僅需對(duì)Web服務(wù)器和Eclipse進(jìn)行一些必要的配置。T

I

P

C

C教案Web服務(wù)器目前,比較常用的Web服務(wù)器包括Tomcat、JRun、Resin、WebSphere、WebLogic等,本書采用的是Tomcat

9.0。登錄Apache軟件基金會(huì)的官方網(wǎng)站

http://jakarta.A/tomcat,下載Tomcat9.0的免安裝版(本書采用的Tomcat是apache-tomcat-9.0.30-windows-x64.zip)。T

I

P

C

C教案安裝EclipseEclipse下載完成后,解壓到自己設(shè)置的路徑下,即可完成安裝。安裝Eclipse后,雙擊Eclipse安裝目錄下的eclipse.exe文件,啟動(dòng)Eclipse。T

I

P

C

C教案集成Tomcat啟動(dòng)Eclipse,選擇Window/Preferences菜單項(xiàng),在彈出的對(duì)話框中選擇Server/Runtime

Environments命令。在彈出的窗口中,單擊Add按鈕,彈出New

Server

RuntimeEnvironment界面,在此可以配置各種版本的Web服務(wù)器。T

I

P

C

C教案1.2

Spring開發(fā)環(huán)境的構(gòu)建1.2.1使用Eclipse開發(fā)Java

Web應(yīng)用1.2.2

Spring的下載及目錄結(jié)構(gòu)1.2.3第一個(gè)Spring入門程序T

I

P

C

C教案Spring的JAR包Spring官方網(wǎng)站升級(jí)后,建議通過Maven和Gradle下載。對(duì)于不使用Maven和Gradle下載的開發(fā)者,本書給出一個(gè)SpringFramework

JAR官方直接下載路徑:

/libs-release-local/org/springframework/spring/。本書采用的是spring-5.3.2-dist.zip。T

I

P

C

C教案commons.logging的JAR包Spring框架依賴于Apache

Commons

Logging組件,該組件的JAR包可以通過官方網(wǎng)站

/proper/commons-

logging/download_logging.cgi下載,本書下載的是

commons-logging-1.2-bin.zip,解壓縮后,即可找到

commons-logging-1.2.jar。對(duì)于Spring框架的初學(xué)者,開發(fā)Spring應(yīng)用時(shí),只需要將

Spring的四個(gè)基礎(chǔ)包和commons-logging-1.2.jar復(fù)制到Web應(yīng)用的WEB-INF/lib目錄下。?請(qǐng)思考當(dāng)您不明白需要哪些包咋辦?T

I

P

C

C教案1.2

Spring開發(fā)環(huán)境的構(gòu)建1.2.1使用Eclipse開發(fā)Java

Web應(yīng)用1.2.2

Spring的下載及目錄結(jié)構(gòu)1.2.3第一個(gè)Spring入門程序T

I

P

C

C教案1.2.3第一個(gè)Spring入門程序1.使用Eclipse創(chuàng)建Web應(yīng)用并導(dǎo)入相關(guān)JAR包2.創(chuàng)建接口TestDao3.創(chuàng)建接口TestDao的實(shí)現(xiàn)類TestDaoImpl4.創(chuàng)建配置文件applicationContext.xml5.創(chuàng)建測(cè)試類T

I

P

C

C教案1.使用Eclipse創(chuàng)建Web應(yīng)用并導(dǎo)入相關(guān)JAR包使用Eclipse創(chuàng)建一個(gè)名為ch1_1的Dynamic

Web

Project,并將Spring的4個(gè)基礎(chǔ)包和第三方依賴包c(diǎn)ommons-logging-1.2.jar復(fù)制到ch1_1的WEB-INF/lib目錄中。!注意:在講解Spring

MVC框架前,本書的實(shí)例并沒有真正運(yùn)行Web應(yīng)用。創(chuàng)建Web應(yīng)用的目的是方便添加相關(guān)JAR包。T

I

P

C

C教案2.創(chuàng)建接口TestDao在src目錄下,創(chuàng)建一個(gè)dao包,并在dao包中創(chuàng)建接口TestDao,接口中定義一個(gè)sayHello()方法。package

dao;public

interface

TestDao

{public

void

sayHello();}T

I

P

C

C教案3.創(chuàng)建接口TestDao的實(shí)現(xiàn)類TestDaoImpl在dao包下創(chuàng)建接口TestDao的實(shí)現(xiàn)類TestDaoImpl。package

dao;public

class

TestDaoImpl

implements

TestDao{@Overridepublic

void

sayHello()

{System.out.println("Hello,

Study

hard!");}}T

I

P

C

C教案4.創(chuàng)建配置文件applicationContext.xml在src目錄下,創(chuàng)建名為config的包,并在該包中,創(chuàng)建Spring的配置文件applicationContext.xml,在配置文件中使用實(shí)現(xiàn)類

TestDaoImpl創(chuàng)建一個(gè)id為test的Bean。<?xml

version="1.0"

encoding="UTF-8"?><beans

xmlns="/schema/beans"xmlns:xsi="/2001/XMLSchema-instance"xsi:schemaLocation="/schema/beans/schema/beans/spring-beans.xsd"><!--將指定類TestDaoImpl配置給Spring,讓Spring創(chuàng)建其實(shí)例--><bean

id="test"

class="dao.TestDaoImpl"

/></beans>!注意:配置文件的名稱可以自定義,但習(xí)慣上命名為applicationContext.xml,有時(shí)也命名為beans.xml。配置文件信息不需要讀者手寫,可以從Spring的幫助文檔中復(fù)制(首先使用瀏覽器打開\spring-framework-5.3.2\docs\reference\html\index.html,在頁面中單擊超鏈接Core,在1.2.1.Configuration

Metadata小節(jié)下即可找到配置文件的約束信息)。T

I

P

C

C教案5.創(chuàng)建測(cè)試類在src目錄下,創(chuàng)建一個(gè)test包,并在test包中創(chuàng)建Test類。public

class

Test

{public

static

void

main(String[]

args)

{//初始化Spring容器ApplicationContext,加載配置文件//@SuppressWarnings抑制警告的關(guān)鍵字,有泛型未指定類型@SuppressWarnings("resource")ApplicationContext

appCon

=

new

ClassPathXmlApplicationContext("config/applicationContext.x//通過容器獲取test實(shí)例TestDao

tt=(TestDao)appCon.getBean("test");//test為配置文件中的idtt.sayHello();}}T

I

P

C

C教案本章內(nèi)容Spring概述Spring開發(fā)環(huán)境的構(gòu)建Spring

IoCSpring

AOPSpring

BeanSpring的數(shù)據(jù)庫編程T

I

P

C

C教案1.3

Spring

IoC1.3.1

Spring

IoC的基本概念1.3.2

Spring的常用注解1.3.3基于注解的依賴注入T

I

P

C

C教案1.3.1

Spring

IoC的基本概念

控制反轉(zhuǎn)(IOC)是一個(gè)比較抽象的概念,是Spring框架的核心,用來消減計(jì)算機(jī)程序的耦合問題。依賴注入(DI)是IoC的另外一種說法,只是從不同的角度,描述相同的概念。?請(qǐng)思考:想吃面包,在沒有面包店和有面包店兩種情況下,您會(huì)怎么做??請(qǐng)思考:想調(diào)用一個(gè)Java類的對(duì)象,您怎么做?

當(dāng)Spring框架出現(xiàn)后,對(duì)象的實(shí)例不再由調(diào)用者來創(chuàng)建,而是由

Spring容器(比如面包店)來創(chuàng)建。Spring容器會(huì)負(fù)責(zé)控制程序之間的關(guān)系(比如面包店負(fù)責(zé)控制您與面包的關(guān)系),而不是由調(diào)用者的程序代碼直接控制。這樣,控制權(quán)由調(diào)用者轉(zhuǎn)移到Spring容器,控制權(quán)發(fā)生了反轉(zhuǎn),這就是Spring的控制反轉(zhuǎn)。T

I

P

C

C教案1.3

Spring

IoC1.3.1

Spring

IoC的基本概念1.3.2

Spring的常用注解1.3.3基于注解的依賴注入T

I

P

C

C教案1.3.2

Spring的常用注解在Spring框架中,盡管使用XML配置文件可以很簡(jiǎn)單地裝配

Bean(如1.2.3節(jié)),但如果應(yīng)用中有大量的Bean需要裝配時(shí),會(huì)導(dǎo)致XML配置文件過于龐大,不方便以后的升級(jí)維護(hù)。因此,更多時(shí)候推薦開發(fā)者使用注解(annotation)的方式去裝配

Bean。Spring框架基于AOP編程(1.4節(jié))實(shí)現(xiàn)注解解析,因此,在使用注解編程時(shí),需要導(dǎo)入spring-aop-5.3.2.jar包。T

I

P

C

C教案聲明Bean的注解1)@Component,該注解是一個(gè)泛化的概念,僅僅表示一個(gè)組件對(duì)象(Bean),可以作用在任何層次上,沒有明確的角色。2)@Repository,該注解用于將數(shù)據(jù)訪問層(DAO)的類標(biāo)識(shí)為Bean,即注解數(shù)據(jù)訪問層Bean。3)@Service,該注解用于標(biāo)注一個(gè)業(yè)務(wù)邏輯組件類(Service層。4)@Controller,該注解用于標(biāo)注一個(gè)控制器組件類(SpringMVC的Controller。@Repository、@Service和@Controller與@Component功能相同。T

I

P

C

C教案注入Bean的注解

1)@Autowired,該注解可以對(duì)類的成員變量、方法及構(gòu)造方法進(jìn)行標(biāo)注,完成自動(dòng)裝配的工作。通過@Autowired的使用來消除

setter和getter方法。默認(rèn)按照Bean的類型進(jìn)行裝配。

2)@Resource,該注解與@Autowired功能一樣。區(qū)別在于,該注解默認(rèn)是按照名稱來裝配注入的,只有當(dāng)找不到與名稱匹配的Bean才會(huì)按照類型來裝配注入;而@Autowired默認(rèn)按照Bean的類型進(jìn)行裝配,如果想按照名稱來裝配注入,則需要結(jié)合@Qualifier注解一起使用。Bean的實(shí)例名稱由@Qualifier注解的參數(shù)指定。

@Resource注解有兩個(gè)屬性:name和type。name屬性指定Bean的

實(shí)例名稱,即按照名稱來裝配注入;type屬性指定Bean類型,即按照Bean的類型進(jìn)行裝配。T

I

P

C

C教案1.3

Spring

IoC1.3.1

Spring

IoC的基本概念1.3.2

Spring的常用注解1.3.3基于注解的依賴注入T

I

P

C

C教案1.3.3基于注解的依賴注入Spring

IoC容器(ApplicationContext)負(fù)責(zé)創(chuàng)建和注入Bean。Spring提供使用XML配置、注解、Java配置以及groovy配置實(shí)

現(xiàn)Bean的創(chuàng)建和注入?!纠?-2】基于注解的依賴注入的使用過程。該實(shí)例的具體要求是:在Controller層中,依賴注入Service層;在Service層中,依賴注入DAO層。T

I

P

C

C教案使用Eclipse創(chuàng)建Web應(yīng)用并導(dǎo)入JAR包使用Eclipse創(chuàng)建一個(gè)名為ch1_2的Dynamic

Web

Project,并

將Spring的4個(gè)基礎(chǔ)包、spring-aop-5.3.2.jar和第三方依賴包

commons-logging-1.2.jar復(fù)制到ch1_2的WEB-INF/lib目錄中。T

I

P

C

C教案創(chuàng)建DAO層在src目錄中,創(chuàng)建名為annotation.dao的包,并在該包中創(chuàng)建

TestDao接口和TestDaoImpl實(shí)現(xiàn)類,并將實(shí)現(xiàn)類TestDaoImpl使用@Repository注解標(biāo)注為數(shù)據(jù)訪問層。T

I

P

C

C教案創(chuàng)建Service層在src目錄中,創(chuàng)建名為annotation.service的包,并在該包中創(chuàng)建TestService接口和TestSeviceImpl實(shí)現(xiàn)類,并將實(shí)現(xiàn)類

TestSeviceImpl使用@Service注解標(biāo)注為業(yè)務(wù)邏輯層。T

I

P

C

C教案創(chuàng)建Controller層在src目錄中,創(chuàng)建名為annotation.controller的包,并在該包中創(chuàng)建TestController類,并將TestController類使用

@Controller注解標(biāo)注為控制器層。T

I

P

C

C教案創(chuàng)建配置文件使用注解時(shí),在Spring的配置文件中需要使用

“<context:component-scan

base-package="Bean所在的包路徑"/>”語句掃描使用注解的包,Spring

IoC容器根據(jù)XML配置文件的掃描信息,提供包以及子包中使用注解的類的實(shí)例供應(yīng)用程序使用。在src目錄中,創(chuàng)建名為config的包,并在該包中創(chuàng)建名為

applicationContext.xml的配置文件。T

I

P

C

C教案創(chuàng)建測(cè)試類在src目錄中,創(chuàng)建名為annotation.test的包,并在該包中創(chuàng)建測(cè)試類TestAnnotation。public

class

TestAnnotation

{public

staticvoidmain(String[]

args)

{@SuppressWarnings("resource")ApplicationContext

appCon

=new

ClassPathXmlApplicationContext("config/applicationContext.xml");TestController

tt

=

(TestController)appCon.getBean("testController");tt.save();}}?請(qǐng)思考各層之間是如何依賴注入的?T

I

P

C

C教案本章內(nèi)容Spring概述Spring開發(fā)環(huán)境的構(gòu)建Spring

IoCSpring

AOPSpring

BeanSpring的數(shù)據(jù)庫編程T

I

P

C

C教案1.4

Spring

AOP1.4.1

Spring

AOP的基本概念1.4.2基于注解開發(fā)AspectJT

I

P

C

C教案AOP的概念A(yù)OP,即面向切面編程。它與OOP(Object-OrientedProgramming,面向?qū)ο缶幊蹋┫噍o相成,提供了與OOP不同的抽象軟件結(jié)構(gòu)的視角。在OOP中,以類作為程序的基本單元,而AOP中的基本單元是Aspect(切面)。AOP采取橫向抽取機(jī)制,即將分散在各個(gè)方法中的重復(fù)代碼提取出來,然后在程序編譯或運(yùn)行階段,再將這些抽取出來的代碼應(yīng)用到需要執(zhí)行的地方。這種橫向抽取機(jī)制,采用傳統(tǒng)的OOP是無法辦到的,因?yàn)镺OP實(shí)現(xiàn)的是父子關(guān)系的縱向重用。但是

AOP不是OOP的替代品,而是OOP的補(bǔ)充,它們相輔相成。T

I

P

C

C教案?請(qǐng)思考AOP的應(yīng)用場(chǎng)景T

I

P

C

C教案AOP的術(shù)語1)切面,切面(Aspect)是指封裝橫切到系統(tǒng)功能(如事務(wù)處理)的類。2)連接點(diǎn),連接點(diǎn)(Joinpoint)是指程序運(yùn)行中的一些時(shí)間點(diǎn),如方法的調(diào)用或異常的拋出。3)切入點(diǎn),切入點(diǎn)(Pointcut)是指那些需要處理的連接點(diǎn)。在Spring

AOP中,所有的方法執(zhí)行都是連接點(diǎn),而切入點(diǎn)是一

個(gè)描述信息,它修飾的是連接點(diǎn),通過切入點(diǎn)確定哪些連接點(diǎn)需要被處理。T

I

P

C

C教案切面、連接點(diǎn)和切入點(diǎn)的關(guān)系T

I

P

C

C教案AOP的術(shù)語

4)通知(增強(qiáng)處理),由切面添加到特定的連接點(diǎn)(滿足切入點(diǎn)規(guī)則)的一段代碼,可以將其理解為切面開啟后,切面的方法,切面的具體實(shí)現(xiàn)。

5)引入,引入(Introduction)允許在現(xiàn)有的實(shí)現(xiàn)類中添加自定義的方法和屬性。

6)目標(biāo)對(duì)象,目標(biāo)對(duì)象(Target

Object)是指所有被通知的對(duì)象。如果

AOP框架使用運(yùn)行時(shí)代理的方式(動(dòng)態(tài)的AOP)來實(shí)現(xiàn)切面,那么通知對(duì)象總是一個(gè)代理對(duì)象。7)代理,代理(Proxy)是通知應(yīng)用到目標(biāo)對(duì)象之后,被動(dòng)態(tài)創(chuàng)建的對(duì)象。

8)組入,組入(Weaving)是將切面代碼插入到目標(biāo)對(duì)象上,從而生成代理對(duì)象的過程。根據(jù)不同的實(shí)現(xiàn)技術(shù),AOP組入有三種方式:編譯器組入,需要有特殊的Java編譯器;類裝載期組入,需要有特殊的類裝載器;動(dòng)態(tài)代理組入,在運(yùn)行期為目標(biāo)類添加通知生成子類的方式。Spring

AOP框架默認(rèn)采用動(dòng)態(tài)代理組入,而AspectJ(基于Java語言的AOP框架)采用編譯器組入和類裝載器組入。T

I

P

C

C教案1.4

Spring

AOP1.4.1

Spring

AOP的基本概念1.4.2基于注解開發(fā)AspectJT

I

P

C

C教案1.4.2基于注解開發(fā)AspectJ

1.環(huán)繞通知,是在目標(biāo)方法執(zhí)行前和執(zhí)行后實(shí)施增強(qiáng),可以應(yīng)用于日志記錄、事務(wù)處理等。2.前置通知,是在目標(biāo)方法執(zhí)行前實(shí)施增強(qiáng),可應(yīng)用于權(quán)限管理等。

3.后置返回通知,是在目標(biāo)方法成功執(zhí)行后實(shí)施增強(qiáng),可應(yīng)用于關(guān)閉流、刪除臨時(shí)文件等。

4.后置(最終)通知,是在目標(biāo)方法執(zhí)行后實(shí)施增強(qiáng),與后置返回通知不同的是,不管是否發(fā)生異常都要執(zhí)行該通知,可應(yīng)用于釋放資源。

5.異常通知,是在方法拋出異常后實(shí)施增強(qiáng),可以應(yīng)用于處理異常、記錄日志等。

6.引入通知,是在目標(biāo)類中添加一些新的方法和屬性,可以應(yīng)用于修改目標(biāo)類(增強(qiáng)類)。T

I

P

C

C教案AspectJ注解注解名稱@Aspect@Pointcut描

述用于定義一個(gè)切面,注解在切面類上用于定義切入點(diǎn)表達(dá)式。在使用時(shí),需要定義一個(gè)切入點(diǎn)方法。該方法是一個(gè)返回值void,且方法體為空的普通方法用于定義前置通知。在使用時(shí),通常為其指定value屬性值,該值可以是已有的切入點(diǎn),也可以直接定義切入點(diǎn)表達(dá)式用于定義后置返回通知。在使用時(shí),通常為其指定value屬性值,該值可以是已有的切入點(diǎn),也可以直接定義切入點(diǎn)表達(dá)式用于定義環(huán)繞通知。在使用時(shí),通常為其指定value屬性值,該值可以是已有的切入點(diǎn),也可以直接定義切入點(diǎn)表達(dá)式用于定義異常通知。在使用時(shí),通常為其指定value屬性值,該值可以是已有的切入點(diǎn),也可以直接定義切入點(diǎn)表達(dá)式。另外,還有一個(gè)throwing屬性用于訪問目標(biāo)方法拋出的異常,該屬性值與異常通知方法中同名的形參一致用于定義后置(最終)通知。在使用時(shí),通常為其指定value屬性值,該值可以是已有的切入點(diǎn),也可以直接定義切入點(diǎn)表達(dá)式@Before@AfterReturning@Around@AfterThrowing@AfterT

I

P

C

C教案實(shí)例講解基于注解開發(fā)AspectJ的過程【例1-3】基于注解開發(fā)AspectJ的過程。該實(shí)例的具體要求是:首先,在DAO層的實(shí)現(xiàn)類中,定義save、modify和delete三個(gè)待增強(qiáng)的方法;然后,使用@Aspect注解定義一個(gè)切面,在該切面中定義各類型通知,增強(qiáng)DAO層中的save、modify和delete方法。T

I

P

C

C教案1.使用Eclipse創(chuàng)建Web應(yīng)用并導(dǎo)入JAR包使用Eclipse創(chuàng)建一個(gè)名為ch1_3的Dynamic

Web

Project,除了將

Spring的4個(gè)基礎(chǔ)包、spring-aop-5.3.2.jar和第三方依賴包

commons-logging-1.2.jar復(fù)制到ch1_3的WEB-INF/lib目錄中外,還需要將Spring為AspectJ框架提供的實(shí)現(xiàn)spring-aspects-5.3.2.jar以及AspectJ框架所提供的規(guī)范包aspectjweaver-xxx.jar復(fù)制到WEB-INF/lib目錄中。AspectJ框架所提供的規(guī)范包aspectjweaver-xxx.jar,可通過地址

“/artifact/org.aspectj/aspectjweaver”下載,本書使用的是aspectjweaver-1.9.6.jar。T

I

P

C

C教案2.創(chuàng)建接口及實(shí)現(xiàn)類在src目錄中,創(chuàng)建一個(gè)名為aspectj.dao的包,并在該包中創(chuàng)建接口TestDao和接口實(shí)現(xiàn)類TestDaoImpl。該實(shí)現(xiàn)類作為目標(biāo)類,在切面類中對(duì)其方法進(jìn)行增強(qiáng)處理。使用注解@Repository將目標(biāo)類aspectj.dao.TestDaoImpl注解為目標(biāo)對(duì)象。T

I

P

C

C教案3.創(chuàng)建切面類在src目錄中,創(chuàng)建一個(gè)名為aspectj.annotation的包,并在該包中創(chuàng)建切面類MyAspect。在該類中,首先使用@Aspect注解

定義一個(gè)切面類,由于該類在Spring中是作為組件使用的,所以還需要使用@Component注解。然后,使用@Pointcut注解定義切入點(diǎn)表達(dá)式,并通過切定面類義My方Aspe法ct來表示切入點(diǎn)名稱。最后在每個(gè)通知方法上添加相應(yīng)的注解,并將切入點(diǎn)名稱作為參數(shù)傳遞給需要執(zhí)行增強(qiáng)的通知方法。?請(qǐng)思考切面類MyAspect被@Component注解的目的是?T

I

P

C

C教案4.創(chuàng)建配置文件在src目錄中,創(chuàng)建一個(gè)名為aspectj.config的包,并在該包中創(chuàng)建配置文件applicationContext.xml,在配置文件中指定需要掃描的包,使注解生效。同時(shí),需要啟動(dòng)基于注解的AspectJ支持。T

I

P

C

C教案5.創(chuàng)建測(cè)試類在src目錄中,創(chuàng)建一個(gè)名為aspectj.test的包,并在該包中創(chuàng)建測(cè)試類AspectjAOPTest。public

static

void

main(String[]

args)

{@SuppressWarnings("resource")ApplicationContext

appCon

=new

ClassPathXmlApplicationContext("aspectj/config/applicationContext.xml");//從容器中,獲取增強(qiáng)后的目標(biāo)對(duì)象TestDao

testDaoAdvice

=

(TestDao)appCon.getBean("testDao");//執(zhí)行方法testDaoAdvice.save();System.out.println("==============");testDaoAdvice.modify();System.out.println("==============");testDaoAdvice.delete();}T

I

P

C

C教案6.運(yùn)行測(cè)試類T

I

P

C

C教案本章內(nèi)容Spring概述Spring開發(fā)環(huán)境的構(gòu)建Spring

IoCSpring

AOPSpring

BeanSpring的數(shù)據(jù)庫編程T

I

P

C

C教案1.5

Spring

Bean1.5.1

Bean的實(shí)例化1.5.2

Bean的作用域1.5.3

Bean的初始化和銷毀T

I

P

C

C教案1.5.1

Bean的實(shí)例化在面向?qū)ο缶幊讨?,想使用某個(gè)對(duì)象時(shí),需要事先實(shí)例化該對(duì)象。同樣,在Spring框架中,想使用Spring容器中的Bean,也需要實(shí)例化Bean。Spring框架實(shí)例化Bean有三種方式:構(gòu)造方法實(shí)

例化、靜態(tài)工廠實(shí)例化和實(shí)例工廠實(shí)例化(其中,最常用的實(shí)例方法是構(gòu)造方法實(shí)例化)。【例1-4】Bean的實(shí)例化過程。該實(shí)例的具體要求是:分別使用構(gòu)造方法、靜態(tài)工廠和實(shí)例工廠實(shí)例化Bean。T

I

P

C

C教案1.使用Eclipse創(chuàng)建Web應(yīng)用并導(dǎo)入相關(guān)JAR包使用Eclipse創(chuàng)建一個(gè)名為ch1_4的Dynamic

Web

Project,并將Spring的4個(gè)基礎(chǔ)包和第三方依賴包c(diǎn)ommons-logging-1.2.jar復(fù)制到ch1_4的WEB-INF/lib目錄中。T

I

P

C

C教案2.創(chuàng)建實(shí)例化Bean的類在src目錄中,創(chuàng)建一個(gè)名為instance的包,并在該包中創(chuàng)建

BeanClass、BeanInstanceFactory以及BeanStaticFactory等實(shí)例化Bean的類。package

instance;public

class

BeanClass

{public

String

message;public

BeanClass()

{message="構(gòu)造方法實(shí)例化Bean";}public

BeanClass(String

s)

{message

=

s;}}package

instance;public

class

BeanInstanceFactory

{public

BeanClass

createBeanClassInstance()

{return

new

BeanClass("調(diào)用實(shí)例工廠方法實(shí)例化Bean");}}package

instance;public

class

BeanStaticFactory

{private

static

BeanClass

beanInstance=new

BeanClass("調(diào)用靜態(tài)工廠方法實(shí)例化Bean");public

static

BeanClass

createInstance()

{return

beanInstance;}}T

I

P

C

C教案3.創(chuàng)建配置文件在src目錄中,創(chuàng)建名為config的包,并在該包中創(chuàng)建名為

applicationContext.xml的配置文件,在配置文件中分別使用

BeanClass、BeanInstanceFactory以及BeanStaticFactory實(shí)例化Bean。<!--構(gòu)造方法實(shí)例化Bean--><bean

id="constructorInstance"

class="instance.BeanClass"/><!--靜態(tài)工廠方法實(shí)例化Bean,createInstance為靜態(tài)工廠類BeanStaticFactory中的靜態(tài)方法--><bean

id="staticFactoryInstance"

class="instance.BeanStaticFactory"

factory-method="createInstance"/><!--配置工廠--><bean

id="myFactory"

class="instance.BeanInstanceFactory"/><!--使用factory-bean屬性指定配置工廠,使用factory-method屬性指定使用工廠中哪個(gè)方法實(shí)例化Bean--><bean

id="instanceFactoryInstance"

factory-bean="myFactory"

factory-method="createBeanClassInstance"/>T

I

P

C

C教案4.創(chuàng)建測(cè)試類在src目錄中,創(chuàng)建test包,并在該包中創(chuàng)建測(cè)試類pubTleicsctlaIsnssTetsatInncstean。ce{public

static

void

main(String[]

args)

{@SuppressWarnings("resource")ApplicationContext

appCon

=new

ClassPathXmlApplicationContext("config/applicationContext.xml");//測(cè)試構(gòu)造方法實(shí)例化BeanBeanClass

b1

=

(BeanClass)appCon.getBean("constructorInstance");System.out.println(b1+

b1.message);//測(cè)試靜態(tài)工廠方法實(shí)例化BeanBeanClass

b2

=

(BeanClass)appCon.getBean("staticFactoryInstance");System.out.println(b2

+

b2.message);//測(cè)試實(shí)例工廠方法實(shí)例化BeanBeanClass

b3

=

(BeanClass)appCon.getBean("instanceFactoryInstance");System.out.println(b3

+

b3.message);}T

I

P

C

C教案5.運(yùn)行測(cè)試類T

I

P

C

C教案1.5

Spring

Bean1.5.1

Bean的實(shí)例化1.5.2

Bean的作用域1.5.3

Bean的初始化和銷毀T

I

P

C

C教案1.5.2

Bean的作用域作用域名稱singleton描述默認(rèn)的作用域,使用singleton定義的Bean在Spring容器中只有一個(gè)Bean實(shí)例。Spring容器每次獲取prototype定義的Bean,容器都將創(chuàng)建一個(gè)新的Bean實(shí)例。在一次HTTP請(qǐng)求中容器將返回一個(gè)Bean實(shí)例,不同的HTTP請(qǐng)求返回不同的Bean實(shí)例。僅在WebSpring應(yīng)用程序上下文中使用。在一個(gè)HTTP

Session中,容器將返回同一個(gè)Bean實(shí)例。僅在Web

Spring應(yīng)用程序上下文中使用。為每個(gè)ServletContext對(duì)象創(chuàng)建一個(gè)實(shí)例,即同一個(gè)應(yīng)用共享一個(gè)Bean實(shí)例。僅在Web

Spring應(yīng)用程序上下文中使用。為每個(gè)WebSocket對(duì)象創(chuàng)建一個(gè)Bean實(shí)例。僅在Web

Spring應(yīng)用程序上下文中使用。prototyperequestsessionapplicationwebsocketT

I

P

C

C教案【例1-5】Bean的作用域該實(shí)例的具體要求是:在應(yīng)用ch1_4中,分別定義作用域?yàn)?/p>

singleton和prototype的兩個(gè)Bean。T

I

P

C

C教案1.添加配置文件內(nèi)容在應(yīng)用ch1_4的配置文件applicationContext.xml中,定義2個(gè)Bean,1個(gè)Bean的作用域?yàn)閟ingleton,1個(gè)Bean的作用域?yàn)?/p>

prototype。<bean

id="scope1"

class="instance.BeanClass"

scope="singleton"/><bean

id="scope2"

class="instance.BeanClass"

scope="prototype"/>T

I

P

C

C教案2.創(chuàng)建測(cè)試類在應(yīng)用ch1_4的test包中,創(chuàng)建測(cè)試類TestScope,在該測(cè)試類中分別獲得id為scope1和scope2的Bean實(shí)例。public

class

TestScope

{public

staticvoid

main(String[]

args)

{@SuppressWarnings("resource")ApplicationContext

appCon

=new

ClassPathXmlApplicationContext("config/applicationContext.xml");BeanClass

b1

=

(BeanClass)appCon.getBean("scope1");System.out.println(b1);BeanClass

b2

=

(BeanClass)appCon.getBean("scope1");System.out.println(b2);System.out.println("==========");BeanClass

b3

=

(BeanClass)appCon.getBean("scope2");System.out.println(b3);BeanClass

b4

=

(BeanClass)appCon.getBean("scope2");System.out.println(b4);}}T

I

P

C

C教案3.運(yùn)行測(cè)試類兩次獲取id為scope1的Bean實(shí)例時(shí),IoC容器返回兩個(gè)相同的Bean實(shí)例;而兩次獲取id為scope2的Bean實(shí)例時(shí),IoC容器返回兩個(gè)不同的Bean實(shí)例。?請(qǐng)思考:為什么是這種現(xiàn)象?T

I

P

C

C教案1.5

Spring

Bean1.5.1

Bean的實(shí)例化1.5.2

Bean的作用域1.5.3

Bean的初始化和銷毀T

I

P

C

C教案1.5.3

Bean的初始化和銷毀在實(shí)際工程應(yīng)用中,經(jīng)常需要在Bean使用之前或之后做些必要的操作,Spring為Bean生命周期的操作提供了支持。在配置文件中定義Bean時(shí),可以使用init-method和destroy-method屬性對(duì)Bean進(jìn)行初始化和銷毀。【例1-6】Bean的初始化和銷毀。該實(shí)例的具體要求是:在應(yīng)用

ch1_4中,首先,定義一個(gè)MyService類,在該類中定義初始化方法和銷毀方法;然后,在配置文件中,使用init-method和destroy-method屬性對(duì)MyService的Bean對(duì)象進(jìn)行初始化和銷毀。T

I

P

C

C教案1.創(chuàng)建Bean的類在應(yīng)用ch1_4的src目錄中,創(chuàng)建一個(gè)名為service的包,并在該包中創(chuàng)建MyService類。package

service;

public

class

MyService

{public

MyService()

{System.out.println("執(zhí)行構(gòu)造方法");}public

void

initService()

{System.out.println("initMethod");}public

void

destroyService()

{System.out.println("destroyMethod");}}T

I

P

C

C教案2.添加配置文件內(nèi)容在應(yīng)用ch1_4的配置文件applicationContext.xml中,配置1個(gè)id為beanLife的Bean,并使用init-method屬性指定初始化方法,使用destroy-method屬性指定銷毀方法。<!--配置bean,使用init-method屬性指定初始化方法,使用destroy-method屬性指定銷毀方法--><bean

id="beanLife"

class="service.MyService"

init-method="initService"

destroy-method="destroyServiceT

I

P

C

C教案3.創(chuàng)建測(cè)試類在應(yīng)用ch1_4的test包中,創(chuàng)建測(cè)試類TestInitAndDestroy。public

class

TestInitAndDestroy

{public

static

void

main(String[]

args)

{//為了方便演示銷毀方法的執(zhí)行,這里使用ClassPathXmlApplicationContextClassPathXmlApplicationContext

appCon=new

ClassPathXmlApplicationContext("config/applicationContext.xml");System.out.println("獲得對(duì)象前");MyService

blife=(MyService)appCon.getBean("beanLife");System.out.println("獲得對(duì)象后"+blife);appCon.close();//關(guān)閉容器,銷毀Bean對(duì)象}}T

I

P

C

C教案4.運(yùn)行測(cè)試類從圖可以看出,加載配置文件時(shí),創(chuàng)建Bean對(duì)象,執(zhí)行了Bean的構(gòu)造方法和

初始化方法initService();獲得對(duì)象后,關(guān)閉容器時(shí),執(zhí)行了Bean的銷毀方法destroyService()。T

I

P

C

C教案本章內(nèi)容Spring概述Spring開發(fā)環(huán)境的構(gòu)建Spring

IoCSpring

AOPSpring

BeanSpring的數(shù)據(jù)庫編程T

I

P

C

C教案1.6

Spring的數(shù)據(jù)庫編程1.6.1

Spring

JDBC的XML配置1.6.2

Spring

JdbcTemplate的常用方法1.6.3基于@Transactional注解的聲明式事務(wù)管理1.6.4如何在事務(wù)處理中捕獲異常T

I

P

C

C教案1.6.1

Spring

JDBC的XML配置Spring數(shù)據(jù)庫編程主要使用Spring

JDBC模塊的core和dataSource包。core包是JDBC的核心功能包,包括常用的

JdbcTemplate類;dataSource包是訪問數(shù)據(jù)源的工具類包。使用Spring

JDBC操作數(shù)據(jù)庫,需要對(duì)其進(jìn)行配置。<!--配置數(shù)據(jù)源--><bean

id="dataSource"

class="org.springframework.jdbc.datasource.DriverManagerDataSource"><!--MySQL數(shù)據(jù)庫驅(qū)動(dòng)--><property

name="driverClassName"

value="com.mysql.jdbc.Driver"/><!--連接數(shù)據(jù)庫的URL--><property

name="url"

value="jdbc:mysql://localhost:3306/springtest?characterEncoding=utf8"/><!--連接數(shù)據(jù)庫的用戶名--><property

name="username"

value="root"/><!--連接數(shù)據(jù)庫的密碼--><property

name="password"

value="root"/></bean><!--配置JDBC模板--><bean

id="jdbcTemplate"

class="org.springframework.jdbc.core.JdbcTemplate"><property

name="dataSource"

ref="dataSource"/></bean>@Repositorypublic

class

TestDaoImpl

implements

TestDao{@Autowired//使用配置文件中的JDBC模板private

JdbcTemplate

jdbcTemplate;……}T

I

P

C

C教案1.6

Spring的數(shù)據(jù)庫編程1.6.1

Spring

JDBC的XML配置1.6.2

Spring

JdbcTemplate的常用方法1.6.3基于@Transactional注解的聲明式事務(wù)管理1.6.4如何在事務(wù)處理中捕獲異常T

I

P

C

C教案1.6.2

Spring

JdbcTemplate的常用方法(1)public

int

update(String

sql,Object

args[])該方法可以對(duì)數(shù)據(jù)表進(jìn)行增加、修改、刪除等操作。使用args[]設(shè)置SQL語句中的參數(shù),并返回更新的行數(shù)。String

insertSql="insert

into

user

values(null,?,?)";Object

param1[]={"chenheng1","男"};

jdbcTemplate.update(sql,param1);(2)public

List<T>

query

(String

sql,

RowMapper<T>rowMapper,

Object

args[])該方法可以對(duì)數(shù)據(jù)表進(jìn)行查詢操作。rowMapper將結(jié)果集映射到用戶自定義的類中(前提是自定義類中的屬性與數(shù)據(jù)表的字段對(duì)應(yīng))。String

selectSql

="select

*

from

user";RowMapper<MyUser>

rowMapper

=

new

BeanPropertyRowMapper<MyUser>(MyUser.class);List<MyUser>

list

=

jdbcTemplate.query(sql,

rowMapper,

null);T

I

P

C

C教案【例1-7】Spring

JDBC的使用過程。該實(shí)例的具體要求是:首先,在MySQL數(shù)據(jù)庫中創(chuàng)建數(shù)據(jù)表

user;然后,使用Spring

JDBC對(duì)數(shù)據(jù)表user進(jìn)行增刪改查。T

I

P

C

C教案1.使用Eclipse創(chuàng)建Web應(yīng)用并導(dǎo)入相關(guān)JAR包使用Eclipse創(chuàng)建一個(gè)名為ch1_5的Dynamic

Web

Project,除了將Spring的4個(gè)基礎(chǔ)包和第三方依賴包c(diǎn)ommons-logging-1.2.jar復(fù)制到ch1_5的WEB-INF/lib目錄中,還需要將MySQL數(shù)據(jù)庫的連接驅(qū)動(dòng)JAR包(mysql-connector-java-5.1.45-bin.jar)、Spring

JDBC(spring-jdbc-5.3.2.jar)、Spring事務(wù)處理(spring-tx-5.3.2.jar)以及Spring

AOP的JAR包(spring-aop-5.3.2.jar)復(fù)制到WEB-INF/lib目錄中。T

I

P

C

C教案2.創(chuàng)建配置文件在src目錄中,創(chuàng)建名為config的包,并在該包中創(chuàng)建名為

applicationContext.xml的配置文件,在配置文件中配置數(shù)據(jù)源和JDBC模板。T

I

P

C

C教案3.創(chuàng)建數(shù)據(jù)表與實(shí)體類package

entity;public

class

MyUser

{private

Integer

uid;private

String

uname;private

String

usex;//省略set和get方法public

String

toString()

{return

"myUser

[uid="

+

uid

+",

uname="

+

uname

+

",

usex="

+

usex

+

"]";}}T

I

P

C

C教案4.創(chuàng)建數(shù)據(jù)訪問層在應(yīng)用ch1_5的src目錄中,創(chuàng)建一個(gè)名為dao的包,在該包中創(chuàng)建數(shù)據(jù)訪問接口TestDao和接口實(shí)現(xiàn)類TestDaoImpl。在實(shí)現(xiàn)類

TestDaoImpl中使用@Repository注解標(biāo)注此類為數(shù)據(jù)訪問層,并使用@Autowired注解依賴注入JdbcTemplate。T

I

P

C

C教案5.創(chuàng)建業(yè)務(wù)邏輯層在應(yīng)用ch1_5的src目錄中,創(chuàng)建一個(gè)名為service的包,在該包

中創(chuàng)建數(shù)據(jù)訪問接口TestService和接口實(shí)現(xiàn)類TestServiceImpl

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(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)論