Spring Framework 現(xiàn)在幾乎已成為 Java Web 開發(fā)的標配框架。那么帮坚,作為 Java 程序員妻往,你對 Spring 的主要技術(shù)點又掌握了多少呢?不妨用本文的問題來檢測一下试和。
1讯泣、一般問題
1.1. 不同版本的 Spring Framework 有哪些主要功能?
VersionFeatureSpring 2.5發(fā)布于 2007 年灰署。這是第一個支持注解的版本判帮。Spring 3.0發(fā)布于 2009 年局嘁。它完全利用了 Java5 中的改進溉箕,并為 JEE6 提供了支持晦墙。Spring 4.0發(fā)布于 2013 年。這是第一個完全支持 JAVA8 的版本肴茄。
1.2. 什么是 Spring Framework晌畅?
Spring 是一個開源應(yīng)用框架,旨在降低應(yīng)用程序開發(fā)的復(fù)雜度寡痰。
它是輕量級抗楔、松散耦合的。
它具有分層體系結(jié)構(gòu)拦坠,允許用戶選擇組件连躏,同時還為 J2EE 應(yīng)用程序開發(fā)提供了一個有凝聚力的框架。
它可以集成其他框架贞滨,如 Structs入热、Hibernate、EJB 等晓铆,所以又稱為框架的框架勺良。
1.3. 列舉 Spring Framework 的優(yōu)點。
由于 Spring Frameworks 的分層架構(gòu)骄噪,用戶可以自由選擇自己需要的組件尚困。
Spring Framework 支持 POJO(Plain Old Java Object) 編程,從而具備持續(xù)集成和可測試性链蕊。
由于依賴注入和控制反轉(zhuǎn)事甜,JDBC 得以簡化。
它是開源免費的滔韵。
1.4. Spring Framework 有哪些不同的功能讳侨?
輕量級?- Spring 在代碼量和透明度方面都很輕便。
IOC?- 控制反轉(zhuǎn)
AOP?- 面向切面編程可以將應(yīng)用業(yè)務(wù)邏輯和系統(tǒng)服務(wù)分離奏属,以實現(xiàn)高內(nèi)聚跨跨。
容器?- Spring 負責創(chuàng)建和管理對象(Bean)的生命周期和配置。
MVC?- 對 web 應(yīng)用提供了高度可配置性囱皿,其他框架的集成也十分方便勇婴。
事務(wù)管理?- 提供了用于事務(wù)管理的通用抽象層。Spring 的事務(wù)支持也可用于容器較少的環(huán)境嘱腥。
JDBC 異常?- Spring 的 JDBC 抽象層提供了一個異常層次結(jié)構(gòu)耕渴,簡化了錯誤處理策略。
我剛整理了一套2018最新的0基礎(chǔ)入門和進階教程齿兔,無私分享橱脸,加Java學(xué)習q-u-n :六七八础米,二四一,五六三 即可獲取添诉,內(nèi)附:開發(fā)工具和安裝包屁桑,以及系統(tǒng)學(xué)習路線圖
1.5. Spring Framework 中有多少個模塊,它們分別是什么栏赴?
Spring 核心容器?– 該層基本上是 Spring Framework 的核心蘑斧。它包含以下模塊:
Spring Core
Spring Bean
SpEL (Spring Expression Language)
Spring Context
數(shù)據(jù)訪問/集成?– 該層提供與數(shù)據(jù)庫交互的支持。它包含以下模塊:
JDBC (Java DataBase Connectivity)
ORM (Object Relational Mapping)
OXM (Object XML Mappers)
JMS (Java Messaging Service)
Transaction
Web?– 該層提供了創(chuàng)建 Web 應(yīng)用程序的支持须眷。它包含以下模塊:
Web
Web – Servlet
Web – Socket
Web – Portlet
AOP?– 該層支持面向切面編程
Instrumentation?– 該層為類檢測和類加載器實現(xiàn)提供支持竖瘾。
Test?– 該層為使用 JUnit 和 TestNG 進行測試提供支持。
幾個雜項模塊:
Messaging – 該模塊為 STOMP 提供支持花颗。它還支持注解編程模型捕传,該模型用于從 WebSocket 客戶端路由和處理 STOMP 消息。
Aspects – 該模塊為與 AspectJ 的集成提供支持扩劝。
1.6. 什么是 Spring 配置文件庸论?
Spring 配置文件是 XML 文件。該文件主要包含類信息今野。它描述了這些類是如何配置以及相互引入的葡公。但是,XML 配置文件冗長且更加干凈条霜。如果沒有正確規(guī)劃和編寫催什,那么在大項目中管理變得非常困難。
1.7. Spring 應(yīng)用程序有哪些不同組件宰睡?
Spring 應(yīng)用一般有以下組件:
接口?- 定義功能蒲凶。
Bean 類?- 它包含屬性,setter 和 getter 方法拆内,函數(shù)等旋圆。
Spring 面向切面編程(AOP)?- 提供面向切面編程的功能。
Bean 配置文件?- 包含類的信息以及如何配置它們麸恍。
用戶程序?- 它使用接口灵巧。
1.8. 使用 Spring 有哪些方式?
使用 Spring 有以下方式:
作為一個成熟的 Spring Web 應(yīng)用程序抹沪。
作為第三方 Web 框架刻肄,使用 Spring Frameworks 中間層。
用于遠程使用融欧。
作為企業(yè)級 Java Bean敏弃,它可以包裝現(xiàn)有的 POJO(Plain Old Java Objects)。
2噪馏、依賴注入(Ioc)
2.1. 什么是 Spring IOC 容器麦到?
Spring 框架的核心是 Spring 容器绿饵。容器創(chuàng)建對象,將它們裝配在一起瓶颠,配置它們并管理它們的完整生命周期拟赊。Spring 容器使用依賴注入來管理組成應(yīng)用程序的組件。容器通過讀取提供的配置元數(shù)據(jù)來接收對象進行實例化步清,配置和組裝的指令要门。該元數(shù)據(jù)可以通過 XML虏肾,Java 注解或 Java 代碼提供廓啊。
2.2. 什么是依賴注入?
在依賴注入中封豪,您不必創(chuàng)建對象谴轮,但必須描述如何創(chuàng)建它們。您不是直接在代碼中將組件和服務(wù)連接在一起吹埠,而是描述配置文件中哪些組件需要哪些服務(wù)第步。由 IoC 容器將它們裝配在一起。
2.3. 可以通過多少種方式完成依賴注入缘琅?
通常粘都,依賴注入可以通過三種方式完成,即:
構(gòu)造函數(shù)注入
setter 注入
接口注入
在 Spring Framework 中刷袍,僅使用構(gòu)造函數(shù)和 setter 注入翩隧。
2.4. 區(qū)分構(gòu)造函數(shù)注入和 setter 注入。
構(gòu)造函數(shù)注入setter 注入沒有部分注入有部分注入不會覆蓋 setter 屬性會覆蓋 setter 屬性任意修改都會創(chuàng)建一個新實例任意修改不會創(chuàng)建一個新實例適用于設(shè)置很多屬性適用于設(shè)置少量屬性
2.5. spring 中有多少種 IOC 容器呻纹?
BeanFactory - BeanFactory 就像一個包含 bean 集合的工廠類堆生。它會在客戶端要求時實例化 bean。
ApplicationContext - ApplicationContext 接口擴展了 BeanFactory 接口雷酪。它在 BeanFactory 基礎(chǔ)上提供了一些額外的功能淑仆。
2.6. 區(qū)分 BeanFactory 和 ApplicationContext。
BeanFactoryApplicationContext它使用懶加載它使用即時加載它使用語法顯式提供資源對象它自己創(chuàng)建和管理資源對象不支持國際化支持國際化不支持基于依賴的注解支持基于依賴的注解
2.7. 列舉 IoC 的一些好處哥力。
IoC 的一些好處是:
它將最小化應(yīng)用程序中的代碼量蔗怠。
它將使您的應(yīng)用程序易于測試,因為它不需要單元測試用例中的任何單例或 JNDI 查找機制吩跋。
它以最小的影響和最少的侵入機制促進松耦合寞射。
它支持即時的實例化和延遲加載服務(wù)。
2.8. Spring IoC 的實現(xiàn)機制钞澳。
Spring 中的 IoC 的實現(xiàn)原理就是工廠模式加反射機制怠惶。
示例:
3. Beans
3.1. 什么是 spring bean?
它們是構(gòu)成用戶應(yīng)用程序主干的對象轧粟。
Bean 由 Spring IoC 容器管理策治。
它們由 Spring IoC 容器實例化脓魏,配置,裝配和管理通惫。
Bean 是基于用戶提供給容器的配置元數(shù)據(jù)創(chuàng)建茂翔。
3.2. spring 提供了哪些配置方式?
基于 xml 配置
bean 所需的依賴項和服務(wù)在 XML 格式的配置文件中指定履腋。這些配置文件通常包含許多 bean 定義和特定于應(yīng)用程序的配置選項珊燎。它們通常以 bean 標簽開頭。例如:
基于注解配置
您可以通過在相關(guān)的類遵湖,方法或字段聲明上使用注解悔政,將 bean 配置為組件類本身,而不是使用 XML 來描述 bean 裝配延旧。默認情況下谋国,Spring 容器中未打開注解裝配。因此迁沫,您需要在使用它之前在 Spring 配置文件中啟用它芦瘾。例如:
基于 Java API 配置
Spring 的 Java 配置是通過使用 @Bean 和 @Configuration 來實現(xiàn)。
@Bean 注解扮演與 元素相同的角色集畅。
@Configuration 類允許通過簡單地調(diào)用同一個類中的其他 @Bean 方法來定義 bean 間依賴關(guān)系近弟。
例如:
@Configuration
public class StudentConfig {
@Bean
public StudentBean myStudent() {
return new StudentBean();
}
}
3.3. spring 支持集中 bean scope?
Spring bean 支持 5 種 scope:
Singleton?- 每個 Spring IoC 容器僅有一個單實例挺智。
Prototype?- 每次請求都會產(chǎn)生一個新的實例祷愉。
Request?- 每一次 HTTP 請求都會產(chǎn)生一個新的實例,并且該 bean 僅在當前 HTTP 請求內(nèi)有效逃贝。
Session?- 每一次 HTTP 請求都會產(chǎn)生一個新的 bean款青,同時該 bean 僅在當前 HTTP session 內(nèi)有效渣锦。
Global-session?- 類似于標準的 HTTP Session 作用域埃元,不過它僅僅在基于 portlet 的 web 應(yīng)用中才有意義织鲸。Portlet 規(guī)范定義了全局 Session 的概念,它被所有構(gòu)成某個 portlet web 應(yīng)用的各種不同的 portlet 所共享沪摄。在 global session 作用域中定義的 bean 被限定于全局 portlet Session 的生命周期范圍內(nèi)躯嫉。如果你在 web 中使用 global session 作用域來標識 bean,那么 web 會自動當成 session 類型來使用杨拐。
僅當用戶使用支持 Web 的 ApplicationContext 時祈餐,最后三個才可用。
3.4. spring bean 容器的生命周期是什么樣的哄陶?
spring bean 容器的生命周期流程如下:
Spring 容器根據(jù)配置中的 bean 定義中實例化 bean帆阳。
Spring 使用依賴注入填充所有屬性,如 bean 中所定義的配置屋吨。
如果 bean 實現(xiàn) BeanNameAware 接口蜒谤,則工廠通過傳遞 bean 的 ID 來調(diào)用 setBeanName()山宾。
如果 bean 實現(xiàn) BeanFactoryAware 接口,工廠通過傳遞自身的實例來調(diào)用 setBeanFactory()鳍徽。
如果存在與 bean 關(guān)聯(lián)的任何 BeanPostProcessors资锰,則調(diào)用 preProcessBeforeInitialization() 方法。
如果為 bean 指定了 init 方法( 的 init-method 屬性)阶祭,那么將調(diào)用它绷杜。
最后,如果存在與 bean 關(guān)聯(lián)的任何 BeanPostProcessors濒募,則將調(diào)用 postProcessAfterInitialization() 方法鞭盟。
如果 bean 實現(xiàn) DisposableBean 接口,當 spring 容器關(guān)閉時萨咳,會調(diào)用 destory()懊缺。
如果為 bean 指定了 destroy 方法( 的 destroy-method 屬性)疫稿,那么將調(diào)用它培他。
3.5. 什么是 spring 的內(nèi)部 bean?
只有將 bean 用作另一個 bean 的屬性時遗座,才能將 bean 聲明為內(nèi)部 bean舀凛。為了定義 bean,Spring 的基于 XML 的配置元數(shù)據(jù)在 或 中提供了 元素的使用途蒋。內(nèi)部 bean 總是匿名的猛遍,它們總是作為原型。
例如号坡,假設(shè)我們有一個 Student 類懊烤,其中引用了 Person 類。這里我們將只創(chuàng)建一個 Person 類實例并在 Student 中使用它宽堆。
Student.java
public class Student {
private Person person;
//Setters and Getters
}
public class Person {
private String name;
private String address;
//Setters and Getters
}
bean.xml
3.6. 什么是 spring 裝配
當 bean 在 Spring 容器中組合在一起時腌紧,它被稱為裝配或 bean 裝配。 Spring 容器需要知道需要什么 bean 以及容器應(yīng)該如何使用依賴注入來將 bean 綁定在一起畜隶,同時裝配 bean壁肋。
3.7. 自動裝配有哪些方式?
Spring 容器能夠自動裝配 bean籽慢。也就是說浸遗,可以通過檢查 BeanFactory 的內(nèi)容讓 Spring 自動解析 bean 的協(xié)作者。
自動裝配的不同模式:
no?- 這是默認設(shè)置箱亿,表示沒有自動裝配跛锌。應(yīng)使用顯式 bean 引用進行裝配。
byName?- 它根據(jù) bean 的名稱注入對象依賴項届惋。它匹配并裝配其屬性與 XML 文件中由相同名稱定義的 bean髓帽。
byType?- 它根據(jù)類型注入對象依賴項驾茴。如果屬性的類型與 XML 文件中的一個 bean 名稱匹配,則匹配并裝配屬性氢卡。
構(gòu)造函數(shù)?- 它通過調(diào)用類的構(gòu)造函數(shù)來注入依賴項锈至。它有大量的參數(shù)。
autodetect?- 首先容器嘗試通過構(gòu)造函數(shù)使用 autowire 裝配译秦,如果不能峡捡,則嘗試通過 byType 自動裝配。
3.8. 自動裝配有什么局限筑悴?
覆蓋的可能性 - 您始終可以使用 和 設(shè)置指定依賴項们拙,這將覆蓋自動裝配。
基本元數(shù)據(jù)類型 - 簡單屬性(如原數(shù)據(jù)類型阁吝,字符串和類)無法自動裝配砚婆。
令人困惑的性質(zhì) - 總是喜歡使用明確的裝配,因為自動裝配不太精確突勇。
4装盯、注解
4.1. 什么是基于注解的容器配置
不使用 XML 來描述 bean 裝配,開發(fā)人員通過在相關(guān)的類甲馋,方法或字段聲明上使用注解將配置移動到組件類本身埂奈。它可以作為 XML 設(shè)置的替代方案。例如:
Spring 的 Java 配置是通過使用 @Bean 和 @Configuration 來實現(xiàn)定躏。
@Bean 注解扮演與
元素相同的角色账磺。
@Configuration 類允許通過簡單地調(diào)用同一個類中的其他 @Bean 方法來定義 bean 間依賴關(guān)系。
例如:
@Configuration
public class StudentConfig {
@Bean
public StudentBean myStudent() {
return new StudentBean();
}
}
4.2. 如何在 spring 中啟動注解裝配痊远?
默認情況下垮抗,Spring 容器中未打開注解裝配。因此碧聪,要使用基于注解裝配冒版,我們必須通過配置 元素在 Spring 配置文件中啟用它。
4.3. @Component, @Controller, @Repository, @Service 有何區(qū)別矾削?
@Component:這將 java 類標記為 bean壤玫。它是任何 Spring 管理組件的通用構(gòu)造型。spring 的組件掃描機制現(xiàn)在可以將其拾取并將其拉入應(yīng)用程序環(huán)境中哼凯。
@Controller:這將一個類標記為 Spring Web MVC 控制器欲间。標有它的 Bean 會自動導(dǎo)入到 IoC 容器中。
@Service:此注解是組件注解的特化断部。它不會對 @Component 注解提供任何其他行為猎贴。您可以在服務(wù)層類中使用 @Service 而不是 @Component,因為它以更好的方式指定了意圖。
@Repository:這個注解是具有類似用途和功能的 @Component 注解的特化她渴。它為 DAO 提供了額外的好處达址。它將 DAO 導(dǎo)入 IoC 容器,并使未經(jīng)檢查的異常有資格轉(zhuǎn)換為 Spring DataAccessException趁耗。
4.4. @Required 注解有什么用沉唠?
@Required 應(yīng)用于 bean 屬性 setter 方法。此注解僅指示必須在配置時使用 bean 定義中的顯式屬性值或使用自動裝配填充受影響的 bean 屬性苛败。如果尚未填充受影響的 bean 屬性满葛,則容器將拋出 BeanInitializationException。
示例:
public class Employee {
private String name;
@Required
public void setName(String name){
this.name=name;
}
public string getName(){
return name;
}
}
4.5. @Autowired 注解有什么用罢屈?
@Autowired 可以更準確地控制應(yīng)該在何處以及如何進行自動裝配嘀韧。此注解用于在 setter 方法,構(gòu)造函數(shù)缠捌,具有任意名稱或多個參數(shù)的屬性或方法上自動裝配 bean锄贷。默認情況下,它是類型驅(qū)動的注入曼月。
public class Employee {
private String name;
@Autowired
public void setName(String name) {
this.name=name;
}
public string getName(){
return name;
}
}
4.6. @Qualifier 注解有什么用谊却?
當您創(chuàng)建多個相同類型的 bean 并希望僅使用屬性裝配其中一個 bean 時,您可以使用@Qualifier 注解和 @Autowired 通過指定應(yīng)該裝配哪個確切的 bean 來消除歧義十嘿。
例如因惭,這里我們分別有兩個類,Employee 和 EmpAccount绩衷。在 EmpAccount 中,使用@Qualifier 指定了必須裝配 id 為 emp1 的 bean激率。
Employee.java
public class Employee {
private String name;
@Autowired
public void setName(String name) {
this.name=name;
}
public string getName() {
return name;
}
}
EmpAccount.java
public class EmpAccount {
private Employee emp;
@Autowired
@Qualifier(emp1)
public void showName() {
System.out.println(“Employee name : ”+emp.getName);
}
}
4.7. @RequestMapping 注解有什么用咳燕?
@RequestMapping 注解用于將特定 HTTP 請求方法映射到將處理相應(yīng)請求的控制器中的特定類/方法。此注釋可應(yīng)用于兩個級別:
類級別:映射請求的 URL
方法級別:映射 URL 以及 HTTP 請求方法
5乒躺、數(shù)據(jù)訪問
5.1. spring DAO 有什么用招盲?
Spring DAO 使得 JDBC,Hibernate 或 JDO 這樣的數(shù)據(jù)訪問技術(shù)更容易以一種統(tǒng)一的方式工作嘉冒。這使得用戶容易在持久性技術(shù)之間切換曹货。它還允許您在編寫代碼時,無需考慮捕獲每種技術(shù)不同的異常讳推。
5.2. 列舉 Spring DAO 拋出的異常顶籽。
5.3. spring JDBC API 中存在哪些類?
JdbcTemplate
SimpleJdbcTemplate
NamedParameterJdbcTemplate
SimpleJdbcInsert
SimpleJdbcCall
5.4. 使用 Spring 訪問 Hibernate 的方法有哪些银觅?
我們可以通過兩種方式使用 Spring 訪問 Hibernate:
使用 Hibernate 模板和回調(diào)進行控制反轉(zhuǎn)
擴展 HibernateDAOSupport 并應(yīng)用 AOP 攔截器節(jié)點
5.5. 列舉 spring 支持的事務(wù)管理類型
Spring 支持兩種類型的事務(wù)管理:
程序化事務(wù)管理:在此過程中礼饱,在編程的幫助下管理事務(wù)。它為您提供極大的靈活性,但維護起來非常困難镊绪。
聲明式事務(wù)管理:在此匀伏,事務(wù)管理與業(yè)務(wù)代碼分離。僅使用注解或基于 XML 的配置來管理事務(wù)蝴韭。
5.6. spring 支持哪些 ORM 框架
Hibernate
iBatis
JPA
JDO
OJB
6够颠、AOP
6.1. 什么是 AOP?
AOP(Aspect-Oriented Programming), 即?面向切面編程, 它與 OOP( Object-Oriented Programming, 面向?qū)ο缶幊? 相輔相成, 提供了與 OOP 不同的抽象軟件結(jié)構(gòu)的視角.
在 OOP 中, 我們以類(class)作為我們的基本單元, 而 AOP 中的基本單元是?Aspect(切面)
6.2. 什么是 Aspect榄鉴?
aspect 由 pointcount 和 advice 組成, 它既包含了橫切邏輯的定義, 也包括了連接點的定義. Spring AOP 就是負責實施切面的框架, 它將切面所定義的橫切邏輯編織到切面所指定的連接點中.
AOP 的工作重心在于如何將增強編織目標對象的連接點上, 這里包含兩個工作:
如何通過 pointcut 和 advice 定位到特定的 joinpoint 上
如何在 advice 中編寫切面代碼.
可以簡單地認為, 使用 @Aspect 注解的類就是切面.
6.3. 什么是切點(JoinPoint)
程序運行中的一些時間點, 例如一個方法的執(zhí)行, 或者是一個異常的處理.
在 Spring AOP 中, join point 總是方法的執(zhí)行點摧找。
6.4. 什么是通知(Advice)?
特定 JoinPoint 處的 Aspect 所采取的動作稱為 Advice牢硅。Spring AOP 使用一個 Advice 作為攔截器蹬耘,在 JoinPoint “周圍”維護一系列的攔截器。
6.5. 有哪些類型的通知(Advice)减余?
Before?- 這些類型的 Advice 在 joinpoint 方法之前執(zhí)行综苔,并使用 @Before 注解標記進行配置。
After Returning?- 這些類型的 Advice 在連接點方法正常執(zhí)行后執(zhí)行位岔,并使用@AfterReturning 注解標記進行配置如筛。
After Throwing?- 這些類型的 Advice 僅在 joinpoint 方法通過拋出異常退出并使用 @AfterThrowing 注解標記配置時執(zhí)行。
After (finally)?- 這些類型的 Advice 在連接點方法之后執(zhí)行抒抬,無論方法退出是正常還是異常返回杨刨,并使用 @After 注解標記進行配置。
Around?- 這些類型的 Advice 在連接點之前和之后執(zhí)行擦剑,并使用 @Around 注解標記進行配置妖胀。
6.6. 指出在 spring aop 中 concern 和 cross-cutting concern 的不同之處。
concern 是我們想要在應(yīng)用程序的特定模塊中定義的行為惠勒。它可以定義為我們想要實現(xiàn)的功能赚抡。
cross-cutting concern 是一個適用于整個應(yīng)用的行為,這會影響整個應(yīng)用程序纠屋。例如涂臣,日志記錄,安全性和數(shù)據(jù)傳輸是應(yīng)用程序幾乎每個模塊都需要關(guān)注的問題售担,因此它們是跨領(lǐng)域的問題赁遗。
6.7. AOP 有哪些實現(xiàn)方式?
實現(xiàn) AOP 的技術(shù)族铆,主要分為兩大類:
靜態(tài)代理 - 指使用 AOP 框架提供的命令進行編譯岩四,從而在編譯階段就可生成 AOP 代理類,因此也稱為編譯時增強骑素;
編譯時編織(特殊編譯器實現(xiàn))
類加載時編織(特殊的類加載器實現(xiàn))炫乓。
動態(tài)代理 - 在運行時在內(nèi)存中“臨時”生成 AOP 動態(tài)代理類刚夺,因此也被稱為運行時增強。
JDK 動態(tài)代理
CGLIB
6.8. Spring AOP and AspectJ AOP 有什么區(qū)別末捣?
Spring AOP 基于動態(tài)代理方式實現(xiàn)侠姑;AspectJ 基于靜態(tài)代理方式實現(xiàn)。
Spring AOP 僅支持方法級別的 PointCut箩做;提供了完全的 AOP 支持莽红,它還支持屬性級別的 PointCut。
6.9. 如何理解 Spring 中的代理邦邦?
將 Advice 應(yīng)用于目標對象后創(chuàng)建的對象稱為代理安吁。在客戶端對象的情況下,目標對象和代理對象是相同的燃辖。
Advice + Target Object = Proxy
6.10. 什么是編織(Weaving)鬼店?
為了創(chuàng)建一個 advice 對象而鏈接一個 aspect 和其它應(yīng)用類型或?qū)ο螅Q為編織(Weaving)黔龟。在 Spring AOP 中妇智,編織在運行時執(zhí)行。請參考下圖:
7氏身、MVC
7.1. Spring MVC 框架有什么用巍棱?
Spring Web MVC 框架提供?模型-視圖-控制器?架構(gòu)和隨時可用的組件,用于開發(fā)靈活且松散耦合的 Web 應(yīng)用程序蛋欣。 MVC 模式有助于分離應(yīng)用程序的不同方面航徙,如輸入邏輯,業(yè)務(wù)邏輯和 UI 邏輯陷虎,同時在所有這些元素之間提供松散耦合到踏。
7.2. 描述一下 DispatcherServlet 的工作流程
DispatcherServlet 的工作流程可以用一幅圖來說明:
向服務(wù)器發(fā)送 HTTP 請求,請求被前端控制器 DispatcherServlet 捕獲泻红。
DispatcherServlet 根據(jù)?-servlet.xml?中的配置對請求的 URL 進行解析夭禽,得到請求資源標識符(URI)。然后根據(jù)該 URI谊路,調(diào)用 HandlerMapping 獲得該 Handler 配置的所有相關(guān)的對象(包括 Handler 對象以及 Handler 對象對應(yīng)的攔截器),最后以HandlerExecutionChain 對象的形式返回菩彬。
DispatcherServlet 根據(jù)獲得的Handler缠劝,選擇一個合適的HandlerAdapter。(附注:如果成功獲得HandlerAdapter后骗灶,此時將開始執(zhí)行攔截器的 preHandler(...)方法)惨恭。
提取Request中的模型數(shù)據(jù),填充Handler入?yún)业_始執(zhí)行Handler(Controller)脱羡。 在填充Handler的入?yún)⑦^程中,根據(jù)你的配置,Spring 將幫你做一些額外的工作:
HttpMessageConveter: 將請求消息(如 Json锉罐、xml 等數(shù)據(jù))轉(zhuǎn)換成一個對象帆竹,將對象轉(zhuǎn)換為指定的響應(yīng)信息。
數(shù)據(jù)轉(zhuǎn)換:對請求消息進行數(shù)據(jù)轉(zhuǎn)換脓规。如String轉(zhuǎn)換成Integer栽连、Double等。
數(shù)據(jù)根式化:對請求消息進行數(shù)據(jù)格式化侨舆。 如將字符串轉(zhuǎn)換成格式化數(shù)字或格式化日期等秒紧。
數(shù)據(jù)驗證: 驗證數(shù)據(jù)的有效性(長度、格式等)挨下,驗證結(jié)果存儲到BindingResult或Error中熔恢。
Handler(Controller)執(zhí)行完成后,向 DispatcherServlet 返回一個ModelAndView 對象臭笆;
根據(jù)返回的ModelAndView叙淌,選擇一個適合的 ViewResolver(必須是已經(jīng)注冊到 Spring 容器中的ViewResolver)返回給DispatcherServlet。
ViewResolver 結(jié)合Model和View耗啦,來渲染視圖凿菩。
視圖負責將渲染結(jié)果返回給客戶端。
7.3. 介紹一下 WebApplicationContext
WebApplicationContext 是 ApplicationContext 的擴展帜讲。它具有 Web 應(yīng)用程序所需的一些額外功能衅谷。它與普通的 ApplicationContext 在解析主題和決定與哪個 servlet 關(guān)聯(lián)的能力方面有所不同。
(完)