Java在常見的spring面試問題TOP50

來源:互聯網
上載者:User

標籤:init   如何   nal   exce   模板   環境   for   err   person   

1. 一般問題

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

Version Feature

  • Spring 2.5 發佈於 2007 年。這是第一個支援註解的版本。
  • Spring 3.0 發佈於 2009 年。它完全利用了 Java5 中的改進,並為 JEE6 提供了支援。
  • Spring 4.0 發佈於 2013 年。這是第一個完全支援 JAVA8 的版本。

1.2. 什麼是 Spring Framework

  • Spring 是一個開源應用程式框架,旨在降低應用程式開發的複雜度。
  • 它是輕量級、鬆散耦合的。
  • 它具有分層體繫結構,允許使用者選擇組件,同時還為 J2EE 應用程式開發提供了一個有凝聚力的架構。
  • 它可以整合其他架構,如 Structs、Hibernate、EJB 等,所以又稱為架構的架構。

1.3. 列舉 Spring Framework 的優點。

  • 由於 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 的核心。它包含以下模組:

  • Spring Core
  • Spring Bean
  • SpEL (Spring Expression Language)
  • Spring Context

② 、資料訪問/整合 – 該層提供與資料庫互動的支援。它包含以下模組:

  • JDBC (Java DataBase Connectivity)
  • ORM (Object Relational Mapping)
  • OXM (Object XML Mappers)
  • JMS (Java Messaging Service)
  • Transaction

③ 、Web – 該層提供了建立 Web 應用程式的支援。它包含以下模組:

  • Web
  • Web – Servlet
  • Web – Socket
  • Web – Portlet

④ 、AOP – 該層支援面向切面編程

⑤ 、Instrumentation – 該層為類檢測和類載入器實現提供支援。

⑥ 、Test – 該層為使用 JUnit 和 TestNG 進行測試提供支援。

⑦ 、幾個雜項模組:

  • Messaging – 該模組為 STOMP 提供支援。它還支援註解編程模型,該模型用於從 WebSocket 用戶端路由和處理 STOMP 訊息。
  • Aspects – 該模組為與 AspectJ 的整合提供支援。

1.6. 什麼是 Spring 設定檔?

Spring 設定檔是 XML 檔案。該檔案主要包含類資訊。它描述了這些類是如何配置以及相互引入的。但是,XML 設定檔冗長且更加乾淨。如果沒有正確規劃和編寫,那麼在大項目中管理變得非常困難。

1.7. Spring 應用程式有哪些不同組件?

Spring 應用一般有以下組件:

  • 介面 - 定義功能。
  • Bean 類 - 它包含屬性,setter 和 getter 方法,函數等。
  • Spring 面向切面編程(AOP) - 提供面向切面編程的功能。
  • Bean 設定檔 - 包含類的資訊以及如何配置它們。
  • 使用者程式 - 它使用介面。

1.8. 使用 Spring 有哪些方式?

  • 使用 Spring 有以下方式:
  • 作為一個成熟的 Spring Web 應用程式。
  • 作為第三方 Web 架構,使用 Spring Frameworks 中介層。
  • 用於遠程使用。
  • 作為企業級 Java Bean,它可以封裝現有的 POJO(Plain Old Java Objects)。

