Java Web 開發(fā)從入門到實(shí)踐課件 第12章 - Maven和Spring Boot框架_第1頁
Java Web 開發(fā)從入門到實(shí)踐課件 第12章 - Maven和Spring Boot框架_第2頁
Java Web 開發(fā)從入門到實(shí)踐課件 第12章 - Maven和Spring Boot框架_第3頁
Java Web 開發(fā)從入門到實(shí)踐課件 第12章 - Maven和Spring Boot框架_第4頁
Java Web 開發(fā)從入門到實(shí)踐課件 第12章 - Maven和Spring Boot框架_第5頁
已閱讀5頁,還剩63頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

JavaWeb開發(fā)從入門到實(shí)踐JavaWebDevelopmentFromIntroductiontoPracticeMaven和SpringBoot框架Chap12提綱Maven和SpringBoot框架本章介紹了Maven項(xiàng)目管理工具用于自動化構(gòu)建和依賴管理,SpringBoot簡化了Spring應(yīng)用的開發(fā)與配置,并通過IoC/DI和AOP機(jī)制提供了靈活的依賴管理和功能增強(qiáng),幫助開發(fā)者高效構(gòu)建現(xiàn)代Java應(yīng)用。12.1Maven項(xiàng)目管理工具12.2SpringBoot入門12.3SpringBoot應(yīng)用12.4Spring之IoC/DI12.5Spring之AOP12.6本章小結(jié)12.1Maven項(xiàng)目管理工具12.1.1Maven簡介12.1.2IDEA集成Maven12.1.3使用IDEA創(chuàng)建第一個Maven項(xiàng)目12.1.4依賴管理12.1.1Maven簡介Maven是一個項(xiàng)目管理和構(gòu)建工具,將項(xiàng)目開發(fā)和管理過程抽象成一個項(xiàng)目對象模型(POM)。(1)方便的依賴管理。(2)統(tǒng)一的項(xiàng)目結(jié)構(gòu)。(3)標(biāo)準(zhǔn)的項(xiàng)目構(gòu)建流程。倉庫是Maven工具的一個重要的概念。倉庫用于存儲資源和管理各種jar包。根據(jù)資源、jar包存儲位置可以分為以下三種倉庫。(1)本地倉庫:資源、jar包存儲在本機(jī)的倉庫。(2)遠(yuǎn)程倉庫(私服):一般由公司團(tuán)隊(duì)搭建的私有倉庫。(3)中央倉庫。中央倉庫是一個公共的、可訪問的Maven倉庫,它包含大量的依賴庫,倉庫地址為“/”。簡介12.1.1Maven簡介(1)下載好Maven工具后進(jìn)行解壓(2)配置本地倉庫。修改Maven中conf目錄下的settings.xml文件,將文件中的localRepository修改為本機(jī)倉庫位置安裝Maven<localRepository>D:\ProgramFiles(x86)\apache-maven-3.8.4\repository</localRepository>(3)配置遠(yuǎn)程倉庫(阿里云私服)修改Maven中conf目錄下settings.xml文件的<mirrors>標(biāo)簽,添加子標(biāo)簽<mirrors> <mirror> <id>alimaven</id> <mirrorOf>central</mirrorOf> <name>aliyunmaven</name> <url>/nexus/content/groups/public</url> </mirror></mirrors>12.1.1Maven簡介(4)配置環(huán)境變量。在控制面板中,可以通過右擊此電腦選擇“屬性→高級系統(tǒng)設(shè)置→環(huán)境變量”來配置環(huán)境變量。圖

12-1

配置環(huán)境變量12.1.1Maven簡介(5)測試安裝結(jié)果圖

12-2測試Maven安裝結(jié)果打開“命令提示符”窗口,輸入“mvn-v”12.1.2IDEA集成Maven在實(shí)際開發(fā)中,一般將Maven整合到IDEA中使用,IDEA集成Maven的具體步驟如下(1)首次打開IDEA工具,進(jìn)入歡迎頁面(非首次打開,點(diǎn)擊“File→CloseProject”進(jìn)入歡迎頁面),選中“Customize”,點(diǎn)擊“Allsettings”進(jìn)入設(shè)置界面,如圖12-3所示。圖

