Spring/SpringMvc

1. 介紹spring框架

Spring是一套為了解決企業(yè)應(yīng)用開發(fā)的復(fù)雜性而創(chuàng)建的框架,特點(diǎn)是分層的架構(gòu),允許用戶在不同層面使用不同的組件進(jìn)行組合。同時通過IOC容器來降低耦合,簡化開發(fā)。利用AOP來進(jìn)行切面編程統(tǒng)一管理通用模塊。

2.Spring中AOP的應(yīng)用場景、Aop原理、好處?

主要是兩種,一種是JDK動態(tài)代理,一種是Cglib代理。
兩者的區(qū)別:

  1. JDK動態(tài)代理只能代理實(shí)現(xiàn)了接口的類,動態(tài)代理類的字節(jié)碼在程序運(yùn)行時由Java反射機(jī)制動態(tài)生成。
  2. Cglib是可以代理沒有實(shí)現(xiàn)接口的類,cglib是針對類來實(shí)現(xiàn)代理的,他的原理是對指定的目標(biāo)類生成一個子類,并覆蓋其中方法實(shí)現(xiàn)增強(qiáng),所以不能對final修飾的類進(jìn)行代理。底層采用ASM實(shí)現(xiàn)。

原理:AOP是面向切面編程,是通過動態(tài)代理(jdk動態(tài)代理)的方式為程序添加統(tǒng)一功能,集中解決一些公共問題。

AOP就是縱向的編程,如業(yè)務(wù)1和業(yè)務(wù)2都需要一個共同的操作,與其往每個業(yè)務(wù)中都添加同樣的代碼,不如寫一遍代碼,讓兩個業(yè)務(wù)共同使用這段代碼。在日常有訂單管理、商品管理、資金管理、庫存管理等業(yè)務(wù),都會需要到類似日志記錄、事務(wù)控制、權(quán)限控制、性能統(tǒng)計、異常處理及事務(wù)處理等。AOP把所有共有代碼全部抽取出來,放置到某個地方集中管理,然后在具體運(yùn)行時,再由容器動態(tài)織入這些共有代碼。

優(yōu)點(diǎn):

  1. 各個步驟之間的良好隔離性耦合性大大降低
  2. 源代碼無關(guān)性,再擴(kuò)展功能的同時不對源碼進(jìn)行修改操作
    主要是兩種,一種是JDK動態(tài)代理,一種是Cglib代理。
    兩者的區(qū)別:
    1.JDK動態(tài)代理只能代理實(shí)現(xiàn)了接口的類,動態(tài)代理類的字節(jié)碼在程序運(yùn)行時由Java反射機(jī)制動態(tài)生成。
    2.Cglib是可以代理沒有實(shí)現(xiàn)接口的類,cglib是針對類來實(shí)現(xiàn)代理的,他的原理是對指定的目標(biāo)類生成一個子類,并覆蓋其中方法實(shí)現(xiàn)增強(qiáng),所以不能對final修飾的類進(jìn)行代理。底層采用ASM實(shí)現(xiàn)。

原理:AOP是面向切面編程,是通過動態(tài)代理(jdk動態(tài)代理)的方式為程序添加統(tǒng)一功能,集中解決一些公共問題。
AOP就是縱向的編程,如業(yè)務(wù)1和業(yè)務(wù)2都需要一個共同的操作,與其往每個業(yè)務(wù)中都添加同樣的代碼,不如寫一遍代碼,讓兩個業(yè)務(wù)共同使用這段代碼。在日常有訂單管理、商品管理、資金管理、庫存管理等業(yè)務(wù),都會需要到類似日志記錄、事務(wù)控制、權(quán)限控制、性能統(tǒng)計、異常處理及事務(wù)處理等。AOP把所有共有代碼全部抽取出來,放置到某個地方集中管理,然后在具體運(yùn)行時,再由容器動態(tài)織入這些共有代碼。

