Spring 那些最常見的面試問題:收藏躺率,面試再也不怕Spring問題了

  • 1. 一般問題
  • 1.1. 不同版本的 Spring Framework 有哪些主要功能?
  • 1.2. 什么是 Spring Framework万矾?
  • 1.3. 列舉 Spring Framework 的優(yōu)點悼吱。
  • 1.4. Spring Framework 有哪些不同的功能?
  • 1.5. Spring Framework 中有多少個模塊良狈,它們分別是什么后添?
  • 1.6. 什么是 Spring 配置文件?
  • 1.7. Spring 應(yīng)用程序有哪些不同組件薪丁?
  • 1.8. 使用 Spring 有哪些方式遇西?
  • 2. 依賴注入(Ioc)
  • 2.1. 什么是 Spring IOC 容器?
  • 2.2. 什么是依賴注入严嗜?
  • 2.3. 可以通過多少種方式完成依賴注入粱檀?
  • 2.4. 區(qū)分構(gòu)造函數(shù)注入和 setter 注入。
  • 2.5. spring 中有多少種 IOC 容器漫玄?
  • 2.6. 區(qū)分 BeanFactory 和 ApplicationContext茄蚯。
  • 2.7. 列舉 IoC 的一些好處。
  • 2.8. Spring IoC 的實現(xiàn)機制。
  • 3. Beans
  • 3.1. 什么是 spring bean第队?
  • 3.2. spring 提供了哪些配置方式哮塞?
  • 3.3. spring 支持集中 bean scope凳谦?
  • 3.4. spring bean 容器的生命周期是什么樣的忆畅?
  • 3.5. 什么是 spring 的內(nèi)部 bean?
  • 3.6. 什么是 spring 裝配
  • 3.7. 自動裝配有哪些方式尸执?
  • 3.8. 自動裝配有什么局限家凯?
  • 4. 注解
  • 4.1. 你用過哪些重要的 Spring 注解?
  • 4.2. 如何在 spring 中啟動注解裝配如失?
  • 4.3. @Component, @Controller, @Repository, @Service 有何區(qū)別绊诲?
  • 4.4. @Required 注解有什么用?
  • 4.5. @Autowired 注解有什么用褪贵?
  • 4.6. @Qualifier 注解有什么用掂之?
  • 4.7. @RequestMapping 注解有什么用?
  • 5. 數(shù)據(jù)訪問
  • 5.1. spring DAO 有什么用脆丁?
  • 5.2. 列舉 Spring DAO 拋出的異常世舰。
  • 5.3. spring JDBC API 中存在哪些類?
  • 5.4. 使用 Spring 訪問 Hibernate 的方法有哪些槽卫?
  • 5.5. 列舉 spring 支持的事務(wù)管理類型
  • 5.6. spring 支持哪些 ORM 框架
  • 6. AOP
  • 6.1. 什么是 AOP跟压?
  • 6.2. AOP 中的 Aspect、Advice歼培、Pointcut震蒋、JointPoint 和 Advice 參數(shù)分別是什么?
  • 6.3. 什么是通知(Advice)躲庄?
  • 6.4. 有哪些類型的通知(Advice)查剖?
  • 6.5. 指出在 spring aop 中 concern 和 cross-cutting concern 的不同之處。
  • 6.6. AOP 有哪些實現(xiàn)方式读跷?
  • 6.7. Spring AOP and AspectJ AOP 有什么區(qū)別梗搅?
  • 6.8. 如何理解 Spring 中的代理禾唁?
  • 6.9. 什么是編織(Weaving)效览?
  • 7. MVC
  • 7.1. Spring MVC 框架有什么用?
  • 7.2. 描述一下 DispatcherServlet 的工作流程
  • 7.3. 介紹一下 WebApplicationContext
  • 8. 資料

1. 一般問題

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

Spring 那些最常見的面試問題:收藏丐枉,面試再也不怕Spring問題了

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)递胧,簡化了錯誤處理策略橡庞。

1.5. Spring Framework 中有多少個模塊,它們分別是什么?