12-3

歡迎頁面12.1.2IDEA集成Maven(2)設(shè)置Maven安裝目錄、settings.xml文件目錄和本地倉庫目錄圖

12-4配置Maven12.1.2IDEA集成Maven(3)設(shè)置JRE圖

12-5設(shè)置JRE12.1.2IDEA集成Maven(4)設(shè)置JavaCompiler圖

12-6設(shè)置JavaCompiler12.1.3使用IDEA創(chuàng)建第一個Maven項(xiàng)目創(chuàng)建Maven項(xiàng)目在歡迎界面,點(diǎn)擊“NewProject”,設(shè)置項(xiàng)目名稱、保存路徑、JDK,Language選中“Java”,Buildsystem選中“Maven”,設(shè)置坐標(biāo)信息圖

12-7創(chuàng)建Maven項(xiàng)目Maven坐標(biāo)主要由以下三部分組成。(1)GroupId:定義當(dāng)前Maven項(xiàng)目隸屬的組織名稱,通常是公司域名的倒序。(2)ArtifactId:定義當(dāng)前Maven項(xiàng)目名稱。(3)Version:版本號。版本號也可以創(chuàng)建好項(xiàng)目后進(jìn)行修改,在pom.xml文件中修改。12.1.3使用IDEA創(chuàng)建第一個Maven項(xiàng)目創(chuàng)建Maven項(xiàng)目,目錄結(jié)構(gòu)如圖12-8所示。圖

12-8創(chuàng)建Maven項(xiàng)目12.1.3使用IDEA創(chuàng)建第一個Maven項(xiàng)目項(xiàng)目坐標(biāo)<groupId>com.swxy</groupId><artifactId>maven-project01</artifactId><version>1.0-SNAPSHOT</version>12.1.3使用IDEA創(chuàng)建第一個Maven項(xiàng)目導(dǎo)入其他Maven項(xiàng)目在Maven項(xiàng)目中通過會訪問其它的Maven項(xiàng)目,可以通過導(dǎo)入的方式引入其他項(xiàng)目。引入其他Maven項(xiàng)目有以下二種方式。(1)選擇右側(cè)Maven面板,點(diǎn)擊“+”號,如圖12-9所示。在彈出窗口中選中對應(yīng)項(xiàng)目的pom.xml文件,雙擊即可,如圖12-10所示。圖

12-9導(dǎo)入Maven項(xiàng)目圖

12-10選中pom.xml文件12.1.3使用IDEA創(chuàng)建第一個Maven項(xiàng)目(2)選擇“File→ProjectStructure→Modules→點(diǎn)擊‘+’號→ImportModule”,選中待導(dǎo)入項(xiàng)目的pom.xml文件即可圖

12-11選中pom.xml文件12.1.4依賴管理依賴配置依賴是指當(dāng)前項(xiàng)目運(yùn)行所需要的jar包。一個項(xiàng)目可以引入多個依賴。例如,Maven項(xiàng)目中引入logback依賴<dependencies>

<dependency>

<groupId>ch.qos.logback</groupId> <artifactId>logback-classic</artifactId>

<version>1.4.14</version>

</dependency>

</dependencies>12.1.4依賴管理添加依賴后,點(diǎn)擊右上角的“l(fā)oad

maven

changes”圖標(biāo),引入最新加入的坐標(biāo),如圖12-12所示。圖

12-12加載Maven12.1.4依賴管理依賴傳遞依賴具有傳遞性,包括直接依賴和間接依賴。(1)直接依賴:在當(dāng)前項(xiàng)目中通過依賴配置建立的依賴關(guān)系。(2)間接依賴:被依賴的資源如果依賴其他資源,當(dāng)前項(xiàng)目間接依賴其他資源。排除依賴排除依賴指主動斷開依賴的資源,被排除的資源無需指定版本。

12.1.4依賴管理案例:排除依賴創(chuàng)建項(xiàng)目“maven-project01”和“maven-project02”,項(xiàng)目“maven-project01”引入單元測試依賴和“maven-project02”依賴,觀察依賴關(guān)系,接著排除依賴后再觀察依賴關(guān)系。(1)創(chuàng)建Maven項(xiàng)目“maven-project02”,在項(xiàng)目中添加單元測試依賴<dependencies>