優(yōu)點(diǎn):1.各個步驟之間的良好隔離性耦合性大大降低
2.源代碼無關(guān)性,再擴(kuò)展功能的同時不對源碼進(jìn)行修改操作

JDK代理的是實(shí)現(xiàn)
JDK動態(tài)代理的實(shí)現(xiàn)是在運(yùn)行時,根據(jù)一組接口定義,使用Proxy、InvocationHandler等工具類去生成一個代理類和代理類實(shí)例。
JDK動態(tài)代理的類關(guān)系模型和靜態(tài)代理看起來差不多。也是需要一個或一組接口來定義行為規(guī)范。需要一個代理類來實(shí)現(xiàn)接口。區(qū)別是沒有真實(shí)類,因為動態(tài)代理就是要解決在不知道真實(shí)類的情況下依然能夠使用代理模式的問題

public interface MyIntf {
void helloWorld();
}
第二步,編寫一個我們自己的調(diào)用處理類,這個類需要實(shí)現(xiàn)InvocationHandler接口。
public class MyInvocationHandler implements InvocationHandler {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println(method);
return null;
}
}
InvocationHandler接口只有一個待實(shí)現(xiàn)的invoke方法。這個方法有三個參數(shù),proxy表示動態(tài)代理類實(shí)例,method表示調(diào)用的方法,args表示調(diào)用方法的參數(shù)。在實(shí)際應(yīng)用中,invoke方法就是我們實(shí)現(xiàn)業(yè)務(wù)邏輯的入口。這里我們的實(shí)現(xiàn)邏輯就一行代碼,打印當(dāng)前調(diào)用的方法(在實(shí)際應(yīng)用中這么做是沒有意義的,不過這里我們只想解釋JDK動態(tài)代理的原理,所以越簡單越清晰)。
第三步,直接使用Proxy提供的方法創(chuàng)建一個動態(tài)代理類實(shí)例。并調(diào)用代理類實(shí)例的helloWorld方法,檢測運(yùn)行結(jié)果。
public class ProxyTest {
public static void main(String[] args) {
System.getProperties().put("sun.misc.ProxyGenerator.saveGeneratedFiles","true");
MyIntf proxyObj = (MyIntf)Proxy.newProxyInstance(MyIntf.class.getClassLoader(),new Class[]{MyIntf.class},new MyInvocationHandler());
proxyObj.helloWorld();
}
}
第三行代碼是設(shè)置系統(tǒng)屬性,把生成的代理類寫入到文件。這里再強(qiáng)調(diào)一下,JDK動態(tài)代理技術(shù)是在運(yùn)行時直接生成類的字節(jié)碼,并載入到虛擬機(jī)執(zhí)行的。這里不存在class文件的,所以我們通過設(shè)置系統(tǒng)屬性,把生成的字節(jié)碼保存到文件,用于后面進(jìn)一步分析。

第四行代碼就是調(diào)用Proxy.newProxyInstance方法創(chuàng)建一個動態(tài)代理類實(shí)例,這個方法需要傳入三個參數(shù),第一個參數(shù)是類加載器,用于加載這個代理類。第二個參數(shù)是Class數(shù)組,里面存放的是待實(shí)現(xiàn)的接口信息。第三個參數(shù)是InvocationHandler實(shí)例。
第五行調(diào)用代理類的helloWorld方法,運(yùn)行結(jié)果:
public abstract void com.tuniu.distribute.openapi.common.annotation.MyIntf.helloWorld()
分析運(yùn)行結(jié)果,就可以發(fā)現(xiàn),方法的最終調(diào)用是分派到了MyInvocationHandler.invoke方法,打印出了調(diào)用的方法信息。

3. Spring中IOC的作用與原理?對象創(chuàng)建的過程。