Spring 那些最常見的面試問題:收藏,面試再也不怕Spring問題了

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 代碼提供塔次。

Spring 那些最常見的面試問題:收藏方篮,面試再也不怕Spring問題了

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 注入乞榨。

Spring 那些最常見的面試問題:收藏,面試再也不怕Spring問題了

2.5. spring 中有多少種 IOC 容器当娱?

  • BeanFactory - BeanFactory 就像一個包含 bean 集合的工廠類吃既。它會在客戶端要求時實例化 bean。
  • ApplicationContext - ApplicationContext 接口擴展了 BeanFactory 接口跨细。它在 BeanFactory 基礎(chǔ)上提供了一些額外的功能鹦倚。

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

Spring 那些最常見的面試問題:收藏扼鞋,面試再也不怕Spring問題了

2.7. 列舉 IoC 的一些好處申鱼。

IoC 的一些好處是:

  • 它將最小化應(yīng)用程序中的代碼量。
  • 它將使您的應(yīng)用程序易于測試云头,因為它不需要單元測試用例中的任何單例或 JNDI 查找機制捐友。
  • 它以最小的影響和最少的侵入機制促進松耦合。
  • 它支持即時的實例化和延遲加載服務(wù)溃槐。

2.8. Spring IoC 的實現(xiàn)機制匣砖。

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

示例:

<pre style="-webkit-tap-highlight-color: transparent; box-sizing: border-box; font-family: Consolas, Menlo, Courier, monospace; font-size: 16px; white-space: pre-wrap; position: relative; line-height: 1.5; color: rgb(153, 153, 153); margin: 1em 0px; padding: 12px 10px; background: rgb(244, 245, 246); border: 1px solid rgb(232, 232, 232); font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial;">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();
}
}
}
</pre>

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 標簽開頭抚恒。例如:

<pre style="-webkit-tap-highlight-color: transparent; box-sizing: border-box; font-family: Consolas, Menlo, Courier, monospace; font-size: 16px; white-space: pre-wrap; position: relative; line-height: 1.5; color: rgb(153, 153, 153); margin: 1em 0px; padding: 12px 10px; background: rgb(244, 245, 246); border: 1px solid rgb(232, 232, 232); font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial;"><bean id="studentbean" class="org.edureka.firstSpring.StudentBean">
<property name="name" value="Edureka"></property>
</bean>
</pre>

  • 基于注解配置

您可以通過在相關(guān)的類,方法或字段聲明上使用注解络拌,將 bean 配置為組件類本身俭驮,而不是使用 XML 來描述 bean 裝配。默認情況下春贸,Spring 容器中未打開注解裝配混萝。因此遗遵,您需要在使用它之前在 Spring 配置文件中啟用它。例如:

<pre style="-webkit-tap-highlight-color: transparent; box-sizing: border-box; font-family: Consolas, Menlo, Courier, monospace; font-size: 16px; white-space: pre-wrap; position: relative; line-height: 1.5; color: rgb(153, 153, 153); margin: 1em 0px; padding: 12px 10px; background: rgb(244, 245, 246); border: 1px solid rgb(232, 232, 232); font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial;"><beans>
<context:annotation-config/>

</beans>
</pre>

  • 基于 Java API 配置

Spring 的 Java 配置是通過使用 @Bean 和 @Configuration 來實現(xiàn)譬圣。

  1. @Bean 注解扮演與 元素相同的角色瓮恭。
  2. @Configuration 類允許通過簡單地調(diào)用同一個類中的其他 @Bean 方法來定義 bean 間依賴關(guān)系雄坪。

例如:

