50 道 經(jīng)典 Spring 面試題

1、基礎(chǔ)概念

1.1. 不同版本的 Spring Framework 有哪些主要功能唠帝?

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)點(diǎn)曙寡。

由于 Spring Frameworks 的分層架構(gòu),用戶可以自由選擇自己需要的組件举庶。

Spring Framework 支持 POJO(Plain Old Java Object) 編程揩抡,從而具備持續(xù)集成和可測試性。

由于依賴注入和控制反轉(zhuǎn)捅膘,JDBC 得以簡化。

它是開源免費(fèi)的寻仗。

1.4. Spring Framework 有哪些不同的功能?

輕量級 - Spring 在代碼量和透明度方面都很輕便署尤。

IOC - 控制反轉(zhuǎn)

AOP - 面向切面編程可以將應(yīng)用業(yè)務(wù)邏輯和系統(tǒng)服務(wù)分離耙替,以實(shí)現(xiàn)高內(nèi)聚曹体。

容器 - Spring 負(fù)責(zé)創(chuàng)建和管理對象(Bean)的生命周期和配置箕别。

MVC - 對 web 應(yīng)用提供了高度可配置性滞谢,其他框架的集成也十分方便狮杨。

事務(wù)管理 - 提供了用于事務(wù)管理的通用抽象層到忽。Spring 的事務(wù)支持也可用于容器較少的環(huán)境喘漏。

JDBC 異常 - Spring 的 JDBC 抽象層提供了一個異常層次結(jié)構(gòu),簡化了錯誤處理策略持灰。

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 – 該層為類檢測和類加載器實(shí)現(xiàn)提供支持攻泼。

Test – 該層為使用 JUnit 和 TestNG 進(jìn)行測試提供支持忙菠。

幾個雜項(xiàng)模塊:

Messaging – 該模塊為 STOMP 提供支持。它還支持注解編程模型骡男,該模型用于從 WebSocket 客戶端路由和處理 STOMP 消息

Aspects – 該模塊為與 AspectJ 的集成提供支持傍睹。

1.6. 什么是 Spring 配置文件?

Spring 配置文件是 XML 文件已亥。該文件主要包含類信息来屠。它描述了這些類是如何配置以及相互引入的俱笛。但是迎膜,XML 配置文件冗長且更加干凈浆兰。如果沒有正確規(guī)劃和編寫簸呈,那么在大項(xiàng)目中管理變得非常困難蜕便。

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 中間層。

用于遠(yuǎn)程使用玷犹。

作為企業(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ù)來接收對象進(jìn)行實(shí)例化,配置和組裝的指令悍引。該元數(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 注入帐我。

2.5. spring 中有多少種 IOC 容器拦键?

BeanFactory - BeanFactory 就像一個包含 bean 集合的工廠類芬为。它會在客戶端要求時實(shí)例化 bean媚朦。

ApplicationContext - ApplicationContext 接口擴(kuò)展了 BeanFactory 接口询张。它在 BeanFactory 基礎(chǔ)上提供了一些額外的功能份氧。

2.6. 區(qū)分 BeanFactory 和 ApplicationContext。

2.7. 列舉 IoC 的一些好處。

IoC 的一些好處是:

它將最小化應(yīng)用程序中的代碼量蔬顾。

它將使您的應(yīng)用程序易于測試湘捎,因?yàn)樗恍枰獑卧獪y試用例中的任何單例或 JNDI 查找機(jī)制消痛。

它以最小的影響和最少的侵入機(jī)制促進(jìn)松耦合秩伞。

它支持即時的實(shí)例化和延遲加載服務(wù)纱新。

2.8. Spring IoC 的實(shí)現(xiàn)機(jī)制脸爱。

Spring 中的 IoC 的實(shí)現(xiàn)原理就是工廠模式加反射機(jī)制。

示例:

interface Fruit {

? ? public abstract void eat();

}

class Apple implements Fruit {

? ? public void eat(){

? ? ? ? System.out.println("Apple");

? ? }

}

class Orange implements Fruit {

? ? public void eat(){

? ? ? ? System.out.println("Orange");

? ? }

}