IOC--Inversion of Control控制反轉(zhuǎn)。當(dāng)某個角色需要另外一個角色協(xié)助的時候,在傳統(tǒng)的程序設(shè)計過程中,通常由調(diào)用者來創(chuàng)建被調(diào)用者的實(shí)例對象。但在spring中創(chuàng)建被調(diào)用者的工作不再由調(diào)用者來完成,因此稱為控制反轉(zhuǎn)。創(chuàng)建被調(diào)用者的工作由spring來完成,然后注入調(diào)用者 直接使用。

IOC容器:就是具有依賴注入功能的容器,是可以創(chuàng)建對象的容器, BeanFactory是IoC容器的核心接口。它的職責(zé)包括:實(shí)例化、定位、配置應(yīng)用程序中的對象及建立這些對象間的依賴,通常new一個實(shí)例,控制權(quán)由程序員控制,而"控制反轉(zhuǎn)"是指new實(shí)例工作不由程序員來做而是交給Spring容器來做。 Spring為我們提供了許多易用的BeanFactory實(shí)現(xiàn),XmlBeanFactory就是最常用的一個。該實(shí)現(xiàn)將以XML方式描述組成應(yīng)用的對象以及對象間的依賴關(guān)系。XmlBeanFactory類將持有此XML配置元數(shù)據(jù),并用它來構(gòu)建一個完全可配置的系統(tǒng)或應(yīng)用

DI(依賴注入Dependency injection) :在容器創(chuàng)建對象后,處理對象的依賴關(guān)系。

依賴注入spring的注入方式:

  • set注入方式
  • 靜態(tài)工廠注入方式
  • 構(gòu)造方法注入方式
  • 基于注解的方式
  • 依賴注入的三種方式:(1)接口注入(2)Construct注入(3)Setter注入

4.spring有兩種代理方式:

  1. 若目標(biāo)對象實(shí)現(xiàn)了若干接口,spring使用JDK的java.lang.reflect.Proxy類代理。
    優(yōu)點(diǎn):因為有接口,所以使系統(tǒng)更加松耦合
    缺點(diǎn):為每一個目標(biāo)類創(chuàng)建接口

  2. 若目標(biāo)對象沒有實(shí)現(xiàn)任何接口,spring使用CGLIB庫生成目標(biāo)對象的子類。
    優(yōu)點(diǎn):因為代理類與目標(biāo)類是繼承關(guān)系,所以不需要有接口的存在。
    缺點(diǎn):因為沒有使用接口,所以系統(tǒng)的耦合性沒有使用JDK的動態(tài)代理好。

代理的共有優(yōu)點(diǎn):業(yè)務(wù)類只需要關(guān)注業(yè)務(wù)邏輯本身,保證了業(yè)務(wù)類的重用性

5.spring中的核心類有那些,各有什么作用?

BeanFactory:產(chǎn)生一個新的實(shí)例,可以實(shí)現(xiàn)單例模式
BeanWrapper:提供統(tǒng)一的get及set方法
ApplicationContext:提供框架的實(shí)現(xiàn),包括BeanFactory的所有功能

6.什么是IOC,什么又是DI,他們有什么區(qū)別?

依賴注入DI是一個程序設(shè)計模式和架構(gòu)模型, 一些時候也稱作控制反轉(zhuǎn),盡管在技術(shù)上來講,依賴注入是一個IOC的特殊實(shí)現(xiàn),依賴注入是指一個對象應(yīng)用另外一個對象來提供一個特殊的能力,例如:把一個 數(shù)據(jù)庫連接已參數(shù)的形式傳到一個對象的結(jié)構(gòu)方法里面而不是在那個對象內(nèi)部自行創(chuàng)建一個連接。控制反轉(zhuǎn)和依賴注入的基本思想就是把類的依賴從類內(nèi)部轉(zhuǎn)化到外 部以減少依賴