<pre style="-webkit-tap-highlight-color: transparent; box-sizing: border-box; font-family: Consolas, Menlo, Courier, monospace; font-size: 16px; white-space: pre-wrap; position: relative; line-height: 1.5; color: rgb(153, 153, 153); margin: 1em 0px; padding: 12px 10px; background: rgb(244, 245, 246); border: 1px solid rgb(232, 232, 232); font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial;">@Configuration
public class StudentConfig {
@Bean
public StudentBean myStudent() {
return new StudentBean();
}
}
</pre>

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 時揩局,最后三個才可用毫玖。更多spring內(nèi)容,可以看這里:Spring內(nèi)容合集

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

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

  1. Spring 容器根據(jù)配置中的 bean 定義中實例化 bean付枫。
  2. Spring 使用依賴注入填充所有屬性,如 bean 中所定義的配置驰怎。
  3. 如果 bean 實現(xiàn) BeanNameAware 接口阐滩,則工廠通過傳遞 bean 的 ID 來調(diào)用 setBeanName()。
  4. 如果 bean 實現(xiàn) BeanFactoryAware 接口县忌,工廠通過傳遞自身的實例來調(diào)用 setBeanFactory()掂榔。
  5. 如果存在與 bean 關(guān)聯(lián)的任何 BeanPostProcessors,則調(diào)用 preProcessBeforeInitialization() 方法芹枷。
  6. 如果為 bean 指定了 init 方法( 的 init-method 屬性)衅疙,那么將調(diào)用它。
  7. 最后鸳慈,如果存在與 bean 關(guān)聯(lián)的任何 BeanPostProcessors饱溢,則將調(diào)用 postProcessAfterInitialization() 方法。
  8. 如果 bean 實現(xiàn) DisposableBean 接口走芋,當 spring 容器關(guān)閉時绩郎,會調(diào)用 destory()潘鲫。
  9. 如果為 bean 指定了 destroy 方法( 的 destroy-method 屬性),那么將調(diào)用它肋杖。
Spring 那些最常見的面試問題:收藏溉仑,面試再也不怕Spring問題了

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 類實例并在 Student 中使用它。

Student.java

<pre style="-webkit-tap-highlight-color: transparent; box-sizing: border-box; font-family: Consolas, Menlo, Courier, monospace; font-size: 16px; white-space: pre-wrap; position: relative; line-height: 1.5; color: rgb(153, 153, 153); margin: 1em 0px; padding: 12px 10px; background: rgb(244, 245, 246); border: 1px solid rgb(232, 232, 232); font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial;">public class Student {
private Person person;
//Setters and Getters
}
public class Person {
private String name;
private String address;
//Setters and Getters
}
</pre>

bean.xml

<pre style="-webkit-tap-highlight-color: transparent; box-sizing: border-box; font-family: Consolas, Menlo, Courier, monospace; font-size: 16px; white-space: pre-wrap; position: relative; line-height: 1.5; color: rgb(153, 153, 153); margin: 1em 0px; padding: 12px 10px; background: rgb(244, 245, 246); border: 1px solid rgb(232, 232, 232); font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial;"><bean id=“StudentBean" class="com.edureka.Student">
<property name="person">

<bean class="com.edureka.Person">
<property name="name" value=“Scott"></property>
<property name="address" value=“Bangalore"></property>
</bean>
</property>
</bean>
</pre>

3.6. 什么是 spring 裝配

當 bean 在 Spring 容器中組合在一起時卑惜,它被稱為裝配或 bean 裝配。Spring 容器需要知道需要什么 bean 以及容器應(yīng)該如何使用依賴注入來將 bean 綁定在一起驻售,同時裝配 bean露久。

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

Spring 容器能夠自動裝配 bean芋浮。也就是說抱环,可以通過檢查 BeanFactory 的內(nèi)容讓 Spring 自動解析 bean 的協(xié)作者。更多spring內(nèi)容纸巷,可以看這里:Spring內(nèi)容合集

