spring面試題集錦:註解+MVC+資料訪問,附答案
註解
你用過哪些重要的 Spring 註解?
- @Controller - 用於 Spring MVC 專案中的控制器類。
- @Service - 用於服務類。
- @RequestMapping - 用於在控制器處理程式方法中配置 URI 對映。
- @ResponseBody - 用於傳送 Object 作為響應,通常用於傳送 XML 或 JSON 資料作為響應。
- @PathVariable - 用於將動態值從 URI 對映到處理程式方法引數。
- @Autowired - 用於在 spring bean 中自動裝配依賴項。
- @Qualifier - 使用 @Autowired 註解,以避免在存在多個 bean 型別例項時出現混淆。
- @Scope - 用於配置 spring bean 的範圍。
- @Configuration , @ComponentScan 和 @Bean - 用於基於 java 的配置。
- @Aspect , @Before , @After , @Around , @Pointcut - 用於切面程式設計(AOP)。
如何在 spring 中啟動註解裝配?
預設情況下,Spring 容器中未開啟註解裝配。因此,要使用基於註解裝配,我們必須通過配置<context:annotation-config /> 元素在 Spring 配置檔案中啟用它。
@Component, @Controller, @Repository, @Service 有何區別?
- @Component:這將 java 類標記為 bean。它是任何 Spring 管理元件的通用構造型。spring 的元件掃描機制現在可以將其拾取並將其拉入應用程式環境中。
- @Controller:這將一個類標記為 Spring Web MVC 控制器。標有它的 Bean 會自動匯入到 IoC 容器中。
- @Service:此註解是元件註解的特化。它不會對 @Component 註解提供任何其他行為。您可以在服務層類中使用 @Service 而不是 @Component,因為它以更好的方式指定了意圖。
- @Repository:這個註解是具有類似用途和功能的 @Component 註解的特化。它為 DAO 提供了額外的好處。它將 DAO 匯入 IoC 容器,並使未經檢查的異常有資格轉換為 Spring DataAccessException。
@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; } }
@Autowired 註解有什麼用?
@Autowired 可以更準確地控制應該在何處以及如何進行自動裝配。此註解用於在 setter 方法,建構函式,具有任意名稱或多個引數的屬性或方法上自動裝配 bean。預設情況下,它是型別驅動的注入。
public class Employee { private String name; @Autowired public void setName(String name) { this.name=name; } public string getName(){ return name; } }
@Qualifier 註解有什麼用?
當您建立多個相同型別的 bean 並希望僅使用屬性裝配其中一個 bean 時,您可以使用@Qualifier 註解和 @Autowired 通過指定應該裝配哪個確切的 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); } }
@RequestMapping 註解有什麼用?
@RequestMapping 註解用於將特定 HTTP 請求方法對映到將處理相應請求的控制器中的特定類/方法。此註解可應用於兩個級別:
- 類級別:對映請求的 URL
- 方法級別:對映 URL 以及 HTTP 請求方法
資料訪問
spring DAO 有什麼用?
Spring DAO 使得 JDBC,Hibernate 或 JDO 這樣的資料訪問技術更容易以一種統一的方式工作。這使得使用者容易在永續性技術之間切換。它還允許您在編寫程式碼時,無需考慮捕獲每種技術不同的異常。
列舉 Spring DAO 丟擲的異常。

spring面試題集錦:註解+MVC+資料訪問,附答案
spring JDBC API 中存在哪些類?
- JdbcTemplate
- SimpleJdbcTemplate
- NamedParameterJdbcTemplate
- SimpleJdbcInsert
- SimpleJdbcCall
使用 Spring 訪問 Hibernate 的方法有哪些?
我們可以通過兩種方式使用 Spring 訪問 Hibernate:
- 使用 Hibernate 模板和回撥進行控制反轉
- 擴充套件 HibernateDAOSupport 並應用 AOP 攔截器節點
列舉 spring 支援的事務管理型別
Spring 支援兩種型別的事務管理:
- 程式化事務管理:在此過程中,在程式設計的幫助下管理事務。它為您提供極大的靈活性,但維護起來非常困難。
- 宣告式事務管理:在此,事務管理與業務程式碼分離。僅使用註解或基於 XML 的配置來管理事務。
spring 支援哪些 ORM 框架
- Hibernate
- iBatis
- JPA
- JDO
- OJB
AOP
什麼是 AOP?
AOP(Aspect-Oriented Programming), 即 面向切面程式設計 , 它與 OOP( Object-Oriented Programming, 面向物件程式設計) 相輔相成, 提供了與 OOP 不同的抽象軟體結構的視角. 在 OOP 中, 我們以類(class)作為我們的基本單元, 而 AOP 中的基本單元是 Aspect(切面)
AOP 中的 Aspect、Advice、Pointcut、JointPoint 和 Advice 引數分別是什麼?