應(yīng)用控制反轉(zhuǎn),對象在被創(chuàng)建的時候,由一個調(diào)控系統(tǒng)內(nèi)所有對象的外界實(shí)體,將其所依賴的對象的引用,傳遞給它。也可以說,依賴被注入到對象中。所 以,控制反轉(zhuǎn)是,關(guān)于一個對象如何獲取他所依賴的對象的引用,這個責(zé)任的反轉(zhuǎn)。

7.Spring常見創(chuàng)建對象的注解?

@component
除了上述提到的 @Component注解外,Spring中還提供了@Component的3個衍生注解,其功能就目前來說是一致的,均是為了創(chuàng)建對象。
@Controller :WEB層
@Service :業(yè)務(wù)層
@Repository :持久層
@Service
@Service是一個注解,告訴spring創(chuàng)建一個實(shí)現(xiàn)類的實(shí)例,就是不用再spring里配置bean
@Configuration和@Bean
@Configuration可理解為用spring的時候xml里面的<beans>標(biāo)簽
@Bean可理解為用spring的時候xml里面的<bean>標(biāo)簽
@EnableConfigurationProperties
作用是@ConfigurationProperties注解生效
@ConfigurationProperties
主要用來把properties配置文件轉(zhuǎn)化為bean來使用的,就是綁定application.properties中的屬性
就是綁定application.properties中的屬性
@ImportResource
引入spring配置文件.xml
@Autowired
它可以對類成員變量、方法及構(gòu)造函數(shù)進(jìn)行標(biāo)注,完成自動裝配的工作。 通過 @Autowired的使用來消除 set ,get方法。
@ConditionalOnBean(僅僅在當(dāng)前上下文中存在某個對象時,才會實(shí)例化一個Bean)
@ConditionalOnClass(某個class位于類路徑上,才會實(shí)例化一個Bean)
@ConditionalOnExpression(當(dāng)表達(dá)式為true的時候,才會實(shí)例化一個Bean)
@ConditionalOnMissingBean(僅僅在當(dāng)前上下文中不存在某個對象時,才會實(shí)例化一個Bean)
@ConditionalOnMissingClass(某個class類路徑上不存在的時候,才會實(shí)例化一個Bean)
@ConditionalOnNotWebApplication(不是web應(yīng)用)

8.Spring的優(yōu)點(diǎn)?

1.降低了組件之間的耦合性 ,實(shí)現(xiàn)了軟件各層之間的解耦
2.可以使用容易提供的眾多服務(wù),如事務(wù)管理,消息服務(wù)等
3.容器提供單例模式支持
4.容器提供了AOP技術(shù),利用它很容易實(shí)現(xiàn)如權(quán)限攔截,運(yùn)行期監(jiān)控等功能
5.容器提供了眾多的輔助類,能加快應(yīng)用的開發(fā)
6.spring對于主流的應(yīng)用框架提供了集成支持,如hibernate,JPA,Struts等
7.spring屬于低侵入式設(shè)計,代碼的污染極低
8.獨(dú)立于各種應(yīng)用服務(wù)器
9.spring的DI機(jī)制降低了業(yè)務(wù)對象替換的復(fù)雜性
10.Spring的高度開放性,并不強(qiáng)制應(yīng)用完全依賴于Spring,開發(fā)者可以自由選擇spring 的部分或全部

9.Spring Bean的作用域之間有什么區(qū)別?

Spring容器中的bean可以分為5個范圍。所有范圍的名稱都是自說明的,但是為了避免混淆,還是讓我們來解釋一下:

singleton:這種bean范圍是默認(rèn)的,這種范圍確保不管接受到多少個請求,每個容器中只有一個bean的實(shí)例,單例的模式由bean factory自身來維護(hù)。

prototype:原形范圍與單例范圍相反,為每一個bean請求提供一個實(shí)例。

request:在請求bean范圍內(nèi)會每一個來自客戶端的網(wǎng)絡(luò)請求創(chuàng)建一個實(shí)例,在請求完成以后,bean會失效并被垃圾回收器回收。