自動裝配的不同模式:

  • 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. 你用過哪些重要的 Spring 注解?

  • @Controller - 用于 Spring MVC 項目中的控制器類巢块。
  • @Service - 用于服務(wù)類礁阁。
  • @RequestMapping - 用于在控制器處理程序方法中配置 URI 映射。
  • @ResponseBody - 用于發(fā)送 Object 作為響應(yīng)夕冲,通常用于發(fā)送 XML 或 JSON 數(shù)據(jù)作為響應(yīng)氮兵。
  • @PathVariable - 用于將動態(tài)值從 URI 映射到處理程序方法參數(shù)裂逐。
  • @Autowired - 用于在 spring bean 中自動裝配依賴項歹鱼。
  • @Qualifier - 使用 @Autowired 注解,以避免在存在多個 bean 類型實例時出現(xiàn)混淆卜高。
  • @Scope - 用于配置 spring bean 的范圍弥姻。
  • @Configuration@ComponentScan@Bean - 用于基于 java 的配置掺涛。
  • @Aspect庭敦,@Before@After薪缆,@Around秧廉,@Pointcut - 用于切面編程(AOP)。

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

默認情況下疼电,Spring 容器中未打開注解裝配。因此减拭,要使用基于注解裝配蔽豺,我們必須通過配置<context:annotation-config /> 元素在 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 會自動導入到 IoC 容器中。
  • @Service:此注解是組件注解的特化癣朗。它不會對 @Component 注解提供任何其他行為拾因。您可以在服務(wù)層類中使用 @Service 而不是 @Component,因為它以更好的方式指定了意圖。
  • @Repository:這個注解是具有類似用途和功能的 @Component 注解的特化盾致。它為 DAO 提供了額外的好處主经。它將 DAO 導入 IoC 容器,并使未經(jīng)檢查的異常有資格轉(zhuǎn)換為 Spring DataAccessException庭惜。

4.4. @Required 注解有什么用罩驻?

@Required 應(yīng)用于 bean 屬性 setter 方法。此注解僅指示必須在配置時使用 bean 定義中的顯式屬性值或使用自動裝配填充受影響的 bean 屬性护赊。如果尚未填充受影響的 bean 屬性惠遏,則容器將拋出 BeanInitializationException。

示例:

<pre style="-webkit-tap-highlight-color: transparent; box-sizing: border-box; font-family: Consolas, Menlo, Courier, monospace; font-size: 16px; white-space: pre-wrap; position: relative; line-height: 1.5; color: rgb(153, 153, 153); margin: 1em 0px; padding: 12px 10px; background: rgb(244, 245, 246); border: 1px solid rgb(232, 232, 232); font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial;">public class Employee {
private String name;
@Required
public void setName(String name){
this.name=name;
}
public string getName(){
return name;
}
}
</pre>

4.5. @Autowired 注解有什么用骏啰?

@Autowired 可以更準確地控制應(yīng)該在何處以及如何進行自動裝配节吮。此注解用于在 setter 方法,構(gòu)造函數(shù)判耕,具有任意名稱或多個參數(shù)的屬性或方法上自動裝配 bean透绩。默認情況下,它是類型驅(qū)動的注入壁熄。

<pre style="-webkit-tap-highlight-color: transparent; box-sizing: border-box; font-family: Consolas, Menlo, Courier, monospace; font-size: 16px; white-space: pre-wrap; position: relative; line-height: 1.5; color: rgb(153, 153, 153); margin: 1em 0px; padding: 12px 10px; background: rgb(244, 245, 246); border: 1px solid rgb(232, 232, 232); font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial;">public class Employee {
private String name;
@Autowired
public void setName(String name) {
this.name=name;
}
public string getName(){
return name;
}
}
</pre>

4.6. @Qualifier 注解有什么用帚豪?

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

例如狸臣,這里我們分別有兩個類,Employee 和 EmpAccount昌执。在 EmpAccount 中烛亦,使用@Qualifier 指定了必須裝配 id 為 emp1 的 bean。

Employee.java

<pre style="-webkit-tap-highlight-color: transparent; box-sizing: border-box; font-family: Consolas, Menlo, Courier, monospace; font-size: 16px; white-space: pre-wrap; position: relative; line-height: 1.5; color: rgb(153, 153, 153); margin: 1em 0px; padding: 12px 10px; background: rgb(244, 245, 246); border: 1px solid rgb(232, 232, 232); font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial;">public class Employee {
private String name;
@Autowired
public void setName(String name) {
this.name=name;
}
public string getName() {
return name;
}
}
</pre>

