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:

  1. 使用 Hibernate 模板和回調進行控制反轉
  2. 擴展 HibernateDAOSupport 并應用 AOP 攔截器節點

列舉 spring 支持的事務管理類型

Spring 支持兩種類型的事務管理:

  1. 程序化事務管理:在此過程中,在編程的幫助下管理事務。它為您提供極大的靈活性,但維護起來非常困難。
  2. 聲明式事務管理:在此,事務管理與業務代碼分離。僅使用注解或基于 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+數據訪問,附答案
  1. 向服務器發送 HTTP 請求,請求被前端控制器 DispatcherServlet 捕獲。
  2. DispatcherServlet 根據 -servlet.xml 中的配置對請求的 URL 進行解析,得到請求資源標識符(URI)。然后根據該 URI,調用 HandlerMapping 獲得該 Handler 配置的所有相關的對象(包括 Handler 對象以及 Handler 對象對應的攔截器),最后以HandlerExecutionChain 對象的形式返回。
  3. DispatcherServlet 根據獲得的Handler,選擇一個合適的 HandlerAdapter。(附注:如果成功獲得HandlerAdapter后,此時將開始執行攔截器的 preHandler(...)方法)。
  4. 提取Request中的模型數據,填充Handler入參,開始執行Handler(Controller)。在填充Handler的入參過程中,根據你的配置,Spring 將幫你做一些額外的工作:
  • HttpMessageConveter:將請求消息(如 Json、xml 等數據)轉換成一個對象,將對象轉換為指定的響應信息。
  • 數據轉換:對請求消息進行數據轉換。如String轉換成Integer、Double等。
  • 數據根式化:對請求消息進行數據格式化。如將字符串轉換成格式化數字或格式化日期等。
  • 數據驗證:驗證數據的有效性(長度、格式等),驗證結果存儲到BindingResult或Error中。
  1. Handler(Controller)執行完成后,向 DispatcherServlet 返回一個 ModelAndView對象;
  2. 根據返回的ModelAndView,選擇一個適合的 ViewResolver(必須是已經注冊到 Spring 容器中的ViewResolver)返回給DispatcherServlet。
  3. ViewResolver 結合Model和View,來渲染視圖。
  4. 視圖負責將渲染結果返回給客戶端。

喜歡本文的朋友點點轉發和關注,感謝支持!

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,546評論 6 533
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,570評論 3 418
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,505評論 0 376
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,017評論 1 313
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,786評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,219評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,287評論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,438評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,971評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,796評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,995評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,540評論 5 359
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,230評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,662評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,918評論 1 286
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,697評論 3 392
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,991評論 2 374

推薦閱讀更多精彩內容