Session:與請求范圍類似,確保每個session中有一個bean的實(shí)例,在session過期后,bean會隨之失效。

global-session:global-session和Portlet應(yīng)用相關(guān)。當(dāng)你的應(yīng)用部署在Portlet容器中工作時,它包含很多portlet。如果你想要聲明讓所有的portlet共用全局的存儲變量的話,那么這全局變量需要存儲在global-session中。

全局作用域與Servlet中的session作用域效果相同。

10.Spring事務(wù)

Spring事務(wù)其實(shí)就是Spring AOP,底層創(chuàng)建動態(tài)代理對象,在代碼的開頭結(jié)尾封裝了開啟事務(wù)和事務(wù)回滾操作

事務(wù)屬性這個概念,事務(wù)屬性通常由事務(wù)的傳播行為,事務(wù)的隔離級別,事務(wù)的超時值和事務(wù)只讀標(biāo)志組成

什么是事務(wù)*

事務(wù)是訪問數(shù)據(jù)庫的一個操作序列,數(shù)據(jù)庫應(yīng)用系統(tǒng)通過事務(wù)集來完成對數(shù)據(jù)庫的存取。事務(wù)的正確執(zhí)行使得數(shù)據(jù)庫從一種狀態(tài)轉(zhuǎn)換為另一種狀態(tài)。

事務(wù)必須服從ISO/IEC所制定的ACID原則。ACID是原子性(atomicity)、一致性(consistency)、隔離性(isolation)、持久性(durability)的縮寫,這四種狀態(tài)的意思是:

1、原子性

即不可分割,事務(wù)要么全部被執(zhí)行,要么全部不執(zhí)行。如果事務(wù)的所有子事務(wù)全部提交成功,則所有的數(shù)據(jù)庫操作被提交,數(shù)據(jù)庫狀態(tài)發(fā)生變化;如果有子事務(wù)失敗,則其他子事務(wù)的數(shù)據(jù)庫操作被回滾,即數(shù)據(jù)庫回到事務(wù)執(zhí)行前的狀態(tài),不會發(fā)生狀態(tài)轉(zhuǎn)換

2、一致性

事務(wù)的執(zhí)行使得數(shù)據(jù)庫從一種正確狀態(tài)轉(zhuǎn)換成另外一種正確狀態(tài)

3、隔離性

在事務(wù)正確提交之前,不允許把事務(wù)對該數(shù)據(jù)的改變提供給任何其他事務(wù),即在事務(wù)正確提交之前,它可能的結(jié)果不應(yīng)該顯示給其他事務(wù)

4、持久性

事務(wù)正確提交之后,其結(jié)果將永遠(yuǎn)保存在數(shù)據(jù)庫之中,即使在事務(wù)提交之后有了其他故障,事務(wù)的處理結(jié)果也會得到保存

事務(wù)的作用

事務(wù)管理對于企業(yè)級應(yīng)用而言至關(guān)重要,它保證了用戶的每一次操作都是可靠的,即便出現(xiàn)了異常的訪問情況,也不至于破壞后臺數(shù)據(jù)的完整性。就像銀行的自動提款機(jī)ATM,通常ATM都可以正常為客戶服務(wù),但是也難免遇到操作過程中及其突然出故障的情況,此時,事務(wù)就必須確保出故障前對賬戶的操作不生效,就像用戶剛才完全沒有使用過ATM機(jī)一樣,以保證用戶和銀行的利益都不受損失。

并發(fā)下事務(wù)會產(chǎn)生的問題

舉個例子,事務(wù)A和事務(wù)B操縱的是同一個資源,事務(wù)A有若干個子事務(wù),事務(wù)B也有若干個子事務(wù),事務(wù)A和事務(wù)B在高并發(fā)的情況下,會出現(xiàn)各種各樣的問題。"各種各樣的問題",總結(jié)一下主要就是五種:第一類丟失更新、第二類丟失更新、臟讀、不可重復(fù)讀、幻讀。五種之中,第一類丟失更新、第二類丟失更新不重要,不講了,講一下臟讀、不可重復(fù)讀和幻讀。