EmpAccount.java

<pre style="-webkit-tap-highlight-color: transparent; box-sizing: border-box; font-family: Consolas, Menlo, Courier, monospace; font-size: 16px; white-space: pre-wrap; position: relative; line-height: 1.5; color: rgb(153, 153, 153); margin: 1em 0px; padding: 12px 10px; background: rgb(244, 245, 246); border: 1px solid rgb(232, 232, 232); font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial;">public class EmpAccount {
private Employee emp;
@Autowired
@Qualifier(emp1)
public void showName() {
System.out.println(“Employee name : ”+emp.getName);
}
}
</pre>

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ù)不同的異常汁汗。更多spring內(nèi)容,可以看這里:Spring內(nèi)容合集

5.2. 列舉 Spring DAO 拋出的異常栗涂。

Spring 那些最常見的面試問題:收藏知牌,面試再也不怕Spring問題了

5.3. spring JDBC API 中存在哪些類斤程?

  • JdbcTemplate
  • SimpleJdbcTemplate
  • NamedParameterJdbcTemplate
  • SimpleJdbcInsert
  • SimpleJdbcCall

5.4. 使用 Spring 訪問 Hibernate 的方法有哪些角寸?

我們可以通過兩種方式使用 Spring 訪問 Hibernate:

  1. 使用 Hibernate 模板和回調(diào)進行控制反轉(zhuǎn)
  2. 擴展 HibernateDAOSupport 并應(yīng)用 AOP 攔截器節(jié)點

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

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

  1. 程序化事務(wù)管理:在此過程中菩混,在編程的幫助下管理事務(wù)。它為您提供極大的靈活性扁藕,但維護起來非常困難沮峡。
  2. 聲明式事務(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ù)分別是什么痕支?

Spring 那些最常見的面試問題:收藏颁虐,面試再也不怕Spring問題了
  • Aspect - Aspect 是一個實現(xiàn)交叉問題的類,例如事務(wù)管理卧须。方面可以是配置的普通類另绩,然后在 Spring Bean 配置文件中配置,或者我們可以使用 Spring AspectJ 支持使用 @Aspect 注解將類聲明為 Aspect故慈。
  • Advice - Advice 是針對特定 JoinPoint 采取的操作板熊。在編程方面,它們是在應(yīng)用程序中達到具有匹配切入點的特定 JoinPoint 時執(zhí)行的方法察绷。您可以將 Advice 視為 Spring 攔截器(Interceptor)或 Servlet 過濾器(filter)。
  • Advice Arguments - 我們可以在 advice 方法中傳遞參數(shù)津辩。我們可以在切入點中使用 args() 表達式來應(yīng)用于與參數(shù)模式匹配的任何方法拆撼。如果我們使用它,那么我們需要在確定參數(shù)類型的 advice 方法中使用相同的名稱喘沿。
  • Pointcut - Pointcut 是與 JoinPoint 匹配的正則表達式闸度,用于確定是否需要執(zhí)行 Advice。Pointcut 使用與 JoinPoint 匹配的不同類型的表達式蚜印。Spring 框架使用 AspectJ Pointcut 表達式語言來確定將應(yīng)用通知方法的 JoinPoint莺禁。
  • JoinPoint - JoinPoint 是應(yīng)用程序中的特定點,例如方法執(zhí)行窄赋,異常處理哟冬,更改對象變量值等。在 Spring AOP 中忆绰,JoinPoint 始終是方法的執(zhí)行器浩峡。

6.3. 什么是通知(Advice)?

特定 JoinPoint 處的 Aspect 所采取的動作稱為 Advice错敢。Spring AOP 使用一個 Advice 作為攔截器翰灾,在 JoinPoint “周圍”維護一系列的攔截器。