<dependency>

<groupId>junit</groupId>

<artifactId>junit</artifactId>

<version>4.13.2</version>

</dependency>

</dependencies>12.1.4依賴管理(2)在Maven項(xiàng)目“maven-project01”中引入“maven-project02”依賴,并移除junit依賴<dependencies> ... <dependency> <groupId>com.swxy</groupId> <artifactId>maven-project02</artifactId> <version>1.0-SNAPSHOT</version> <exclusions> <exclusion> <groupId>junit</groupId> <artifactId>junit</artifactId> </exclusion> </exclusions> </dependency></dependencies>12.1.4依賴管理上述代碼中,在添加“<exclusions>”標(biāo)簽前,項(xiàng)目“maven-project01”間接依賴“junit”,如圖12-13所示。添加“<exclusions>”標(biāo)簽后,項(xiàng)目不能間接依賴“junit”,如圖12-14所示。圖

12-13未排除junit依賴圖

12-14已排除junit依賴12.1.4依賴管理在項(xiàng)目“maven-project01”的pom.xml文件中,右擊“Diagrams->ShowDiagram...”,如圖12-15所示。項(xiàng)目“maven-project01”(未排除“maven-project02”依賴)的依賴關(guān)系如圖12-16所示。圖

12-16依賴關(guān)系12.1.4依賴管理依賴范圍默認(rèn)情況下,Maven項(xiàng)目依賴的jar包可以在任何地方可以使用。也可以通過<scope>標(biāo)簽設(shè)置其作用范圍,作用范圍有以下三種。(1)主程序范圍有效。項(xiàng)目main文件夾內(nèi)有效。(2)測試程序范圍有效。項(xiàng)目test文件夾內(nèi)有效。(3)是否參與打包運(yùn)行。package指令范圍內(nèi)有效。設(shè)置測試程序范圍有<dependency>

<groupId>junit</groupId>

<artifactId>junit</artifactId>

<version>4.13.2</version>

<scope>test</scope></dependency>12.1.4依賴管理表

12-1

依賴包的scope取值及其作用范圍scope取值主程序測試程序是否參與打包c(diǎn)ompile(默認(rèn))是是是test-是-provided是是-runtime-是是12.1.4依賴管理生命周期Maven生命周期是對構(gòu)建過程的一種抽象,它包括清理、編譯、測試、打包等一系列構(gòu)建步驟。Maven中有以下三套相互獨(dú)立的生命周期。(1)clean:清理工作。包含pre-clean、clean和post-clean三個階段。(2)default:核心工作,例如,編譯、測試、打包、安裝等。(3)site:生成報(bào)告、發(fā)布站點(diǎn)等。常用的五個生命周期階段(1)clean:移除上一次構(gòu)建生成的文件。(2)compile:編譯項(xiàng)目源代碼。(3)test:使用合適的單元測試框架運(yùn)行測試編譯后的源代碼。(4)package:將編譯后的文件打包,如:jar、war等。(5)install:安裝項(xiàng)目到本地倉庫,以作為本地其他項(xiàng)目中的依賴項(xiàng)。12.1.4依賴管理執(zhí)行指定生命周期的方法:在IDEA工具右側(cè)的Maven工具欄,雙擊生命周期對應(yīng)的階段圖

12-17執(zhí)行生命周期的打包階段12.2SpringBoot入門12.2.1SpringBoot框架12.2.2SpringBoot快速入門12.2.1SpringBoot框架Spring是一個開源的控制反轉(zhuǎn)(InversionofControl,IoC)和面向切面(AOP)的容器框架。SpringBoot是一個開源的Java框架,旨在簡化Spring應(yīng)用程序的創(chuàng)建和部署過程,SpringBoot基于Spring開發(fā),不是為了取代Spring,而是為了讓人們更容易的使用Spring。12.2.2SpringBoot快速入門案例:SpringBoot工程的搭建(1)創(chuàng)建SpringBoot工程,并勾選web開發(fā)相關(guān)依賴,JDK選中17,Java選中17,如圖12-18所示。點(diǎn)擊“Next”按鈕,進(jìn)入下一個界面,SpringBoot選中3.1.7,如圖12-19所示。圖