spring面試題集錦:註解+MVC+資料訪問,附答案
- Aspect - Aspect 是一個實現交叉問題的類,例如事務管理。方面可以是配置的普通類,然後在 Spring Bean 配置檔案中配置,或者我們可以使用 Spring AspectJ 支援使用 @Aspect 註解將類宣告為 Aspect。
- Advice - Advice 是針對特定 JoinPoint 採取的操作。在程式設計方面,它們是在應用程式中達到具有匹配切入點的特定 JoinPoint 時執行的方法。您可以將 Advice 視為 Spring 攔截器(Interceptor)或 Servlet 過濾器(filter)。
- Advice Arguments - 我們可以在 advice 方法中傳遞引數。我們可以在切入點中使用 args() 表示式來應用於與引數模式匹配的任何方法。如果我們使用它,那麼我們需要在確定引數型別的 advice 方法中使用相同的名稱。
- Pointcut - Pointcut 是與 JoinPoint 匹配的正則表示式,用於確定是否需要執行 Advice。Pointcut 使用與 JoinPoint 匹配的不同型別的表示式。Spring 框架使用 AspectJ Pointcut 表示式語言來確定將應用通知方法的 JoinPoint。
- JoinPoint - JoinPoint 是應用程式中的特定點,例如方法執行,異常處理,更改物件變數值等。在 Spring AOP 中,JoinPoint 始終是方法的執行器。
什麼是通知(Advice)?
特定 JoinPoint 處的 Aspect 所採取的動作稱為 Advice。Spring AOP 使用一個 Advice 作為攔截器,在 JoinPoint “周圍”維護一系列的攔截器。
有哪些型別的通知(Advice)?
- Before - 這些型別的 Advice 在 joinpoint 方法之前執行,並使用 @Before 註解標記進行配置。
- After Returning - 這些型別的 Advice 在連線點方法正常執行後執行,並使用@AfterReturning 註解標記進行配置。
- After Throwing - 這些型別的 Advice 僅在 joinpoint 方法通過丟擲異常退出並使用 @AfterThrowing 註解標記配置時執行。
- After (finally) - 這些型別的 Advice 在連線點方法之後執行,無論方法退出是正常還是異常返回,並使用 @After 註解標記進行配置。
- Around - 這些型別的 Advice 在連線點之前和之後執行,並使用 @Around 註解標記進行配置。
指出在 spring aop 中 concern 和 cross-cutting concern 的不同之處。
concern 是我們想要在應用程式的特定模組中定義的行為。它可以定義為我們想要實現的功能。
cross-cutting concern 是一個適用於整個應用的行為,這會影響整個應用程式。例如,日誌記錄,安全性和資料傳輸是應用程式幾乎每個模組都需要關注的問題,因此它們是跨領域的問題。
AOP 有哪些實現方式?
實現 AOP 的技術,主要分為兩大類:
- 靜態代理 - 指使用 AOP 框架提供的命令進行編譯,從而在編譯階段就可生成 AOP 代理類,因此也稱為編譯時增強;
- 編譯時編織(特殊編譯器實現)
- 類載入時編織(特殊的類載入器實現)。
- 動態代理 - 在執行時在記憶體中“臨時”生成 AOP 動態代理類,因此也被稱為執行時增強。
- JDK 動態代理
- CGLIB
Spring AOP and AspectJ AOP 有什麼區別?
Spring AOP 基於動態代理方式實現;AspectJ 基於靜態代理方式實現。Spring AOP 僅支援方法級別的 PointCut;提供了完全的 AOP 支援,它還支援屬性級別的 PointCut。
如何理解 Spring 中的代理?
將 Advice 應用於目標物件後建立的物件稱為代理。在客戶端物件的情況下,目標物件和代理物件是相同的。
Advice + Target Object = Proxy
什麼是編織(Weaving)?
為了建立一個 advice 物件而連結一個 aspect 和其它應用型別或物件,稱為編織(Weaving)。在 Spring AOP 中,編織在執行時執行。請參考下圖:

spring面試題集錦:註解+MVC+資料訪問,附答案
MVC
Spring MVC 框架有什麼用?
Spring Web MVC 框架提供 模型-檢視-控制器 架構和隨時可用的元件,用於開發靈活且鬆散耦合的 Web 應用程式。MVC 模式有助於分離應用程式的不同方面,如輸入邏輯,業務邏輯和 UI 邏輯,同時在所有這些元素之間提供鬆散耦合。
描述一下 DispatcherServlet 的工作流程
DispatcherServlet 的工作流程可以用一幅圖來說明:

spring面試題集錦:註解+MVC+資料訪問,附答案
- 向伺服器傳送 HTTP 請求,請求被前端控制器 DispatcherServlet 捕獲。
- DispatcherServlet 根據 -servlet.xml 中的配置對請求的 URL 進行解析,得到請求資源識別符號(URI)。然後根據該 URI,呼叫 HandlerMapping 獲得該 Handler 配置的所有相關的物件(包括 Handler 物件以及 Handler 物件對應的攔截器),最後以HandlerExecutionChain 物件的形式返回。
- DispatcherServlet 根據獲得的Handler,選擇一個合適的 HandlerAdapter。(附註:如果成功獲得HandlerAdapter後,此時將開始執行攔截器的 preHandler(...)方法)。
- 提取Request中的模型資料,填充Handler入參,開始執行Handler(Controller)。在填充Handler的入參過程中,根據你的配置,Spring 將幫你做一些額外的工作:
- HttpMessageConveter:將請求訊息(如 Json、xml 等資料)轉換成一個物件,將物件轉換為指定的響應資訊。
- 資料轉換:對請求訊息進行資料轉換。如String轉換成Integer、Double等。
- 資料根式化:對請求訊息進行資料格式化。如將字串轉換成格式化數字或格式化日期等。
- 資料驗證:驗證資料的有效性(長度、格式等),驗證結果儲存到BindingResult或Error中。
- Handler(Controller)執行完成後,向 DispatcherServlet 返回一個 ModelAndView物件;
- 根據返回的ModelAndView,選擇一個適合的 ViewResolver(必須是已經註冊到 Spring 容器中的ViewResolver)返回給DispatcherServlet。
- ViewResolver 結合Model和View,來渲染檢視。
- 檢視負責將渲染結果返回給客戶端。