6.4. 有哪些類型的通知(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.5. 指出在 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.6. 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.7. Spring AOP and AspectJ AOP 有什么區(qū)別浅浮?

Spring AOP 基于動態(tài)代理方式實現(xiàn);AspectJ 基于靜態(tài)代理方式實現(xiàn)捷枯。

Spring AOP 僅支持方法級別的 PointCut滚秩;提供了完全的 AOP 支持,它還支持屬性級別的 PointCut淮捆。

6.8. 如何理解 Spring 中的代理郁油?

將 Advice 應(yīng)用于目標對象后創(chuàng)建的對象稱為代理本股。在客戶端對象的情況下,目標對象和代理對象是相同的桐腌。

<pre style="-webkit-tap-highlight-color: transparent; box-sizing: border-box; font-family: Consolas, Menlo, Courier, monospace; font-size: 16px; white-space: pre-wrap; position: relative; line-height: 1.5; color: rgb(153, 153, 153); margin: 1em 0px; padding: 12px 10px; background: rgb(244, 245, 246); border: 1px solid rgb(232, 232, 232); font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial;">Advice + Target Object = Proxy
</pre>

6.9. 什么是編織(Weaving)拄显?

為了創(chuàng)建一個 advice 對象而鏈接一個 aspect 和其它應(yīng)用類型或?qū)ο螅Q為編織(Weaving)案站。在 Spring AOP 中躬审,編織在運行時執(zhí)行。請參考下圖:

Spring 那些最常見的面試問題:收藏蟆盐,面試再也不怕Spring問題了

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 的工作流程可以用一幅圖來說明:

Spring 那些最常見的面試問題:收藏,面試再也不怕Spring問題了
  1. 向服務(wù)器發(fā)送 HTTP 請求里伯,請求被前端控制器 DispatcherServlet 捕獲城瞎。
  2. DispatcherServlet 根據(jù) -servlet.xml 中的配置對請求的 URL 進行解析,得到請求資源標識符(URI)疾瓮。然后根據(jù)該 URI脖镀,調(diào)用 HandlerMapping 獲得該 Handler 配置的所有相關(guān)的對象(包括 Handler 對象以及 Handler 對象對應(yīng)的攔截器),最后以HandlerExecutionChain 對象的形式返回狼电。
  3. DispatcherServlet 根據(jù)獲得的Handler蜒灰,選擇一個合適的 HandlerAdapter。(附注:如果成功獲得HandlerAdapter后肩碟,此時將開始執(zhí)行攔截器的 preHandler(…)方法)强窖。
  4. 提取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)換成IntegerDouble等羹饰。
  • 數(shù)據(jù)根式化:對請求消息進行數(shù)據(jù)格式化伊滋。如將字符串轉(zhuǎn)換成格式化數(shù)字或格式化日期等碳却。
  • 數(shù)據(jù)驗證:驗證數(shù)據(jù)的有效性(長度、格式等)新啼,驗證結(jié)果存儲到BindingResultError中追城。
  1. Handler(Controller)執(zhí)行完成后,向 DispatcherServlet 返回一個 ModelAndView 對象燥撞;
  2. 根據(jù)返回的ModelAndView座柱,選擇一個適合的 ViewResolver(必須是已經(jīng)注冊到 Spring 容器中的ViewResolver)返回給DispatcherServlet。
  3. ViewResolver 結(jié)合Model和View物舒,來渲染視圖色洞。
  4. 視圖負責將渲染結(jié)果返回給客戶端。

7.3. 介紹一下 WebApplicationContext

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

8. 資料