class Factory {

? ? public static Fruit getInstance(String ClassName) {

? ? ? ? Fruit f=null;

? ? ? ? try {

? ? ? ? ? ? f=(Fruit)Class.forName(ClassName).newInstance();

? ? ? ? } catch (Exception e) {

? ? ? ? ? ? e.printStackTrace();

? ? ? ? }

? ? ? ? return f;

? ? }

}

class Client {

? ? public static void main(String[] a) {

? ? ? ? Fruit f=Factory.getInstance("io.github.dunwu.spring.Apple");

? ? ? ? if(f!=null){

? ? ? ? ? ? f.eat();

? ? ? ? }

? ? }

}

3络它、Beans

3.1. 什么是 spring bean化戳?

它們是構(gòu)成用戶應(yīng)用程序主干的對象点楼。

Bean 由 Spring IoC 容器管理掠廓。

它們由 Spring IoC 容器實(shí)例化蟀瞧,配置媳拴,裝配和管理屈溉。

Bean 是基于用戶提供給容器的配置元數(shù)據(jù)創(chuàng)建子巾。

3.2. spring 提供了哪些配置方式线梗?

基于 xml 配置

bean 所需的依賴項(xiàng)和服務(wù)在 XML 格式的配置文件中指定仪搔。這些配置文件通常包含許多 bean 定義和特定于應(yīng)用程序的配置選項(xiàng)烤咧。它們通常以 bean 標(biāo)簽開頭煮嫌。例如:

<bean id="studentbean" class="org.edureka.firstSpring.StudentBean">

<property name="name" value="Edureka"></property>

</bean>

基于注解配置

您可以通過在相關(guān)的類抱虐,方法或字段聲明上使用注解,將 bean 配置為組件類本身灶轰,而不是使用 XML 來描述 bean 裝配笋颤。默認(rèn)情況下椰弊,Spring 容器中未打開注解裝配秉版。因此清焕,您需要在使用它之前在 Spring 配置文件中啟用它秸妥。例如:

<beans>

<context:annotation-config/>

<!-- bean definitions go here -->

</beans>

基于 Java API 配置

Spring 的 Java 配置是通過使用 @Bean 和 @Configuration 來實(shí)現(xiàn)粥惧。

@Bean 注解扮演與 <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 容器僅有一個單實(shí)例辰狡。

Prototype - 每次請求都會產(chǎn)生一個新的實(shí)例搓译。

Request - 每一次 HTTP 請求都會產(chǎn)生一個新的實(shí)例些己,并且該 bean 僅在當(dāng)前 HTTP 請求內(nèi)有效段标。

Session - 每一次 HTTP 請求都會產(chǎn)生一個新的 bean逼庞,同時該 bean 僅在當(dāng)前 HTTP session 內(nèi)有效赛糟。

Global-session - 類似于標(biāo)準(zhǔn)的 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 作用域來標(biāo)識 bean脂男,那么 web 會自動當(dāng)成 session 類型來使用。

僅當(dāng)用戶使用支持 Web 的 ApplicationContext 時爽室,最后三個才可用阔墩。更多spring內(nèi)容

3.4. spring bean 容器的生命周期是什么樣的啸箫?

spring bean 容器的生命周期流程如下:

Spring 容器根據(jù)配置中的 bean 定義中實(shí)例化 bean

Spring 使用依賴注入填充所有屬性忘苛,如 bean 中所定義的配置召川。

如果 bean 實(shí)現(xiàn) BeanNameAware 接口胸遇,則工廠通過傳遞 bean 的 ID 來調(diào)用 setBeanName()纸镊。

如果 bean 實(shí)現(xiàn) BeanFactoryAware 接口逗威,工廠通過傳遞自身的實(shí)例來調(diào)用 setBeanFactory()罢艾。

如果存在與 bean 關(guān)聯(lián)的任何 BeanPostProcessors咐蚯,則調(diào)用 preProcessBeforeInitialization() 方法春锋。

如果為 bean 指定了 init 方法( <bean>的 init-method 屬性)期奔,那么將調(diào)用它呐萌。

最后肺孤,如果存在與 bean 關(guān)聯(lián)的任何 BeanPostProcessors赠堵,則將調(diào)用 postProcessAfterInitialization() 方法茫叭。