12-18

創(chuàng)建SpringBoot項(xiàng)目圖

12-19

選中SpringBootWeb起步依賴12.2.2SpringBoot快速入門案例:SpringBoot工程的搭建(2)定義HelloController類,添加方法,并添加注解,項(xiàng)目目錄結(jié)構(gòu)和代碼如圖12-20所示。圖

12-20

項(xiàng)目目錄結(jié)構(gòu)12.3SpringBoot應(yīng)用12.3.1SpringBoot請求參數(shù)12.3.2SpringBoot響應(yīng)12.3.1SpringBoot請求參數(shù)接收請求參數(shù)可以采用原始方式和SpringBoot方式。原始方式是使用HttpServletRequest對象獲取參數(shù),代碼量較多,使用不方便;SpringBoot方式可以獲取多種類型的請求參數(shù),例如,簡單參數(shù)、實(shí)體參數(shù)等,該方式更加簡單和靈活。原始方式@RequestMapping("/simpleParam")

publicStringsimpleParam(HttpServletRequestrequest){

Stringname=request.getParameter("name");Stringage=request.getParameter("age");

return"success";}12.3.1SpringBoot請求參數(shù)SpringBoot方式SpringBoot方式接收的請求參數(shù)分為簡單參數(shù)、實(shí)體參數(shù)、數(shù)組參數(shù)、集合參數(shù)、日期參數(shù)、JSON參數(shù)和路徑參數(shù)。

(1)簡單參數(shù)@RequestMapping("/simpleParam")

publicStringsimpleParam(Stringname,Integerage){

System.out.println(name+":"+age);

return"success";

}如果方法形參名稱與請求參數(shù)名稱不匹配,可以使用@RequestParam完成映射@RequestMapping("/simpleParam")

publicStringsimpleParam(@RequestParam(name="name")StringuserName,Integerage){

System.out.println(userName+":"+age);

return"success";

}12.3.1SpringBoot請求參數(shù)

(2)實(shí)體參數(shù)@RequestMapping("/simplePojo")publicStringsimplePojo(Useruser){ System.out.println(user); return"success";}簡單實(shí)體對象:請求參數(shù)名與形參對象屬性名相同,定義POJO接收即可復(fù)雜實(shí)體對象:請求參數(shù)名與形參對象屬性名相同,按照對象層次結(jié)構(gòu)關(guān)系即可接收嵌套POJO屬性參數(shù),請求參數(shù)名為vince和address.citypublicclassUser{

privateStringname;

privateintage;

privateAddressaddress;}publicclassAddress{

privateStringprovince;

privateStringcity;}12.3.1SpringBoot請求參數(shù)

(3)數(shù)組參數(shù)@RequestMapping("/arrayParam")publicStringarrayParam(String[]hobby){ System.out.println(Arrays.toString(hobby)); return"success";}

(4)集合參數(shù)@RequestMapping("/arrayParam")publicStringarrayParam(@RequestParamList<String>hobby){ System.out.println(hobby); return"success";}

(4)日期參數(shù)@RequestMapping("/dateParam")publicStringdateParam(@DateTimeFormat(pattern="yyyy-MM-ddHH:mm:ss")LocalDateTimecreateTime){ System.out.println(createTime); return"success";}12.3.1SpringBoot請求參數(shù)

(6)JSON參數(shù)@RequestMapping("/jsonParam")publicStringjsonParam(@RequestBodyUseruser){ System.out.println(user); return"success";}JSON數(shù)據(jù)鍵名與形參對象屬性名相同,定義

POJO類型形參即可接收參數(shù),需要使用@RequestBody標(biāo)識圖

12-21

Postman發(fā)送JSON數(shù)據(jù)12.3.1SpringBoot請求參數(shù)