1、臟讀

所謂臟讀,就是指事務(wù)A讀到了事務(wù)B還沒有提交的數(shù)據(jù),比如銀行取錢,事務(wù)A開啟事務(wù),此時切換到事務(wù)B,事務(wù)B開啟事務(wù)-->取走100元,此時切換回事務(wù)A,事務(wù)A讀取的肯定是數(shù)據(jù)庫里面的原始數(shù)據(jù),因為事務(wù)B取走了100塊錢,并沒有提交,數(shù)據(jù)庫里面的賬務(wù)余額肯定還是原始余額,這就是臟讀。

2、不可重復(fù)讀

所謂不可重復(fù)讀,就是指在一個事務(wù)里面讀取了兩次某個數(shù)據(jù),讀出來的數(shù)據(jù)不一致。還是以銀行取錢為例,事務(wù)A開啟事務(wù)-->查出銀行卡余額為1000元,此時切換到事務(wù)B事務(wù)B開啟事務(wù)-->事務(wù)B取走100元-->提交,數(shù)據(jù)庫里面余額變?yōu)?00元,此時切換回事務(wù)A,事務(wù)A再查一次查出賬戶余額為900元,這樣對事務(wù)A而言,在同一個事務(wù)內(nèi)兩次讀取賬戶余額數(shù)據(jù)不一致,這就是不可重復(fù)讀。

3、幻讀

所謂幻讀,就是指在一個事務(wù)里面的操作中發(fā)現(xiàn)了未被操作的數(shù)據(jù)。比如學(xué)生信息,事務(wù)A開啟事務(wù)-->修改所有學(xué)生當(dāng)天簽到狀況為false,此時切換到事務(wù)B,事務(wù)B開啟事務(wù)-->事務(wù)B插入了一條學(xué)生數(shù)據(jù),此時切換回事務(wù)A,事務(wù)A提交的時候發(fā)現(xiàn)了一條自己沒有修改過的數(shù)據(jù),這就是幻讀,就好像發(fā)生了幻覺一樣?;米x出現(xiàn)的前提是并發(fā)的事務(wù)中有事務(wù)發(fā)生了插入、刪除操作。

事務(wù)隔離級別

事務(wù)隔離級別,就是為了解決上面幾種問題而誕生的。為什么要有事務(wù)隔離級別,因為事務(wù)隔離級別越高,在并發(fā)下會產(chǎn)生的問題就越少,但同時付出的性能消耗也將越大,因此很多時候必須在并發(fā)性和性能之間做一個權(quán)衡。所以設(shè)立了幾種事務(wù)隔離級別,以便讓不同的項目可以根據(jù)自己項目的并發(fā)情況選擇合適的事務(wù)隔離級別,對于在事務(wù)隔離級別之外會產(chǎn)生的并發(fā)問題,在代碼中做補(bǔ)償。

事務(wù)隔離級別有4種,但是像Spring會提供給用戶5種,來看一下:

1、DEFAULT(default)

默認(rèn)隔離級別,每種數(shù)據(jù)庫支持的事務(wù)隔離級別不一樣,如果Spring配置事務(wù)時將isolation設(shè)置為這個值的話,那么將使用底層數(shù)據(jù)庫的默認(rèn)事務(wù)隔離級別。順便說一句,如果使用的MySQL,可以使用"select @@tx_isolation"來查看默認(rèn)的事務(wù)隔離級別

2、READ_UNCOMMITTED(read_uncommitted)

讀未提交,即能夠讀取到?jīng)]有被提交的數(shù)據(jù),所以很明顯這個級別的隔離機(jī)制無法解決臟讀、不可重復(fù)讀、幻讀中的任何一種,因此很少使用

3、READ_COMMITED(read_commited)