如果 bean 實(shí)現(xiàn) DisposableBean 接口揍愁,當(dāng) spring 容器關(guān)閉時吗垮,會調(diào)用 destory()烁登。

如果為 bean 指定了 destroy 方法( <bean>的 destroy-method 屬性)饵沧,那么將調(diào)用它狼牺。

3.5. 什么是 spring 的內(nèi)部 bean掠归?

只有將 bean 用作另一個 bean 的屬性時虏冻,才能將 bean 聲明為內(nèi)部 bean厨相。為了定義 bean蛮穿,Spring 的基于 XML 的配置元數(shù)據(jù)在<property>或<constructor-arg> 中提供了<bean>元素的使用践磅。內(nèi)部 bean 總是匿名的灸异,它們總是作為原型音诈。

例如,假設(shè)我們有一個 Student 類绎狭,其中引用了 Person 類。這里我們將只創(chuàng)建一個 Person 類實(shí)例并在 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

<bean id=“StudentBean" class="com.edureka.Student">

? ? <property name="person">

? ? ? ? <!--This is inner bean -->

? ? ? ? <bean class="com.edureka.Person">

? ? ? ? ? ? <property name="name" value=“Scott"></property>

? ? ? ? ? ? <property name="address" value=“Bangalore"></property>

? ? ? ? </bean>

? ? </property>

</bean>

3.6. 什么是 spring 裝配

當(dāng) bean 在 Spring 容器中組合在一起時儡嘶,它被稱為裝配或 bean 裝配。Spring 容器需要知道需要什么 bean 以及容器應(yīng)該如何使用依賴注入來將 bean 綁定在一起蹦狂,同時裝配 bean誓篱。

3.7. 自動裝配有哪些方式?

Spring 容器能夠自動裝配 bean凯楔。也就是說窜骄,可以通過檢查 BeanFactory 的內(nèi)容讓 Spring 自動解析 bean 的協(xié)作者。

自動裝配的不同模式:

no - 這是默認(rèn)設(shè)置摆屯,表示沒有自動裝配邻遏。應(yīng)使用顯式 bean 引用進(jìn)行裝配。

byName - 它根據(jù) bean 的名稱注入對象依賴項(xiàng)虐骑。它匹配并裝配其屬性與 XML 文件中由相同名稱定義的 bean准验。

byType - 它根據(jù)類型注入對象依賴項(xiàng)。如果屬性的類型與 XML 文件中的一個 bean 名稱匹配廷没,則匹配并裝配屬性糊饱。

構(gòu)造函數(shù) - 它通過調(diào)用類的構(gòu)造函數(shù)來注入依賴項(xiàng)。它有大量的參數(shù)颠黎。

autodetect - 首先容器嘗試通過構(gòu)造函數(shù)使用 autowire 裝配另锋,如果不能,則嘗試通過 byType 自動裝配狭归。

3.8. 自動裝配有什么局限夭坪?

覆蓋的可能性 - 您始終可以使用<constructor-arg> 和 <property>設(shè)置指定依賴項(xiàng),這將覆蓋自動裝配唉铜。

基本元數(shù)據(jù)類型 - 簡單屬性(如原數(shù)據(jù)類型台舱,字符串和類)無法自動裝配。

令人困惑的性質(zhì) - 總是喜歡使用明確的裝配潭流,因?yàn)樽詣友b配不太精確竞惋。

4、注 解

4.1. 你用過哪些重要的 Spring 注解灰嫉?

@Controller - 用于 Spring MVC 項(xiàng)目中的控制器類拆宛。

@Service - 用于服務(wù)類。

@RequestMapping - 用于在控制器處理程序方法中配置 URI 映射讼撒。

@ResponseBody - 用于發(fā)送 Object 作為響應(yīng)浑厚,通常用于發(fā)送 XML 或 JSON 數(shù)據(jù)作為響應(yīng)。

@PathVariable - 用于將動態(tài)值從 URI 映射到處理程序方法參數(shù)根盒。

@Autowired - 用于在 spring bean 中自動裝配依賴項(xiàng)钳幅。

@Qualifier - 使用 @Autowired 注解,以避免在存在多個 bean 類型實(shí)例時出現(xiàn)混淆炎滞。