(7)路徑參數(shù)@RequestMapping("/user/{id}/{name}")publicStringurlParam(@PathVariableintid,@PathVariableStringname){ System.out.println(id+":"+name); return"success";}通過請求URL直接傳遞參數(shù),需要使用@PathVariable獲取路徑參數(shù)12.3.2SpringBoot響應(yīng)在SpringBoot應(yīng)用中,通常使用@ResponseBody注解將方法的返回值作為response的body部分,將返回的對象通過適當(dāng)?shù)霓D(zhuǎn)換器轉(zhuǎn)換為指定的格式之后,直接將數(shù)據(jù)寫入到輸出流中。@ResponseBody注解等價(jià)于通過response對象輸出指定格式的數(shù)據(jù)。@ResponseBody注解的使用@ResponseBody分為方法注解和類注解,位于Controller方法或類上,是將方法返回值直接響應(yīng),如果返回值類型是實(shí)體對象或集合,將會轉(zhuǎn)換為JSON格式響應(yīng)。通常使用@RestController注解。@RestController包含@Controller和@ResponseBody二個注解??刂茖覥ontroller方法返回類型可以是字符串、對象、集合等,返回類型不統(tǒng)一,不便管理和難以維護(hù)。可以統(tǒng)一響應(yīng)結(jié)果來解決這個問題。所有的控制層方法統(tǒng)一返回Result類型。12.3.2SpringBoot響應(yīng)publicclassResult{

privateIntegercode;

//響應(yīng)碼:1成功,0失敗

privateStringmsg;

//提示信息

privateObjectdata;

//返回的數(shù)據(jù)publicstaticResultsuccess(Objectdata){

returnnewResult(1,"success",data);

}publicstaticResultsuccess(){

returnnewResult(1,"success",null);

}

publicstaticResulterror(Stringmsg){

returnnewResult(0,msg,null);

}//省略構(gòu)造方法、getter/setter等方法}Result實(shí)體類12.3.2SpringBoot響應(yīng)案例:獲取員工數(shù)據(jù),返回統(tǒng)一響應(yīng)結(jié)果。準(zhǔn)備emp.xml文件<emps>

<emp> <id>1</id>

<name>Charles</name>

<age>30</age>

<image>images/1.png</image>

<gender>1</gender><!--1:男,0:女

-->

<job>1</job><!--1:專任教師2:輔導(dǎo)員3:其它

-->

</emp>

<emp> <id>2</id><name>Fiona</name><age>38</age>

<image>images/4.png</image>

<gender>0</gender><job>3</job>