2. 依賴注入(Ioc

2.1. 什麼是 Spring IOC 容器?

Spring 架構的核心是 Spring 容器。容器建立對象,將它們裝配在一起,配置它們並管理它們的完整生命週期。Spring 容器使用依賴注入來管理組成應用程式的組件。容器通過讀取提供的配置中繼資料來接收對象進行執行個體化,配置和組裝的指令。該中繼資料可以通過 XML,Java 註解或 Java 代碼提供

  

2.2. 什麼是依賴注入?

在依賴注入中,您不必建立對象,但必須描述如何建立它們。您不是直接在代碼中將組件和服務串連在一起,而是描述設定檔中哪些組件需要哪些服務。由 IoC 容器將它們裝配在一起。

2.3. 可以通過多少種方式完成依賴注入?

通常,依賴注入可以通過三種方式完成,即:

  • 建構函式注入
  • setter 注入
  • 介面注入

在 Spring Framework 中,僅使用建構函式和 setter 注入。

2.4. 區分建構函式注入和 setter 注入。

  

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

  • BeanFactory - BeanFactory 就像一個包含 bean 集合的工廠類。它會在用戶端要求時執行個體化 bean。
  • ApplicationContext - ApplicationContext 介面擴充了 BeanFactory 介面。它在 BeanFactory 基礎上提供了一些額外的功能。

2.6. 區分 BeanFactory ApplicationContext

  

2.7. 列舉 IoC 的一些好處。

IoC 的一些好處是:

  • 它將最小化應用程式中的代碼量。
  • 它將使您的應用程式易於測試,因為它不需要單元測試用例中的任何單例或 JNDI 尋找機制。
  • 它以最小的影響和最少的侵入機制促進松耦合。
  • 它支援即時的執行個體化和消極式載入服務。

2.8. Spring IoC 的實現機制。

Spring 中的 IoC 的實現原理就是原廠模式加反射機制。

樣本:

 

3. Beans

3.1. 什麼是 spring bean

  • 它們是構成使用者應用程式主乾的對象。
  • Bean 由 Spring IoC 容器管理。
  • 它們由 Spring IoC 容器執行個體化,配置,裝配和管理。
  • Bean 是基於使用者提供給容器的配置中繼資料建立。

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

  • 基於 xml 配置

bean 所需的依賴項和服務在 XML 格式的設定檔中指定。這些設定檔通常包含許多 bean 定義和特定於應用程式的配置選項。它們通常以 bean 標籤開頭。例如:

  

  • 基於註解配置

您可以通過在相關的類,方法或欄位聲明上使用註解,將 bean 配置為組件類本身,而不是使用 XML 來描述 bean 裝配。預設情況下,Spring 容器中未開啟註解裝配。因此,您需要在使用它之前在 Spring 設定檔中啟用它。例如:

  

  • 基於 Java API 配置

Spring 的 Java 配置是通過使用 @Bean 和 @Configuration 來實現。

  1. @Bean 註解扮演與  元素相同的角色。
  2. @Configuration 類允許通過簡單地調用同一個類中的其他 @Bean 方法來定義 bean 間依賴關係。

例如:

  

3.3. spring 支援集中 bean scope

Spring bean 支援 5 種 scope:

  • Singleton - 每個 Spring IoC 容器僅有一個單一實例。
  • Prototype - 每次請求都會產生一個新的執行個體。
  • Request - 每一次 HTTP 要求都會產生一個新的執行個體,並且該 bean 僅在當前 HTTP 要求內有效。
  • Session - 每一次 HTTP 要求都會產生一個新的 bean,同時該 bean 僅在當前 HTTP session 內有效。
  • Global-session - 類似於標準的 HTTP Session 範圍,不過它僅僅在基於 portlet 的 web 應用中才有意義。Portlet 規範定義了全域 Session 的概念,它被所有構成某個 portlet web 應用的各種不同的 portlet 所共用。在 global session 範圍中定義的 bean 被限定於全域 portlet Session 的生命週期範圍內。如果你在 web 中使用 global session 範圍來標識 bean,那麼 web 會自動當成 session 類型來使用。

僅當使用者使用支援 Web 的 ApplicationContext 時,最後三個才可用。

3.4. spring bean 容器的生命週期是什麼樣的?

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

  1. Spring 容器根據配置中的 bean 定義中執行個體化 bean。
  2. Spring 使用依賴注入填充所有屬性,如 bean 中所定義的配置。
  3. 如果 bean 實現 BeanNameAware 介面,則工廠通過傳遞 bean 的 ID 來調用 setBeanName()。
  4. 如果 bean 實現 BeanFactoryAware 介面,工廠通過傳遞自身的執行個體來調用 setBeanFactory()。
  5. 如果存在與 bean 關聯的任何 BeanPostProcessors,則調用 preProcessBeforeInitialization() 方法。
  6. 如果為 bean 指定了 init 方法( 的 init-method 屬性),那麼將調用它。
  7. 最後,如果存在與 bean 關聯的任何 BeanPostProcessors,則將調用 postProcessAfterInitialization() 方法。
  8. 如果 bean 實現 DisposableBean 介面,當 spring 容器關閉時,會調用 destory()。
  9. 如果為 bean 指定了 destroy 方法( 的 destroy-method 屬性),那麼將調用它。

  

3.5. 什麼是 spring 的內部 bean

只有將 bean 用作另一個 bean 的屬性時,才能將 bean 聲明為內部 bean。為了定義 bean,Spring 的基於 XML 的配置中繼資料在  或  中提供了  元素的使用。內部 bean 總是匿名的,它們總是作為原型。

例如,假設我們有一個 Student 類,其中引用了 Person 類。這裡我們將只建立一個 Person 類執行個體並在 Student 中使用它。

Student.java

  

bean.xml

  

3.6. 什麼是 spring 裝配

當 bean 在 Spring 容器中組合在一起時,它被稱為裝配或 bean 裝配。 Spring 容器需要知道需要什麼 bean 以及容器應該如何使用依賴注入來將 bean 綁定在一起,同時裝配 bean。

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

Spring 容器能夠自動裝配 bean。也就是說,可以通過檢查 BeanFactory 的內容讓 Spring 自動解析 bean 的共同作業者。

自動裝配的不同模式:

  • no - 這是預設設定,表示沒有自動裝配。應使用顯式 bean 引用進行裝配。
  • byName - 它根據 bean 的名稱注入對象依賴項。它匹配並裝配其屬性與 XML 檔案中由相同名稱定義的 bean。
  • byType - 它根據類型注入對象依賴項。如果屬性的類型與 XML 檔案中的一個 bean 名稱匹配,則匹配並裝配屬性。
  • 建構函式 - 它通過調用類的建構函式來注入依賴項。它有大量的參數。
  • autodetect - 首先容器嘗試通過建構函式使用 autowire 裝配,如果不能,則嘗試通過 byType 自動裝配。

3.8. 自動裝配有什麼局限?

  • 覆蓋的可能性 - 您始終可以使用  和  設定指定依賴項,這將覆蓋自動裝配。
  • 基本中繼資料類型 - 簡單屬性(如原資料類型,字串和類)無法自動裝配。
  • 令人困惑的性質 - 總是喜歡使用明確的裝配,因為自動裝配不太精確。

4. 註解

4.1. 什麼是基於註解的容器配置

不使用 XML 來描述 bean 裝配,開發人員通過在相關的類,方法或欄位聲明上使用註解將配置移動到組件類本身。它可以作為 XML 設定的替代方案。例如:

Spring 的 Java 配置是通過使用 @Bean 和 @Configuration 來實現。

  • @Bean 註解扮演與 元素相同的角色。
  • @Configuration 類允許通過簡單地調用同一個類中的其他 @Bean 方法來定義 bean 間依賴關係。

例如:

  

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

預設情況下,Spring 容器中未開啟註解裝配。因此,要使用基於註解裝配,我們必須通過配置 元素在 Spring 設定檔中啟用它。

4.3. @Component, @Controller, @Repository, @Service 有何區別?

  • @Component:這將 java 類標記為 bean。它是任何 Spring 管理組件的通用構造型。spring 的組件掃描機制現在可以將其拾取並將其拉入應用程式環境中。
  • @Controller:這將一個類標記為 Spring Web MVC 控制器。標有它的 Bean 會自動匯入到 IoC 容器中。
  • @Service:此註解是組件註解的特化。它不會對 @Component 註解提供任何其他行為。您可以在服務層類中使用 @Service 而不是 ④[email protected],因為它以更好的方式指定了意圖。
  • @Repository:這個註解是具有類似用途和功能的 @Component 註解的特化。它為 DAO 提供了額外的好處。它將 DAO 匯入 IoC 容器,並使未經檢查的異常有資格轉換為 Spring DataAccessException。

4.4. @Required 註解有什麼用?

@Required 應用於 bean 屬性 setter 方法。此註解僅指示必須在配置時使用 bean 定義中的顯式屬性值或使用自動裝配填充受影響的 bean 屬性。如果尚未填充受影響的 bean 屬性,則容器將拋出 BeanInitializationException。

樣本:

  

4.5. @Autowired 註解有什麼用?

@Autowired 可以更準確地控制應該在何處以及如何進行自動裝配。此註解用於在 setter 方法,建構函式,具有任意名稱或多個參數的屬性或方法上自動裝配 bean。預設情況下,它是類型驅動的注入。

  

4.6. @Qualifier 註解有什麼用?

當您建立多個相同類型的 bean 並希望僅使用屬性裝配其中一個 bean 時,您可以使用@Qualifier 註解和 @Autowired 通過指定應該裝配哪個確切的 bean 來消除歧義。

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

Employee.java

  

EmpAccount.java

  

4.7. @RequestMapping 註解有什麼用?

@RequestMapping 註解用於將特定 HTTP 要求方法映射到將處理相應請求的控制器中的特定類/方法。此注釋可應用於兩個層級:

  • 類層級:映射請求的 URL
  • 方法層級:映射 URL 以及 HTTP 要求方法

5. 資料訪問

5.1. spring DAO 有什麼用?

Spring DAO 使得 JDBC,Hibernate 或 JDO 這樣的資料訪問技術更容易以一種統一的方式工作。這使得使用者容易在持久性技術之間切換。它還允許您在編寫代碼時,無需考慮捕獲每種技術不同的異常。

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

  

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

  • JdbcTemplate
  • SimpleJdbcTemplate
  • NamedParameterJdbcTemplate
  • SimpleJdbcInsert
  • SimpleJdbcCall

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

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

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

5.5. 列舉 spring 支援的交易管理類型

Spring 支援兩種類型的交易管理:

①.程式化交易管理:在此過程中,在編程的協助下管理事務。它為您提供極大的靈活性,但維護起來非常困難。

②.聲明式交易管理:在此,交易管理與業務代碼分離。僅使用註解或基於 XML 的配置來管理事務。

5.6. spring 支援哪些 ORM 架構

  • Hibernate
  • iBatis
  • JPA
  • JDO
  • OJB

6. AOP

6.1. 什麼是 AOP

AOP(Aspect-Oriented Programming), 即 面向切面編程, 它與 OOP( Object-Oriented Programming, 物件導向編程) 相輔相成, 提供了與 OOP 不同的抽象軟體結構的視角.

在 OOP 中, 我們以類(class)作為我們的基本單元, 而 AOP 中的基本單元是 Aspect(切面)

6.2. 什麼是 Aspect

aspect 由 pointcount 和 advice 組成, 它既包含了橫切邏輯的定義, 也包括了連接點的定義. Spring AOP 就是負責實施切面的架構, 它將切面所定義的橫切邏輯編織到切面所指定的連接點中.

AOP 的工作重心在於如何將增強編織目標對象的連接點上, 這裡包含兩個工作:

  1. 如何通過 pointcut 和 advice 定位到特定的 joinpoint 上
  2. 如何在 advice 中編寫切面代碼.

可以簡單地認為, 使用 @Aspect 註解的類就是切面.

  

6.3. 什麼是切點(JoinPoint

程式運行中的一些時間點, 例如一個方法的執行, 或者是一個異常的處理.

在 Spring AOP 中, join point 總是方法的執行點。

6.4. 什麼是通知(Advice)?

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

6.5. 有哪些類型的通知(Advice)?

  • Before - 這些類型的 Advice 在 joinpoint 方法之前執行,並使用 @Before 註解標記進行配置。
  • After Returning - 這些類型的 Advice 在連接點方法正常執行後執行,並使用@AfterReturning 註解標記進行配置。
  • After Throwing - 這些類型的 Advice 僅在 joinpoint 方法通過拋出異常退出並使用 @AfterThrowing 註解標記配置時執行。
  • After (finally) - 這些類型的 Advice 在連接點方法之後執行,無論方法退出是正常還是異常返回,並使用 @After 註解標記進行配置。
  • Around - 這些類型的 Advice 在連接點之前和之後執行,並使用 @Around 註解標記進行配置。

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

concern 是我們想要在應用程式的特定模組中定義的行為。它可以定義為我們想要實現的功能。

cross-cutting concern 是一個適用於整個應用的行為,這會影響整個應用程式。例如,日誌記錄,安全性和資料轉送是應用程式幾乎每個模組都需要關注的問題,因此它們是跨領域的問題。

6.7. AOP 有哪些實現方式?

實現 AOP 的技術,主要分為兩大類:

①.靜態代理 - 指使用 AOP 架構提供的命令進行編譯,從而在編譯階段就可產生 AOP 代理類,因此也稱為編譯時間增強;

a.編譯時間編織(特殊編譯器實現)

b.類載入時編織(特殊的類載入器實現)。

②.動態代理 - 在運行時在記憶體中“臨時”產生 AOP 動態代理類,因此也被稱為運行時增強。

c.JDK 動態代理

d.CGLIB

6.8. Spring AOP and AspectJ AOP 有什麼區別?

Spring AOP 基於動態代理方式實現;AspectJ 基於靜態代理方式實現。

Spring AOP 僅支援方法層級的 PointCut;提供了完全的 AOP 支援,它還支援屬性層級的 PointCut。

6.9. 如何理解 Spring 中的代理?

將 Advice 應用於目標對象後建立的對象稱為代理。在用戶端對象的情況下,目標對象和代理對象是相同的。

Advice + TargetObject=Proxy

6.10. 什麼是編織(Weaving)?

為了建立一個 advice 對象而連結一個 aspect 和其它應用類型或對象,稱為編織(Weaving)。在 Spring AOP 中,編織在運行時執行。請參考:

 

7. MVC

7.1. Spring MVC 架構有什麼用?

Spring Web MVC 架構提供 模型-視圖-控制器 架構和隨時可用的組件,用於開發靈活且鬆散耦合的 Web 應用程式。 MVC 模式有助於分離應用程式的不同方面,如輸入邏輯,商務邏輯和 UI 邏輯,同時在所有這些元素之間提供鬆散耦合。

7.2. 描述一下 DispatcherServlet 的工作流程

DispatcherServlet 的工作流程可以用一幅圖來說明

  

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

7.3. 介紹一下 WebApplicationContext

WebApplicationContext 是 ApplicationContext 的擴充。它具有 Web 應用程式所需的一些額外功能。它與普通的 ApplicationContext 在解析主題和決定與哪個 servlet 關聯的能力方面有所不同。

 

寫在最後:歡迎留言討論,歡迎關注,持續更新!

 

Java在常見的spring面試問題TOP50

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.