@Scope - 用于配置 spring bean 的范圍敢艰。

@Configuration,@ComponentScan 和 @Bean - 用于基于 java 的配置册赛。

@Aspect钠导,@Before震嫉,@After,@Around牡属,@Pointcut - 用于切面編程(AOP)票堵。

4.2. 如何在 spring 中啟動注解裝配?

默認(rèn)情況下逮栅,Spring 容器中未打開注解裝配悴势。因此,要使用基于注解裝配证芭,我們必須通過配置<context:annotation-config /> 元素在 Spring 配置文件中啟用它瞳浦。

4.3. @Component, @Controller, @Repository, @Service 有何區(qū)別?

@Component:這將 java 類標(biāo)記為 bean废士。它是任何 Spring 管理組件的通用構(gòu)造型叫潦。spring 的組件掃描機(jī)制現(xiàn)在可以將其拾取并將其拉入應(yīng)用程序環(huán)境中。

@Controller:這將一個類標(biāo)記為 Spring Web MVC 控制器官硝。標(biāo)有它的 Bean 會自動導(dǎo)入到 IoC 容器中矗蕊。

@Service:此注解是組件注解的特化。它不會對 @Component 注解提供任何其他行為氢架。您可以在服務(wù)層類中使用 @Service 而不是 @Component傻咖,因?yàn)樗愿玫姆绞街付艘鈭D。

@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 可以更準(zhǔn)確地控制應(yīng)該在何處以及如何進(jìn)行自動裝配崭放。此注解用于在 setter 方法,構(gòu)造函數(shù)鸽凶,具有任意名稱或多個參數(shù)的屬性或方法上自動裝配 bean币砂。默認(rèn)情況下,它是類型驅(qū)動的注入玻侥。

public class Employee {

? ? private String name;

? ? @Autowired

? ? public void setName(String name) {

? ? ? ? this.name=name;

? ? }

? ? public string getName(){

? ? ? ? return name;

? ? }

}

4.6. @Qualifier 注解有什么用道伟?

當(dāng)您創(chuàng)建多個相同類型的 bean 并希望僅使用屬性裝配其中一個 bean 時,您可以使用@Qualifier 注解和 @Autowired 通過指定應(yīng)該裝配哪個確切的 bean 來消除歧義。

例如蜜徽,這里我們分別有兩個類,Employee 和 EmpAccount票摇。在 EmpAccount 中拘鞋,使用@Qualifier 指定了必須裝配 id 為 emp1 的 bean。

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)進(jìn)行控制反轉(zhuǎn)

擴(kuò)展 HibernateDAOSupport 并應(yīng)用 AOP 攔截器節(jié)點(diǎn)

5.5. 列舉 spring 支持的事務(wù)管理類型

Spring 支持兩種類型的事務(wù)管理:

程序化事務(wù)管理:在此過程中耗溜,在編程的幫助下管理事務(wù)组力。它為您提供極大的靈活性,但維護(hù)起來非常困難抖拴。