</emp></emps>12.3.2SpringBoot響應(yīng)在pom.xml文件中引入dom4j的依賴,用于解析XML文件<dependency> <groupId>org.dom4j</groupId> <artifactId>dom4j</artifactId> <version>2.1.3</version></dependency>創(chuàng)建用于解析XML的工具類XMLParserUtils、對應(yīng)的實(shí)體類Emp,文件emp.xml放在resources目錄下publicclassXmlParserUtils{publicstatic<T>List<T>parse(Stringfile,Class<T>targetClass){ ArrayList<T>list=newArrayList<T>();//封裝解析出來的數(shù)據(jù) try{ SAXReadersaxReader=newSAXReader();//獲取一個解析器對象 //利用解析器把xml文件加載到內(nèi)存中,并返回一個文檔對象 Documentdocument=saxReader.read(newFile(file)); ElementrootElement=document.getRootElement();//獲取根標(biāo)簽List<Element>elements=rootElement.elements("emp");//通過根標(biāo)簽來獲取user標(biāo)簽12.3.2SpringBoot響應(yīng) for(Elementelement:elements){//遍歷集合,得到每一個user標(biāo)簽 Stringid=element.element("id").getText();//id屬性 Stringname=element.element("name").getText();//name屬性 Stringage=element.element("age").getText();//age屬性 Stringimage=element.element("image").getText();//image屬性 Stringgender=element.element("gender").getText();//gender屬性 Stringjob=element.element("job").getText();//job屬性 Constructor<T>constructor=targetClass.getDeclaredConstructor(Integer.class,String.class,Integer.class,String.class,String.class,String.class);//組裝數(shù)據(jù) constructor.setAccessible(true); Tobject=constructor.newInstance(Integer.parseInt(id),name,Integer.parseInt(age),image,gender,job); list.add(object); } }catch(Exceptione){ e.printStackTrace(); } returnlist;}}12.3.2SpringBoot響應(yīng)publicclassEmp{ privateIntegerid; privateStringname; privateIntegerage; privateStringimage; privateStringgender; privateStringjob;}Emp.java(4)編寫Controller程序,處理請求,響應(yīng)數(shù)據(jù)@RestController

publicclassEmpController{

@RequestMapping("/listEmp")

publicResultlist(){

//1、加載emp.xml

Stringfile=this.getClass().getClassLoader().getResource("emp.xml").getFile();

List<Emp>empList=XmlParserUtils.parse(file,Emp.class);

12.3.2SpringBoot響應(yīng)//2、對員工信息中的性別、職位字段進(jìn)行處理

empList.stream().forEach(emp->{

Stringgender=emp.getGender();

if("1".equals(gender)){

emp.setGender("男");

}elseif("0".equals(gender)){

emp.setGender("女");

}

Stringjob=emp.getJob();

if("1".equals(job)){

emp.setJob("專任教師");

}elseif("2".equals(job)){

emp.setJob("輔導(dǎo)員");

}elseif("3".equals(job)){

emp.setJob("其它");

}

});

returnResult.success(empList);

//3、組裝數(shù)據(jù)并返回

}

}12.3.2SpringBoot響應(yīng)<linkrel="stylesheet"href="element-ui/index.css"> <scriptsrc="./js/vue.js"></script> <scriptsrc="./element-ui/index.js"></script> <scriptsrc="./js/axios-0.18.0.js"></script> <body> <h1align="center">員工信息列表展示</h1> <divid="app"> <el-table:data="tableData"style="width:100%"stripeborder><el-table-columnprop="id"label="編號"align="center"min-width="20%"></el-table-column>

//省略姓名、年齡、圖像、性別和職位

</el-table> </div> </body>

(5)使用VSCode創(chuàng)建Vue項(xiàng)目,執(zhí)行打包命令“npmrunbuild”,將生成的dist目錄下的文件拷貝到IDEA工程目錄resources的static目錄下emp.html12.3.2SpringBoot響應(yīng) <style> .el-table.warning-row{ background:oldlace; } .el-table.success-row{ background:#f0f9eb; } </style> <script> newVue({ el:"#app", data(){

return{

tableData:[]

} },

12.3.2SpringBoot響應(yīng) mounted(){

axios.get('/listEmp').then(res=>{

if(res.data.code){

this.tableData=res.data.data;

}

});

}, methods:{ } }); </script>12.3.2SpringBoot響應(yīng)圖

12-22

員工信息列表12.4Spring之IoC/DI12.4.1什么是IoC/DI12.4.2分層解耦12.4.1什么是IoC/DI控制反轉(zhuǎn)(InversionOfControl,簡稱IoC):對象的創(chuàng)建控制權(quán)由程序自身轉(zhuǎn)移到外部(容器),這種思想稱為控制反轉(zhuǎn)。IoC讓開發(fā)人員不用關(guān)注創(chuàng)建對象,把對象的創(chuàng)建、初始化、銷毀等工作交給Spring容器。容器為應(yīng)用程序提供運(yùn)行時所依賴的資源,稱之為依賴注入(DependencyInjection,簡稱DI)。依賴注入更加準(zhǔn)確地描述了IoC的設(shè)計(jì)理念,是最流行的IoC實(shí)現(xiàn)方式。依賴注入,即組件之間的依賴關(guān)系由容器在應(yīng)用系統(tǒng)運(yùn)行期來決定,由容器動態(tài)地將目標(biāo)對象注入到應(yīng)用系統(tǒng)中的組件之中。Bean對象:IoC容器中創(chuàng)建、管理的對象,稱之為Bean。12.4.1什么是IoC/DI以下二個步驟可以實(shí)現(xiàn)三層解耦。(1)Bean的聲明表

12-2注解注解說明位置@Component聲明bean的基礎(chǔ)注解不屬于以下三類時,用此注解@Controller@Component的衍生注解標(biāo)注在控制器上@Service@Component的衍生注解標(biāo)注在業(yè)務(wù)類上@Repository@Component的衍生注解標(biāo)注在數(shù)據(jù)訪問類上12.4.1什么是IoC/DI(2)Bean的注入@Autowired注解默認(rèn)是按照類型進(jìn)行,該注解是Spring框架提供的注解,@Resource默認(rèn)是按照名稱注入,該注解是JDK提供的注解。12.4.2分層解耦本章12.3.2節(jié)應(yīng)用案例,耦合度高而難以拆分,代碼復(fù)用性低,數(shù)據(jù)訪問、業(yè)務(wù)邏輯和響應(yīng)請求代碼都放在EmpController類中。