讀已提交,即能夠讀到那些已經(jīng)提交的數(shù)據(jù),自然能夠防止臟讀,但是無法限制不可重復(fù)讀和幻讀

4、REPEATABLE_READ(repeatable)

重復(fù)讀取,即在數(shù)據(jù)讀出來之后加鎖,類似"select * from XXX for update",明確數(shù)據(jù)讀取出來就是為了更新用的,所以要加一把鎖,防止別人修改它。REPEATABLE_READ的意思也類似,讀取了一條數(shù)據(jù),這個事務(wù)不結(jié)束,別的事務(wù)就不可以改這條記錄,這樣就解決了臟讀、不可重復(fù)讀的問題,但是幻讀的問題還是無法解決

5、SERLALIZABLE(serlalizable)

串行化(序列化 ),最高的事務(wù)隔離級別,不管多少事務(wù),挨個運(yùn)行完一個事務(wù)的所有子事務(wù)之后才可以執(zhí)行另外一個事務(wù)里面的所有子事務(wù),這樣就解決了臟讀、不可重復(fù)讀和幻讀的問題了

10.Spring管理事務(wù)有幾種方式?

有兩種方式:

1、編程式事務(wù),在代碼中硬編碼。(不推薦使用)
2、聲明式事務(wù),在配置文件中配置(推薦使用)

聲明式事務(wù)又分為兩種:

a、基于XML的聲明式事務(wù)
b、基于注解的聲明式事務(wù)

11.Springmvc的優(yōu)點(diǎn)

1.它是基于組件技術(shù)的.全部的應(yīng)用對象,無論控制器和視圖,還是業(yè)務(wù)對象之類的都是 java組件.并且和Spring提供的其他基礎(chǔ)結(jié)構(gòu)緊密集成.
2.不依賴于Servlet API(目標(biāo)雖是如此,但是在實(shí)現(xiàn)的時候確實(shí)是依賴于Servlet的)

  1. 可以任意使用各種視圖技術(shù),而不僅僅局限于JSP
    4 . 支持各種請求資源的映射策略
    5 .它應(yīng)是易于擴(kuò)展的

12.SpringBean的生命周期

image.jpeg

Spring MVC 的簡單原理圖如下:

image.jpeg

SpringMVC 工作原理(重要)

簡單來說:

客戶端發(fā)送請求-> 前端控制器 DispatcherServlet 接受客戶端請求 -> 找到處理器映射 HandlerMapping 解析請求對應(yīng)的 Handler-> HandlerAdapter 會根據(jù) Handler 來調(diào)用真正的處理器開處理請求,并處理相應(yīng)的業(yè)務(wù)邏輯 -> 處理器返回一個模型視圖 ModelAndView -> 視圖解析器進(jìn)行解析 -> 返回一個視圖對象->前端控制器 DispatcherServlet 渲染數(shù)據(jù)(Moder)->將得到視圖對象返回給用戶

流程說明(重要):

(1)客戶端(瀏覽器)發(fā)送請求,直接請求到 DispatcherServlet。

(2)DispatcherServlet 根據(jù)請求信息調(diào)用 HandlerMapping,解析請求對應(yīng)的 Handler。

(3)解析到對應(yīng)的 Handler(也就是我們平常說的 Controller 控制器)后,開始由 HandlerAdapter 適配器處理。

(4)HandlerAdapter 會根據(jù) Handler 來調(diào)用真正的處理器開處理請求,并處理相應(yīng)的業(yè)務(wù)邏輯。

(5)處理器處理完業(yè)務(wù)后,會返回一個 ModelAndView 對象,Model 是返回的數(shù)據(jù)對象,View 是個邏輯上的 View。

(6)ViewResolver 會根據(jù)邏輯 View 查找實(shí)際的 View。

(7)DispaterServlet 把返回的 Model 傳給 View(視圖渲染)。

(8)把 View 返回給請求者(瀏覽器)

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容