聲明式事務(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. AOP 中的 Aspect家夺、Advice脱柱、Pointcut、JointPoint 和 Advice 參數(shù)分別是什么拉馋?

Aspect - Aspect 是一個實(shí)現(xiàn)交叉問題的類榨为,例如事務(wù)管理。方面可以是配置的普通類煌茴,然后在 Spring Bean 配置文件中配置随闺,或者我們可以使用 Spring AspectJ 支持使用 @Aspect 注解將類聲明為 Aspect。

Advice - Advice 是針對特定 JoinPoint 采取的操作蔓腐。在編程方面矩乐,它們是在應(yīng)用程序中達(dá)到具有匹配切入點(diǎn)的特定 JoinPoint 時執(zhí)行的方法。您可以將 Advice 視為 Spring 攔截器(Interceptor)或 Servlet 過濾器(filter)。

Advice Arguments - 我們可以在 advice 方法中傳遞參數(shù)散罕。我們可以在切入點(diǎn)中使用 args() 表達(dá)式來應(yīng)用于與參數(shù)模式匹配的任何方法分歇。如果我們使用它,那么我們需要在確定參數(shù)類型的 advice 方法中使用相同的名稱欧漱。

Pointcut - Pointcut 是與 JoinPoint 匹配的正則表達(dá)式职抡,用于確定是否需要執(zhí)行 Advice。Pointcut 使用與 JoinPoint 匹配的不同類型的表達(dá)式误甚。Spring 框架使用 AspectJ Pointcut 表達(dá)式語言來確定將應(yīng)用通知方法的 JoinPoint缚甩。

JoinPoint - JoinPoint 是應(yīng)用程序中的特定點(diǎn),例如方法執(zhí)行窑邦,異常處理擅威,更改對象變量值等。在 Spring AOP 中冈钦,JoinPoint 始終是方法的執(zhí)行器郊丛。

6.3. 什么是通知(Advice)?

特定 JoinPoint 處的 Aspect 所采取的動作稱為 Advice派继。Spring AOP 使用一個 Advice 作為攔截器宾袜,在 JoinPoint “周圍”維護(hù)一系列的攔截器。

6.4. 有哪些類型的通知(Advice)驾窟?

Before - 這些類型的 Advice 在 joinpoint 方法之前執(zhí)行庆猫,并使用 @Before 注解標(biāo)記進(jìn)行配置。

After Returning - 這些類型的 Advice 在連接點(diǎn)方法正常執(zhí)行后執(zhí)行绅络,并使用@AfterReturning 注解標(biāo)記進(jìn)行配置月培。

After Throwing - 這些類型的 Advice 僅在 joinpoint 方法通過拋出異常退出并使用 @AfterThrowing 注解標(biāo)記配置時執(zhí)行。

After (finally) - 這些類型的 Advice 在連接點(diǎn)方法之后執(zhí)行恩急,無論方法退出是正常還是異常返回杉畜,并使用 @After 注解標(biāo)記進(jìn)行配置。

Around - 這些類型的 Advice 在連接點(diǎn)之前和之后執(zhí)行衷恭,并使用 @Around 注解標(biāo)記進(jìn)行配置此叠。

6.5. 指出在 spring aop 中 concern 和 cross-cutting concern 的不同之處。

concern 是我們想要在應(yīng)用程序的特定模塊中定義的行為随珠。它可以定義為我們想要實(shí)現(xiàn)的功能灭袁。

cross-cutting concern 是一個適用于整個應(yīng)用的行為,這會影響整個應(yīng)用程序窗看。例如茸歧,日志記錄,安全性和數(shù)據(jù)傳輸是應(yīng)用程序幾乎每個模塊都需要關(guān)注的問題显沈,因此它們是跨領(lǐng)域的問題软瞎。

6.6. AOP 有哪些實(shí)現(xiàn)方式逢唤?

實(shí)現(xiàn) AOP 的技術(shù),主要分為兩大類:

靜態(tài)代理 - 指使用 AOP 框架提供的命令進(jìn)行編譯涤浇,從而在編譯階段就可生成 AOP 代理類鳖藕,因此也稱為編譯時增強(qiáng);

編譯時編織(特殊編譯器實(shí)現(xiàn))

類加載時編織(特殊的類加載器實(shí)現(xiàn))只锭。

動態(tài)代理 - 在運(yùn)行時在內(nèi)存中“臨時”生成 AOP 動態(tài)代理類吊奢,因此也被稱為運(yùn)行時增強(qiáng)。

JDK 動態(tài)代理

CGLIB

6.7. Spring AOP and AspectJ AOP 有什么區(qū)別纹烹?

Spring AOP 基于動態(tài)代理方式實(shí)現(xiàn);AspectJ 基于靜態(tài)代理方式實(shí)現(xiàn)召边。

Spring AOP 僅支持方法級別的 PointCut铺呵;提供了完全的 AOP 支持,它還支持屬性級別的 PointCut隧熙。

6.8. 如何理解 Spring 中的代理片挂?

將 Advice 應(yīng)用于目標(biāo)對象后創(chuàng)建的對象稱為代理。在客戶端對象的情況下贞盯,目標(biāo)對象和代理對象是相同的音念。

Advice + Target Object = Proxy

6.9. 什么是編織(Weaving)?

為了創(chuàng)建一個 advice 對象而鏈接一個 aspect 和其它應(yīng)用類型或?qū)ο篚锔遥Q為編織(Weaving)闷愤。在 Spring AOP 中,編織在運(yùn)行時執(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 進(jìn)行解析,得到請求資源標(biāo)識符(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)換:對請求消息進(jìn)行數(shù)據(jù)轉(zhuǎn)換熏纯。如String轉(zhuǎn)換成Integer同诫、Double等。

數(shù)據(jù)根式化:對請求消息進(jìn)行數(shù)據(jù)格式化樟澜。如將字符串轉(zhuǎn)換成格式化數(shù)字或格式化日期等误窖。

數(shù)據(jù)驗(yàn)證:驗(yàn)證數(shù)據(jù)的有效性(長度、格式等)秩贰,驗(yàn)證結(jié)果存儲到BindingResult或Error中霹俺。

5. Handler(Controller)執(zhí)行完成后,向 DispatcherServlet 返回一個 ModelAndView 對象毒费;

6. 根據(jù)返回的ModelAndView丙唧,選擇一個適合的 ViewResolver(必須是已經(jīng)注冊到 Spring 容器中的ViewResolver)返回給DispatcherServlet。

7. ViewResolver 結(jié)合Model和View蝗罗,來渲染視圖艇棕。

8. 視圖負(fù)責(zé)將渲染結(jié)果返回給客戶端。

7.3. 介紹一下 WebApplicationContext

WebApplicationContext 是 ApplicationContext 的擴(kuò)展串塑。它具有 Web 應(yīng)用程序所需的一些額外功能沼琉。它與普通的 ApplicationContext 在解析主題和決定與哪個 servlet 關(guān)聯(lián)的能力方面有所不同。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末桩匪,一起剝皮案震驚了整個濱河市打瘪,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌傻昙,老刑警劉巖闺骚,帶你破解...
    沈念sama閱讀 217,277評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異妆档,居然都是意外死亡僻爽,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評論 3 393
  • 文/潘曉璐 我一進(jìn)店門贾惦,熙熙樓的掌柜王于貴愁眉苦臉地迎上來胸梆,“玉大人敦捧,你說我怎么就攤上這事∨鼍担” “怎么了兢卵?”我有些...
    開封第一講書人閱讀 163,624評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長绪颖。 經(jīng)常有香客問我秽荤,道長,這世上最難降的妖魔是什么柠横? 我笑而不...
    開封第一講書人閱讀 58,356評論 1 293
  • 正文 為了忘掉前任窃款,我火速辦了婚禮,結(jié)果婚禮上牍氛,老公的妹妹穿的比我還像新娘雁乡。我一直安慰自己,他們只是感情好糜俗,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,402評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著曲饱,像睡著了一般悠抹。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上扩淀,一...
    開封第一講書人閱讀 51,292評論 1 301
  • 那天楔敌,我揣著相機(jī)與錄音,去河邊找鬼驻谆。 笑死卵凑,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的胜臊。 我是一名探鬼主播勺卢,決...
    沈念sama閱讀 40,135評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼象对!你這毒婦竟也來了黑忱?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,992評論 0 275
  • 序言:老撾萬榮一對情侶失蹤勒魔,失蹤者是張志新(化名)和其女友劉穎甫煞,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體冠绢,經(jīng)...
    沈念sama閱讀 45,429評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡抚吠,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,636評論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了弟胀。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片楷力。...
    茶點(diǎn)故事閱讀 39,785評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡喊式,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出弥雹,到底是詐尸還是另有隱情垃帅,我是刑警寧澤,帶...
    沈念sama閱讀 35,492評論 5 345
  • 正文 年R本政府宣布剪勿,位于F島的核電站贸诚,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏厕吉。R本人自食惡果不足惜酱固,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,092評論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望头朱。 院中可真熱鬧运悲,春花似錦、人聲如沸项钮。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,723評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽烁巫。三九已至署隘,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間亚隙,已是汗流浹背磁餐。 一陣腳步聲響...
    開封第一講書人閱讀 32,858評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留阿弃,地道東北人诊霹。 一個月前我還...
    沈念sama閱讀 47,891評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像渣淳,于是被迫代替她去往敵國和親脾还。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,713評論 2 354

推薦閱讀更多精彩內(nèi)容