歡迎工作一到五年的Java工程師朋友們加入JavaQQ群:957734884荠察,群內(nèi)提供免費的Java架構(gòu)學習資料(里面有高可用置蜀、高并發(fā)、高性能及分布式悉盆、Jvm性能調(diào)優(yōu)盯荤、Spring源碼,MyBatis焕盟,Netty,Redis,Kafka,Mysql,Zookeeper,Tomcat,Docker,Dubbo,Nginx等多個知識點的架構(gòu)資料)合理利用自己每一分每一秒的時間來學習提升自己秋秤,不要再用"沒有時間“來掩飾自己思想上的懶惰!趁年輕脚翘,使勁拼灼卢,給未來的自己一個交代!

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末来农,一起剝皮案震驚了整個濱河市鞋真,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌沃于,老刑警劉巖灿巧,帶你破解...
    沈念sama閱讀 216,372評論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異揽涮,居然都是意外死亡,警方通過查閱死者的電腦和手機饿肺,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評論 3 392
  • 文/潘曉璐 我一進店門蒋困,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人敬辣,你說我怎么就攤上這事雪标×阍海” “怎么了?”我有些...
    開封第一講書人閱讀 162,415評論 0 353
  • 文/不壞的土叔 我叫張陵村刨,是天一觀的道長告抄。 經(jīng)常有香客問我,道長嵌牺,這世上最難降的妖魔是什么打洼? 我笑而不...
    開封第一講書人閱讀 58,157評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮逆粹,結(jié)果婚禮上募疮,老公的妹妹穿的比我還像新娘。我一直安慰自己僻弹,他們只是感情好阿浓,可當我...
    茶點故事閱讀 67,171評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著蹋绽,像睡著了一般芭毙。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上卸耘,一...
    開封第一講書人閱讀 51,125評論 1 297
  • 那天退敦,我揣著相機與錄音,去河邊找鬼鹊奖。 笑死苛聘,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的忠聚。 我是一名探鬼主播设哗,決...
    沈念sama閱讀 40,028評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼两蟀!你這毒婦竟也來了网梢?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,887評論 0 274
  • 序言:老撾萬榮一對情侶失蹤赂毯,失蹤者是張志新(化名)和其女友劉穎战虏,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體党涕,經(jīng)...
    沈念sama閱讀 45,310評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡烦感,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,533評論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了膛堤。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片手趣。...
    茶點故事閱讀 39,690評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖肥荔,靈堂內(nèi)的尸體忽然破棺而出绿渣,到底是詐尸還是另有隱情朝群,我是刑警寧澤,帶...
    沈念sama閱讀 35,411評論 5 343
  • 正文 年R本政府宣布中符,位于F島的核電站姜胖,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏右莱。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,004評論 3 325
  • 文/蒙蒙 一吧凉、第九天 我趴在偏房一處隱蔽的房頂上張望隧出。 院中可真熱鬧,春花似錦阀捅、人聲如沸胀瞪。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽凄诞。三九已至,卻和暖如春忍级,著一層夾襖步出監(jiān)牢的瞬間帆谍,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,812評論 1 268
  • 我被黑心中介騙來泰國打工轴咱, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留汛蝙,地道東北人。 一個月前我還...
    沈念sama閱讀 47,693評論 2 368
  • 正文 我出身青樓朴肺,卻偏偏與公主長得像窖剑,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子戈稿,可洞房花燭夜當晚...
    茶點故事閱讀 44,577評論 2 353

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

  • IOC和DI是什么西土? Spring IOC 的理解,其初始化過程鞍盗? BeanFactory 和 FactoryBe...
    justlpf閱讀 3,474評論 1 21
  • 收藏一些關(guān)于Spring框架的面試題般甲,一方面是為了準備找工作的時候看面試題肋乍,另一方面,通過面試題的方式加深一些自己...
    雅倩蘭爸爸閱讀 494評論 0 2
  • 在大多數(shù)人的眼里敷存,人格魅力是不可捉摸的神秘因子住拭,是一種神秘的近乎神奇的事業(yè)推進劑。他是一種迷人的氣質(zhì)和個性魅力,能...
    極致踐行者上貝閱讀 464評論 0 0
  • 01 此生滔岳,將再無高考了。 不會再有人逼你頭懸梁錐刺股讀書挽牢,不會再有三天一小考五天一大考谱煤,不必再活在成績好的同學陰...
    柳絮飄沙閱讀 265評論 0 2
  • 孩紙不好畫。 畫倆感受一下禽拔。
    踢踏舞者閱讀 133評論 0 1