因此需要進(jìn)行分層解耦,以便于進(jìn)行分工合作、后期維護(hù)和提高軟件組件的重用,便于替換某種產(chǎn)品(例如,變更持久層框架)、產(chǎn)品功能的擴(kuò)展和適用用戶需求的不斷變化。三層架構(gòu)的概念控制層(controller):接收前端發(fā)送的請求,對請求進(jìn)行處理,并響應(yīng)數(shù)據(jù)。業(yè)務(wù)邏輯層(service):處理具體的業(yè)務(wù)邏輯。數(shù)據(jù)訪問層(DataAccessObject,簡稱DAO):負(fù)責(zé)數(shù)據(jù)訪問操作,包括數(shù)據(jù)的增加、刪除、修改、查詢。12.4.2分層解耦三層架構(gòu)的應(yīng)用案例:修改Controller程序,

將程序改成三層架構(gòu)圖

12-23

三層架構(gòu)的目錄結(jié)構(gòu)12.4.2分層解耦軟件設(shè)計(jì)的原則:高內(nèi)聚(軟件中各個功能模塊內(nèi)部的功能聯(lián)系)低耦合(衡量軟件中各個層/模塊之間的依賴、關(guān)聯(lián)的程序)EmpDaoImpl.java@Repository

publicclassEmpDaoImplimplementsEmpDao{

@Override

publicList<Emp>empList(){

//加載emp.xml,并解析emp.xml中的數(shù)據(jù)

Stringfile=this.getClass().getClassLoader().getResource("emp.xml").getFile();

List<Emp>empList=XmlParserUtils.parse(file,Emp.class);

returnempList;

}

}12.4.2分層解耦EmpServiceImpl.java@ServicepublicclassEmpServiceImplimplementsEmpService{ //按照名稱注入@Resource(name="empDaoImpl") @Autowired//按照類型注入 EmpDaoempDao; @Override publicList<Emp>empList(){ List<Emp>empList=empDao.empList(); empList.stream().forEach(emp->{ Stringsex=emp.getSex(); if(sex.equals("1")){ emp.setSex("男"); }else{ emp.setSex("女"); }

12.4.2分層解耦 Stringjob=emp.getJob(); if("1".equals(job)){ emp.setJob("專任教師"); }elseif("2".equals(job)){ emp.setJob("輔導(dǎo)員"); }elseif("3".equals(job)){ emp.setJob("其它"); } }); returnempList; }}12.4.2分層解耦EmpController.java@Slf4j@RestControllerpublicclassEmpController{ @Autowired EmpServiceempService; @RequestMapping("/listEmp") publicResultlist(){ //1.調(diào)用servlet,獲得數(shù)據(jù) List<Emp>empList=empService.empList(); //2.組裝數(shù)據(jù)并返回 returnResult.success(empList); }}12.5Spring之AOPAOP(AspectOrientedProgramming,面向切面編程)是在運(yùn)行期間通過底層的動態(tài)代理機(jī)制對特定方法植入增強(qiáng)的代碼。主要適用于記錄操作日志、權(quán)限控制、事務(wù)管理等場景。主要的優(yōu)勢是代碼無侵入、減少重復(fù)代碼、提高開發(fā)效率和維護(hù)方便。12.5.1入門案例案例:工程部分功能運(yùn)行速度較慢,需要統(tǒng)計(jì)每一個業(yè)務(wù)方法來定位耗時較長的業(yè)務(wù)方法。(1)在pom.xml中導(dǎo)入AOP的依賴<dependency>

<groupId>org.springframework.boot</groupId>

<artifactId>spring-boot-starter-aop</artifactId></dependency>12.5.1入門案例(2)編寫AOP程序(編寫切面類)@Component

@Aspect

@Slf4j

publicclassTimeAspect{

@Around("execution(*co

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論