自治區(qū)住房和城鄉(xiāng)建設(shè)部網(wǎng)站天津網(wǎng)絡(luò)推廣公司
文章目錄
- 1 SpringBootWeb快速入門(mén)
- 1.1Spring官網(wǎng)
- 1.2 Web分析
- 2. HTTP協(xié)議
- 2.1 HTTP介紹
- 3
- 4 SpringBootWeb請(qǐng)求響應(yīng)
- 5 響應(yīng)
- 6 分層解耦
- 6.1 三層架構(gòu)
- 6.1.1 三層架構(gòu)介紹
- 6.1.2 基于三層架構(gòu)的程序執(zhí)行流程:
- 6.1.3 代碼拆分
- 6.2 分層解耦
- 6.2.1 內(nèi)聚、耦合
- 6.2.2 解耦思路
- 6.3 IOC&DI
- 6.3.1 IOC詳解
- 6.3.1.1 bean的聲明
- 6.3.1.2 組件掃描
- 6.1.2 DI詳解
1 SpringBootWeb快速入門(mén)
1.1Spring官網(wǎng)
https://spring.io
spring家族的技術(shù),都是基于SpringFramework的,SpringFramework中提供很多實(shí)用功能,如:依賴(lài)注入、事務(wù)管理、web開(kāi)發(fā)支持、數(shù)據(jù)訪問(wèn)、消息服務(wù)等。
1.2 Web分析
瀏覽器
和服務(wù)器
兩端進(jìn)行數(shù)據(jù)交互,使用http協(xié)議
2. HTTP協(xié)議
2.1 HTTP介紹
HTTP:Hyper Text Transfer Protocol(超文本傳輸協(xié)議),規(guī)定了瀏覽器與服務(wù)器之間數(shù)據(jù)傳輸?shù)囊?guī)則。
3
4 SpringBootWeb請(qǐng)求響應(yīng)
5 響應(yīng)
6 分層解耦
6.1 三層架構(gòu)
6.1.1 三層架構(gòu)介紹
在我們進(jìn)行程序設(shè)計(jì)及程序開(kāi)發(fā)時(shí),盡可能讓每一個(gè)接口、類(lèi)、方法的職責(zé)更單一些(單一職責(zé)原則)。
單一職責(zé)原則:一個(gè)類(lèi)或一個(gè)方法,就只做一件事情,只管一塊功能。
根據(jù)上述案例的處理邏輯呢,從組成上分為三部分:
數(shù)據(jù)訪問(wèn)
:負(fù)責(zé)業(yè)務(wù)數(shù)據(jù)的維護(hù)操作,包括增、刪、改、查等操作。邏輯處理
:負(fù)責(zé)業(yè)務(wù)邏輯處理的代碼。請(qǐng)求處理、響應(yīng)數(shù)據(jù)
:負(fù)責(zé),接收頁(yè)面的請(qǐng)求,給頁(yè)面響應(yīng)數(shù)據(jù)。
按照上述三個(gè)組成部分,在我們項(xiàng)目開(kāi)發(fā)中呢,可以將代碼分為三層:
Controller
:控制層。接收前端發(fā)送的請(qǐng)求,對(duì)請(qǐng)求進(jìn)行處理,并響應(yīng)數(shù)據(jù)。Service
:業(yè)務(wù)邏輯層。處理具體的業(yè)務(wù)邏輯。Dao
:數(shù)據(jù)訪問(wèn)層(Data Access Object),也稱(chēng)為持久層。負(fù)責(zé)數(shù)據(jù)訪問(wèn)操作,包括數(shù)據(jù)的增、刪、改、查。
6.1.2 基于三層架構(gòu)的程序執(zhí)行流程:
- 前端發(fā)起請(qǐng)求,由Controller層接收(Controller響應(yīng)數(shù)據(jù)給前端)
- Controller層調(diào)用Service層來(lái)進(jìn)行邏輯處理(Service層處理完后,把處理結(jié)果返回給Controller層)
- Serivce層調(diào)用Dao層(邏輯處理過(guò)程中需要用到的數(shù)據(jù)從Dao層獲取)
- Dao層操作文件中數(shù)據(jù)(Dao拿到的數(shù)據(jù)會(huì)返回給Service層)
6.1.3 代碼拆分
包名 | 備注 | 作用 |
---|---|---|
控制層包名 | xxxx.controller | 接收前端發(fā)送請(qǐng)求,對(duì)請(qǐng)求進(jìn)行處理,并響應(yīng)數(shù)據(jù) |
業(yè)務(wù)邏輯層包名 | xxxx.service | 處理業(yè)務(wù)邏輯 |
數(shù)據(jù)訪問(wèn)層包名 | xxxx.dao | 數(shù)據(jù)訪問(wèn)操作,包含數(shù)據(jù)的增、刪、改、查 |
三層架構(gòu)的好處:
- 復(fù)用性強(qiáng)
- 便于維護(hù)
- 利用擴(kuò)展
6.2 分層解耦
6.2.1 內(nèi)聚、耦合
內(nèi)聚:軟件中各個(gè)功能模塊內(nèi)部的功能聯(lián)系。
耦合:衡量軟件中各個(gè)層/模塊間的依賴(lài)、關(guān)聯(lián)的程度。
軟件設(shè)計(jì)原則:高內(nèi)聚低耦合。
6.2.2 解耦思路
解決思路是:
- 提供一個(gè)容器,容器中存儲(chǔ)一些對(duì)象(例:EmpService對(duì)象)
- controller程序從容器中獲取EmpService類(lèi)型的對(duì)象
實(shí)現(xiàn)上述解耦操作,涉及到Spring中的兩個(gè)核心概念:
控制反轉(zhuǎn)
:( Inversion Of Control,簡(jiǎn)稱(chēng)IOC)。對(duì)象的創(chuàng)建控制權(quán)由程序自身轉(zhuǎn)移到外部(容器),這種思想稱(chēng)為控制反轉(zhuǎn)。
依賴(lài)注入
:(Dependency Injection,簡(jiǎn)稱(chēng)DI)。容器為應(yīng)用程序提供運(yùn)行時(shí),所依賴(lài)的資源,稱(chēng)之為依賴(lài)注入。IOC容器中創(chuàng)建、管理的對(duì)象,稱(chēng)之為:bean對(duì)象
6.3 IOC&DI
6.3.1 IOC詳解
6.3.1.1 bean的聲明
IOC控制反轉(zhuǎn),就是將對(duì)象的控制權(quán)交給Spring的
IOC容器
,由IOC容器創(chuàng)建及管理對(duì)象。IOC容器創(chuàng)建的對(duì)象稱(chēng)為bean對(duì)象。
要把某個(gè)對(duì)象交給IOC容器管理,需要在類(lèi)上添加注解:@Component
為了更好標(biāo)識(shí)web應(yīng)用程序中bean對(duì)象到歸屬于哪層,又提供了@Component的衍生注解
@Controller
(標(biāo)注在控制層類(lèi)上)@Service
(標(biāo)注在業(yè)務(wù)層類(lèi)上)@Repository
(標(biāo)注在數(shù)據(jù)訪問(wèn)層類(lèi)上)
注解 | 說(shuō)明 | 位置 |
---|---|---|
@Controller | @Component的衍生注解 | 標(biāo)注在控制器類(lèi)上 |
@Service | @Component的衍生注解 | 標(biāo)注在業(yè)務(wù)類(lèi)上 |
@Repository | @Component的衍生注解 | 標(biāo)注在數(shù)據(jù)訪問(wèn)類(lèi)上(由于與mybatis整合,用的少) |
@Component | 聲明bean的基礎(chǔ)注解 | 不屬于以上三類(lèi)時(shí),用此注解 |
6.3.1.2 組件掃描
bean想要生效,需要被組件掃描
運(yùn)行程序后,報(bào)錯(cuò):
為什么沒(méi)有找到bean對(duì)象呢?
- 使用四大注解聲明的bean,
要想生效
,需要被組件掃描注解@ComponentScan掃描
@ComponentScan注解沒(méi)有顯式配置,但實(shí)際上已經(jīng)包含在引導(dǎo)類(lèi)聲明注解 @SpringBootApplication 中,默認(rèn)掃描的范圍是SpringBoot啟動(dòng)類(lèi)所在包及其子包。如下結(jié)構(gòu)掃描全部:
6.1.2 DI詳解
依賴(lài)注入,指
IOC容器
要為應(yīng)用程序提供運(yùn)行時(shí)所依賴(lài)的資源
,而資源
指的就是對(duì)象
。
@Autowired注解,默認(rèn)是按照類(lèi)型進(jìn)行自動(dòng)裝配的(去IOC容器中找某個(gè)類(lèi)型的對(duì)象,然后完成注入操作)
入門(mén)程序舉例:在EmpController運(yùn)行時(shí),要到IOC容器中找EmpService類(lèi)型的對(duì)象,而IOC容器中剛好有EmpService類(lèi)型的對(duì)象,所以就找到了這個(gè)類(lèi)型的對(duì)象完成注入操作。
那如果在IOC容器中,存在多個(gè)相同類(lèi)型的bean對(duì)象,會(huì)出現(xiàn)什么情況呢?
程序運(yùn)行會(huì)報(bào)錯(cuò)
如何解決上述問(wèn)題呢?Spring提供了以下幾種解決方案:
- @Primary
使用@Primary注解:當(dāng)存在多個(gè)相同類(lèi)型的Bean注入時(shí),加上@Primary注解,來(lái)確定默認(rèn)的實(shí)現(xiàn)。
- @Qualifier
使用@Qualifier注解:指定當(dāng)前要注入的bean對(duì)象。 在@Qualifier的value屬性中,指定注入的bean的名稱(chēng)。- @Qualifier注解不能單獨(dú)使用,必須配合@Autowired使用
- @Resource
使用@Resource注解:是按照bean的名稱(chēng)進(jìn)行注入。通過(guò)name屬性指定要注入的bean的名稱(chēng)。
面試題 : @Autowird 與 @Resource的區(qū)別
- @Autowired 是spring框架提供的注解,而**@Resource是JDK提供**的注解
- @Autowired 默認(rèn)是按照類(lèi)型注入,而**@Resource是按照名稱(chēng)注入**