下面總結了 Spring 面試 7 大問題,看你能頂得住不?前端
1.1. 不一樣版本的 Spring Framework 有哪些主要功能?java
1.2. 什麼是 Spring Framework?git
Spring 是一個開源應用框架,旨在下降應用程序開發的複雜度。github
它是輕量級、鬆散耦合的。web
它具備分層體系結構,容許用戶選擇組件,同時還爲 J2EE 應用程序開發提供了一個有凝聚力的框架。面試
它能夠集成其餘框架,如 Structs、Hibernate、EJB 等,因此又稱爲框架的框架。正則表達式
1.3. 列舉 Spring Framework 的優勢。spring
因爲 Spring Frameworks 的分層架構,用戶能夠自由選擇本身須要的組件。數據庫
Spring Framework 支持 POJO(Plain Old Java Object) 編程,從而具有持續集成和可測試性。編程
因爲依賴注入和控制反轉,JDBC 得以簡化。
它是開源免費的。
1.4. Spring Framework 有哪些不一樣的功能?
輕量級 - Spring 在代碼量和透明度方面都很輕便。
IOC - 控制反轉
AOP - 面向切面編程能夠將應用業務邏輯和系統服務分離,以實現高內聚。
容器 - Spring 負責建立和管理對象(Bean)的生命週期和配置。
MVC - 對 web 應用提供了高度可配置性,其餘框架的集成也十分方便。
事務管理 - 提供了用於事務管理的通用抽象層。Spring 的事務支持也可用於容器較少的環境。
JDBC 異常 - Spring 的 JDBC 抽象層提供了一個異常層次結構,簡化了錯誤處理策略。
1.5. Spring Framework 中有多少個模塊,它們分別是什麼?
Spring 核心容器 – 該層基本上是 Spring Framework 的核心。它包含如下模塊:
數據訪問/集成 – 該層提供與數據庫交互的支持。它包含如下模塊:
Web – 該層提供了建立 Web 應用程序的支持。它包含如下模塊:
AOP – 該層支持面向切面編程
Instrumentation – 該層爲類檢測和類加載器實現提供支持。
Test – 該層爲使用 JUnit 和 TestNG 進行測試提供支持。
幾個雜項模塊:
1.6. 什麼是 Spring 配置文件?
Spring 配置文件是 XML 文件。該文件主要包含類信息。它描述了這些類是如何配置以及相互引入的。可是,XML 配置文件冗長且更加乾淨。若是沒有正確規劃和編寫,那麼在大項目中管理變得很是困難。
1.7. Spring 應用程序有哪些不一樣組件?
Spring 應用通常有如下組件:
接口 - 定義功能。
Bean 類 - 它包含屬性,setter 和 getter 方法,函數等。
Spring 面向切面編程(AOP) - 提供面向切面編程的功能。
Bean 配置文件 - 包含類的信息以及如何配置它們。
用戶程序 - 它使用接口。
1.8. 使用 Spring 有哪些方式?
使用 Spring 有如下方式:
2.1. 什麼是 Spring IOC 容器?
Spring 框架的核心是 Spring 容器。容器建立對象,將它們裝配在一塊兒,配置它們並管理它們的完整生命週期。Spring 容器使用依賴注入來管理組成應用程序的組件。
容器經過讀取提供的配置元數據來接收對象進行實例化,配置和組裝的指令。該元數據能夠經過 XML,Java 註解或 Java 代碼提供。
2.2. 什麼是依賴注入?
在依賴注入中,您沒必要建立對象,但必須描述如何建立它們。您不是直接在代碼中將組件和服務鏈接在一塊兒,而是描述配置文件中哪些組件須要哪些服務。由 IoC 容器將它們裝配在一塊兒。
2.3. 能夠經過多少種方式完成依賴注入?
一般,依賴注入能夠經過三種方式完成,即:
在 Spring Framework 中,僅使用構造函數和 setter 注入。
2.4. 區分構造函數注入和 setter 注入。
構造函數注入
setter 注入
沒有部分注入
有部分注入
不會覆蓋 setter 屬性
會覆蓋 setter 屬性
任意修改都會建立一個新實例
任意修改不會建立一個新實例
適用於設置不少屬性
適用於設置少許屬性
2.5. spring 中有多少種 IOC 容器?
2.6. 區分 BeanFactory 和 ApplicationContext。
2.7. 列舉 IoC 的一些好處。
IoC 的一些好處是:
2.8. Spring IoC 的實現機制。
Spring 中的 IoC 的實現原理就是工廠模式加反射機制。Spring的核心思想,總結得很是好,推薦你們看下。
示例:
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.1. 什麼是 spring bean?
3.2. spring 提供了哪些配置方式?
bean 所需的依賴項和服務在 XML 格式的配置文件中指定。這些配置文件一般包含許多 bean 定義和特定於應用程序的配置選項。它們一般以 bean 標籤開頭。例如:
<bean id="studentbean" class="org.edureka.firstSpring.StudentBean"> <property name="name" value="Edureka"></property> </bean>
您能夠經過在相關的類,方法或字段聲明上使用註解,將 bean 配置爲組件類自己,而不是使用 XML 來描述 bean 裝配。默認狀況下,Spring 容器中未打開註解裝配。所以,您須要在使用它以前在 Spring 配置文件中啓用它。例如:
<beans> <context:annotation-config/> <!-- bean definitions go here --> </beans>
Spring 的 Java 配置是經過使用 @Bean 和 @Configuration 來實現。
例如:
@Configuration public class StudentConfig { @Bean public StudentBean myStudent() { return new StudentBean(); } }
3.3. spring 支持集中 bean scope?
Spring bean 支持 5 種 scope:
僅當用戶使用支持 Web 的 ApplicationContext 時,最後三個纔可用。這篇推薦看下:Spring bean scope詳解。關注微信公衆號:Java技術棧,在後臺回覆:spring,能夠獲取我整理的 N 篇最新Spring 教程,都是乾貨。
3.4. spring bean 容器的生命週期是什麼樣的?
spring bean 容器的生命週期流程以下:
3.5. 什麼是 spring 的內部 bean?
只有將 bean 用做另外一個 bean 的屬性時,才能將 bean 聲明爲內部 bean。爲了定義 bean,Spring 的基於 XML 的配置元數據在 <property> 或 <constructor-arg> 中提供了 <bean> 元素的使用。內部 bean 老是匿名的,它們老是做爲原型。
例如,假設咱們有一個 Student 類,其中引用了 Person 類。這裏咱們將只建立一個 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
<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 裝配
當 bean 在 Spring 容器中組合在一塊兒時,它被稱爲裝配或 bean 裝配。Spring 容器須要知道須要什麼 bean 以及容器應該如何使用依賴注入來將 bean 綁定在一塊兒,同時裝配 bean。
3.7. 自動裝配有哪些方式?
Spring 容器可以自動裝配 bean。也就是說,能夠經過檢查 BeanFactory 的內容讓 Spring 自動解析 bean 的協做者。
自動裝配的不一樣模式:
3.8. 自動裝配有什麼侷限?
4.1. 你用過哪些重要的 Spring 註解?
關注微信公衆號:Java技術棧,在後臺回覆:spring,能夠獲取我整理的 N 篇最新Spring 教程,都是乾貨。
4.2. 如何在 spring 中啓動註解裝配?
默認狀況下,Spring 容器中未打開註解裝配。所以,要使用基於註解裝配,咱們必須經過配置<context:annotation-config /> 元素在 Spring 配置文件中啓用它。
4.3. @Component, @Controller, @Repository, @Service 有何區別?
4.4. @Required 註解有什麼用?
@Required 應用於 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 能夠更準確地控制應該在何處以及如何進行自動裝配。此註解用於在 setter 方法,構造函數,具備任意名稱或多個參數的屬性或方法上自動裝配 bean。默認狀況下,它是類型驅動的注入。
public class Employee { private String name; @Autowired public void setName(String name) { this.name=name; } public string getName(){ return name; } }
4.6. @Qualifier 註解有什麼用?
當您建立多個相同類型的 bean 並但願僅使用屬性裝配其中一個 bean 時,您可使用@Qualifier 註解和 @Autowired 經過指定應該裝配哪一個確切的 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 請求方法映射到將處理相應請求的控制器中的特定類/方法。Spring MVC經常使用註解,推薦看下。
此註解可應用於兩個級別:
5.1. spring DAO 有什麼用?
Spring DAO 使得 JDBC,Hibernate 或 JDO 這樣的數據訪問技術更容易以一種統一的方式工做。這使得用戶容易在持久性技術之間切換。它還容許您在編寫代碼時,無需考慮捕獲每種技術不一樣的異常。
5.2. 列舉 Spring DAO 拋出的異常。
5.3. spring JDBC API 中存在哪些類?
5.4. 使用 Spring 訪問 Hibernate 的方法有哪些?
咱們能夠經過兩種方式使用 Spring 訪問 Hibernate:
5.5. 列舉 spring 支持的事務管理類型
Spring 支持兩種類型的事務管理:
5.6. spring 支持哪些 ORM 框架
6.1. 什麼是 AOP?
AOP(Aspect-Oriented Programming), 即 面向切面編程, 它與 OOP( Object-Oriented Programming, 面向對象編程) 相輔相成, 提供了與 OOP 不一樣的抽象軟件結構的視角。
在 OOP 中, 咱們以類(class)做爲咱們的基本單元, 而 AOP 中的基本單元是 Aspect(切面)
6.2. AOP 中的 Aspect、Advice、Pointcut、JointPoint 和 Advice 參數分別是什麼?
6.3. 什麼是通知(Advice)?
特定 JoinPoint 處的 Aspect 所採起的動做稱爲 Advice。Spring AOP 使用一個 Advice 做爲攔截器,在 JoinPoint 「周圍」維護一系列的攔截器。
6.4. 有哪些類型的通知(Advice)?
6.5. 指出在 spring aop 中 concern 和 cross-cutting concern 的不一樣之處。
concern 是咱們想要在應用程序的特定模塊中定義的行爲。它能夠定義爲咱們想要實現的功能。
cross-cutting concern 是一個適用於整個應用的行爲,這會影響整個應用程序。例如,日誌記錄,安全性和數據傳輸是應用程序幾乎每一個模塊都須要關注的問題,所以它們是跨領域的問題。
6.6. AOP 有哪些實現方式?
實現 AOP 的技術,主要分爲兩大類:
6.7. Spring AOP and AspectJ AOP 有什麼區別?
Spring AOP 基於動態代理方式實現;AspectJ 基於靜態代理方式實現。
Spring AOP 僅支持方法級別的 PointCut;提供了徹底的 AOP 支持,它還支持屬性級別的 PointCut。
6.8. 如何理解 Spring 中的代理?
將 Advice 應用於目標對象後建立的對象稱爲代理。在客戶端對象的狀況下,目標對象和代理對象是相同的。詳解 Java 中的三種代理模式,這篇看下。
Advice + Target Object = Proxy
6.9. 什麼是編織(Weaving)?
爲了建立一個 advice 對象而連接一個 aspect 和其它應用類型或對象,稱爲編織(Weaving)。在 Spring AOP 中,編織在運行時執行。請參考下圖:
7.1. Spring MVC 框架有什麼用?
Spring Web MVC 框架提供 模型-視圖-控制器 架構和隨時可用的組件,用於開發靈活且鬆散耦合的 Web 應用程序。
MVC 模式有助於分離應用程序的不一樣方面,如輸入邏輯,業務邏輯和 UI 邏輯,同時在全部這些元素之間提供鬆散耦合。
7.2. 描述一下 DispatcherServlet 的工做流程
DispatcherServlet 的工做流程能夠用一幅圖來講明:
5.Handler(Controller)執行完成後,向 DispatcherServlet 返回一個 ModelAndView 對象;
6.根據返回的ModelAndView,選擇一個適合的 ViewResolver(必須是已經註冊到 Spring 容器中的ViewResolver)返回給DispatcherServlet。
7.ViewResolver 結合Model和View,來渲染視圖。
8.視圖負責將渲染結果返回給客戶端。
7.3. 介紹一下 WebApplicationContext
WebApplicationContext 是 ApplicationContext 的擴展。它具備 Web 應用程序所需的一些額外功能。它與普通的 ApplicationContext 在解析主題和決定與哪一個 servlet 關聯的能力方面有所不一樣。
參考資料:
https://www.edureka.co/blog/i...https://www.journaldev.com/26...
做者:靜默虛空
juejin.im/post/5cbda379f265da03ae74c282
推薦去個人博客閱讀更多:
2.Spring MVC、Spring Boot、Spring Cloud 系列教程
3.Maven、Git、Eclipse、Intellij IDEA 系列工具教程
生活很美好,明天見~