Spring面試題



親愛的讀者,這些Spring面試題特別設計,旨在幫助您熟悉在Spring主題面試中可能遇到的問題型別。根據我的經驗,優秀的面試官在面試過程中很少會計劃要問什麼特定問題,通常會從主題的一些基本概念開始,然後根據進一步的討論以及您的回答繼續提問。

Spring是一個用於企業級Java的開源開發框架。Spring框架的核心功能可用於開發任何Java應用程式,但它也提供了擴充套件功能,可以在Java EE平臺上構建Web應用程式。Spring框架的目標是簡化J2EE開發,並透過啟用基於POJO的程式設計模型來促進良好的程式設計實踐。

以下是使用Spring框架的一些主要好處:

  • 輕量級− Spring在大小和透明度方面都很輕量級。Spring框架的基本版本大約為2MB。

  • 控制反轉(IOC)− Spring使用控制反轉技術實現松耦合。物件提供它們的依賴項,而不是建立或查詢依賴物件。

  • 面向方面(AOP)− Spring支援面向方面程式設計,並透過將應用程式業務邏輯與系統服務分離,從而實現內聚式開發。

  • 容器− Spring包含並管理應用程式物件的整個生命週期和配置。

  • MVC框架− Spring的Web框架是一個設計良好的Web MVC框架,它為Struts或其他過度設計或不太流行的Web框架提供了一個很好的替代方案。

  • 事務管理− Spring提供了一個一致的事務管理介面,可以縮減到本地事務(例如,使用單個數據庫)並擴充套件到全域性事務(例如,使用JTA)。

  • 異常處理− Spring提供了一個方便的API,用於將特定於技術的異常(例如,由JDBC,Hibernate或JDO丟擲)轉換為一致的未檢查異常。

以下是Spring框架的模組:

  • 核心模組
  • Bean模組
  • 上下文模組
  • 表示式語言模組
  • JDBC模組
  • ORM模組
  • OXM模組
  • Java訊息服務(JMS)模組
  • 事務模組
  • Web模組
  • Web-Servlet模組
  • Web-Struts模組
  • Web-Portlet模組

Spring配置檔案是一個XML檔案。該檔案包含類資訊,並描述瞭如何配置這些類以及如何將它們引入彼此。

控制反轉(IoC)是一個通用概念,它可以透過多種不同的方式表達,而依賴注入僅僅是控制反轉的一個具體示例。

這個概念說的是,您不建立物件,而是描述它們應該如何建立。您不會在程式碼中直接將元件和服務連線在一起,而是在配置檔案中描述哪些元件需要哪些服務。然後,容器(IoC容器)負責將它們全部連線起來。

IoC的型別包括:

  • 基於建構函式的依賴注入− 當容器呼叫一個具有多個引數的類建構函式時,每個引數都表示對其他類的依賴,就會實現基於建構函式的DI。

  • 基於Setter的依賴注入− 透過在呼叫無引數建構函式或無引數靜態工廠方法來例項化Bean之後,容器呼叫Bean上的Setter方法來實現基於Setter的DI。

由於您可以混合使用基於建構函式和基於Setter的DI,因此一個好的經驗法則是:對於強制依賴項使用建構函式引數,對於可選依賴項使用Setter。請注意,在Setter上使用@Required註解可以用來將Setter設為強制依賴項。

IoC或依賴注入的主要好處是:

  • 它最大限度地減少了應用程式中的程式碼量。

  • 它使您的應用程式易於測試,因為它不需要在單元測試用例中使用任何單例或JNDI查詢機制。

  • 以最少的努力和最不具侵入性的機制來促進松耦合。

  • IoC容器支援服務的急切例項化和延遲載入。

面向方面程式設計(AOP)是一種程式設計技術,它允許程式設計師將橫切關注點(或跨越典型責任劃分的行為,例如日誌記錄和事務管理)模組化。AOP的核心結構是方面,它將影響多個類的行為封裝到可重用的模組中。

Spring IoC建立物件,將它們連線在一起,配置它們,並管理它們從建立到銷燬的整個生命週期。Spring容器使用依賴注入(DI)來管理構成應用程式的元件。

IoC容器有兩種型別:

  • BeanFactory容器− 這是最簡單的容器,提供對DI的基本支援。在資源有限的情況下(例如移動裝置或基於Applet的應用程式),通常首選BeanFactory。

  • Spring ApplicationContext容器− 該容器添加了更多特定於企業的功能,例如能夠從屬性檔案解析文字訊息以及能夠將應用程式事件釋出到感興趣的事件偵聽器。

最常用的BeanFactory實現是XmlBeanFactory類。該容器從XML檔案讀取配置元資料,並使用它來建立一個完全配置的系統或應用程式。

'Application Context'的三個常用實現是:

  • FileSystemXmlApplicationContext− 該容器從XML檔案載入Bean的定義。在這裡,您需要向建構函式提供XML Bean配置檔案的完整路徑。

  • ClassPathXmlApplicationContext− 該容器從XML檔案載入Bean的定義。在這裡,您不需要提供XML檔案的完整路徑,但需要正確設定CLASSPATH,因為該容器將在CLASSPATH中查詢Bean配置XML檔案。

  • WebXmlApplicationContext− 該容器從Web應用程式內部載入包含所有Bean定義的XML檔案。

以下是一些區別:

  • Application Context提供了一種解析文字訊息的方法,包括對這些訊息的i18n支援。

  • Application Context提供了一種通用的方式來載入檔案資源,例如影像。

  • Application Context可以將事件釋出到註冊為偵聽器的Bean。

  • 某些對容器或容器中Bean的操作(必須使用BeanFactory以程式設計方式處理)可以在Application Context中以宣告方式處理。

  • Application Context實現了MessageSource,這是一個用於獲取本地化訊息的介面,其實際實現是可插拔的。

構成應用程式主幹並由Spring IoC容器管理的物件稱為Bean。Bean是由Spring IoC容器例項化、組裝和管理的物件。這些Bean是使用您提供給容器的配置元資料建立的,例如,以XML <bean/>定義的形式。

Bean定義包含稱為配置元資料的資訊,容器需要這些資訊來了解以下內容:

  • 如何建立Bean
  • Bean的生命週期細節
  • Bean的依賴項

有以下三種重要方法可以向Spring容器提供配置元資料:

  • 基於XML的配置檔案。
  • 基於註解的配置
  • 基於Java的配置

檢視以下示例:

<?xml version = "1.0" encoding = "UTF-8"?>

<beans xmlns = "http://www.springframework.org/schema/beans"
   xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
   xsi:schemaLocation = "http://www.springframework.org/schema/beans
   http://www.springframework.org/schema/beans/spring-beans.xsd">

   <bean id = "helloWorld" class = "com.tutorialspoint.HelloWorld">
      <property name = "message" value = "Hello World!"/>
   </bean>

</beans>

在Spring中定義<bean>時,可以選擇為該Bean宣告一個作用域。例如,要強制Spring在每次需要時都生成一個新的Bean例項,應將Bean的scope屬性宣告為prototype。類似地,如果希望Spring每次需要時都返回相同的Bean例項,應將Bean的scope屬性宣告為singleton

Spring框架支援以下五種作用域,其中三種只有在使用web感知的ApplicationContext時才可用。

  • singleton − 將bean定義的作用域限定為每個Spring IoC容器一個例項。

  • prototype − 將單個bean定義的作用域限定為可以擁有任意數量的物件例項。

  • request − 將bean定義的作用域限定為一個HTTP請求。僅在web感知的Spring ApplicationContext上下文中有效。

  • session − 將bean定義的作用域限定為一個HTTP會話。僅在web感知的Spring ApplicationContext上下文中有效。

  • global-session − 將bean定義的作用域限定為一個全域性HTTP會話。僅在web感知的Spring ApplicationContext上下文中有效。

Spring框架中bean的預設作用域是Singleton。

否,Spring框架中的singleton bean不是執行緒安全的。

以下是Spring中bean生命週期的順序:

  • 例項化 − 首先,Spring容器從XML檔案中找到bean的定義並例項化bean。

  • 填充屬性 − 使用依賴注入,Spring根據bean定義中指定的屬性填充所有屬性。

  • 設定Bean名稱 − 如果bean實現了BeanNameAware介面,Spring會將bean的id傳遞給setBeanName()方法。

  • 設定Bean工廠 − 如果Bean實現了BeanFactoryAware介面,Spring會將beanfactory傳遞給setBeanFactory()方法。

  • 初始化前 − 也稱為bean的後處理。如果任何BeanPostProcessors與bean相關聯,Spring會呼叫postProcesserBeforeInitialization()方法。

  • 初始化bean − 如果bean實現了IntializingBean,則呼叫其afterPropertySet()方法。如果bean具有init方法宣告,則呼叫指定的初始化方法。

  • 初始化後 − 如果任何BeanPostProcessors與bean相關聯,則會呼叫其postProcessAfterInitialization()方法。

  • 準備使用 − 現在bean可以被應用程式使用了。

  • 銷燬 − 如果bean實現了DisposableBean,它將呼叫destroy()方法。

在<property/>或<constructor-arg/>元素內部的<bean/>元素定義了一個所謂的內部bean。內部bean定義不需要定義的id或名稱;容器會忽略這些值。它還會忽略scope標誌。內部bean始終是匿名的,並且始終作用域為原型。

Spring提供了四種類型的集合配置元素,如下所示:

  • <list> − 這有助於連線,即注入值列表,允許重複。

  • <set> − 這有助於連線值集,但不允許重複。

  • <map> − 這可以用來注入名稱-值對的集合,其中名稱和值可以是任何型別。

  • <props> − 這可以用來注入名稱-值對的集合,其中名稱和值都是字串。

Spring容器能夠自動裝配協作bean之間的關係。這意味著可以透過檢查BeanFactory的內容自動讓Spring解析bean的協作者(其他bean),而無需使用<constructor-arg>和<property>元素。

自動裝配功能有五種模式,可用於指示Spring容器對依賴注入使用自動裝配:

  • no − 這是預設設定,表示不進行自動裝配,應使用顯式bean引用進行連線。對於這種連線,您無需執行任何特殊操作。這正是您在依賴注入章節中已經看到的。

  • byName − 按屬性名稱自動裝配。Spring容器檢視在XML配置檔案中autowire屬性設定為byName的bean的屬性。然後,它嘗試將其屬性與配置檔案中定義的相同名稱的bean進行匹配和連線。

  • byType − 按屬性資料型別自動裝配。Spring容器檢視在XML配置檔案中autowire屬性設定為byType的bean的屬性。然後,如果其型別與配置檔案中bean名稱完全匹配,它會嘗試匹配和連線屬性。如果存在多個此類bean,則會丟擲致命異常。

  • constructor − 類似於byType,但型別適用於建構函式引數。如果容器中建構函式引數型別的bean不只有一個,則會引發致命錯誤。

  • autodetect − Spring首先嚐試使用autowire by constructor進行連線,如果失敗,Spring嘗試使用autowire by byType進行連線。

自動裝配的侷限性有:

  • 覆蓋可能性 − 您仍然可以使用<constructor-arg>和<property>設定指定依賴項,這將始終覆蓋自動裝配。

  • 原始資料型別 − 您無法自動裝配所謂的簡單屬性,例如基本型別、字串和類。

  • 混亂的本質 − 自動裝配不如顯式連線精確,因此,如果可能,請優先使用顯式連線。

是的。

基於註解的配置提供了XML設定的替代方案,它依賴於位元組碼元資料來連線元件,而不是角括號宣告。開發人員無需使用XML來描述bean連線,而是透過在相關類、方法或欄位宣告上使用註解將配置移動到元件類本身。

預設情況下,Spring容器中不會開啟註解連線。因此,在我們可以使用基於註解的連線之前,需要在Spring配置檔案中透過配置<context:annotation-config/>來啟用它。

此註解簡單地表明受影響的bean屬性必須在配置時填充,方法是在bean定義中使用顯式屬性值或透過自動裝配。如果受影響的bean屬性未填充,則容器會丟擲BeanInitializationException。

此註解提供了更細粒度的控制,用於控制自動裝配在哪裡以及如何完成。@Autowired註解可用於在setter方法上自動裝配bean,就像@Required註解、建構函式、屬性或具有任意名稱和/或多個引數的方法一樣。

可能存在您建立多個相同型別的bean並希望只將其中一個與屬性連線的情況,在這種情況下,您可以將@Qualifier註解與@Autowired一起使用,透過指定將連線哪個確切的bean來消除混淆。

Spring具有基於JSR-250的註解,其中包括@PostConstruct、@PreDestroy和@Resource註解。

  • @PostConstruct − 此註解可用作初始化回撥的替代方案。

  • @PreDestroy − 此註解可用作銷燬回撥的替代方案。

  • @Resource − 此註解可用於欄位或setter方法。@Resource註解採用“name”屬性,該屬性將被解釋為要注入的bean名稱。您可以說,它遵循按名稱自動裝配語義。

基於Java的配置選項使您能夠在沒有XML的情況下編寫大部分Spring配置,而是藉助一些基於Java的註解。

例如:註解@Configuration表示該類可以被Spring IoC容器用作bean定義的來源。@Bean註解告訴Spring,用@Bean註解的方法將返回一個物件,該物件應在Spring應用程式上下文中註冊為bean。

ApplicationContext中的事件處理是透過ApplicationEvent類和ApplicationListener介面提供的。因此,如果一個bean實現了ApplicationListener,那麼每次將ApplicationEvent釋出到ApplicationContext時,都會通知該bean。

Spring提供以下標準事件:

  • ContextRefreshedEvent − 當ApplicationContext初始化或重新整理時,釋出此事件。這也可以透過在ConfigurableApplicationContext介面上使用refresh()方法來引發。

  • ContextStartedEvent − 當使用ConfigurableApplicationContext介面上的start()方法啟動ApplicationContext時,釋出此事件。在收到此事件後,您可以輪詢資料庫,或者重新/啟動任何已停止的應用程式。

  • ContextStoppedEvent − 當使用ConfigurableApplicationContext介面上的stop()方法停止ApplicationContext時,釋出此事件。在收到此事件後,您可以執行所需的清理工作。

  • ContextClosedEvent − 當使用ConfigurableApplicationContext介面上的close()方法關閉ApplicationContext時,釋出此事件。關閉的上下文將達到其生命週期結束;它無法重新整理或重新啟動。

  • RequestHandledEvent − 這是一個特定於web的事件,告訴所有bean已服務於HTTP請求。

一個模組,它具有一組提供橫切需求的API。例如,日誌記錄模組將被稱為日誌記錄的AOP切面。應用程式可以根據需要擁有任意數量的切面。在Spring AOP中,切面是使用常規類(基於模式的方法)或使用@Aspect註解的常規類(@AspectJ風格)實現的。

關注點 − 關注點是我們希望在應用程式模組中具有的行為。關注點可以定義為我們想要實現的功能。我們感興趣的問題定義了我們的關注點。

橫切關注點 − 它是適用於整個應用程式並影響整個應用程式的關注點。例如,日誌記錄、安全性和資料傳輸是在應用程式的幾乎每個模組中都需要關注的點,因此是橫切關注點。

這表示應用程式中您可以插入AOP切面的一個點。您也可以說,它是應用程式中使用Spring AOP框架採取操作的實際位置。

這是在方法執行之前或之後要採取的實際操作。這是Spring AOP框架在程式執行期間呼叫的實際程式碼段。

這是一組一個或多個連線點,在這些連線點上應執行通知。您可以使用表示式或模式指定切點,就像我們在AOP示例中看到的那樣。

簡介允許您向現有類新增新的方法或屬性。

被一個或多個方面建議的物件,此物件始終為代理物件。也稱為被建議物件。

織入是將方面與其他應用程式型別或物件連結以建立被建議物件的流程。

織入可以在編譯時、載入時或執行時進行。

Spring 方面可以使用以下五種通知型別:

  • before - 在方法執行之前執行通知。

  • after - 無論方法執行結果如何,都在方法執行之後執行通知。

  • after-returning - 僅當方法成功完成時,才在方法執行之後執行通知。

  • after-throwing - 僅當方法透過丟擲異常退出時,才在方法執行之後執行通知。

  • around - 在呼叫被建議方法之前和之後執行通知。

方面是使用常規類以及基於 XML 的配置來實現的。

@AspectJ 指的是將方面宣告為使用 Java 5 註解進行註釋的常規 Java 類的一種風格。

藉助 Spring 框架提供的名為 JdbcTemplate 的模板類,可以更有效地使用 JDBC。

使用 Spring JDBC 框架,資源管理和錯誤處理的負擔大大減少。因此,它讓開發人員編寫語句和查詢以獲取資料庫中的資料。JdbcTemplate 提供了許多便利方法來執行諸如將資料庫資料轉換為基本型別或物件、執行準備好的和可呼叫的語句以及提供自定義資料庫錯誤處理等操作。

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

  • 程式設計事務管理 - 這意味著您已在程式設計的幫助下管理了事務。這為您提供了極大的靈活性,但難以維護。

  • 宣告式事務管理 - 這意味著您將事務管理與業務程式碼分離。您只需使用註釋或基於 XML 的配置來管理事務。

儘管宣告式事務管理不如程式設計事務管理靈活,但它允許您透過程式碼控制事務,因此它比程式設計事務管理更可取。

Spring Web MVC 框架提供模型-檢視-控制器架構以及可用於開發靈活且松耦合 Web 應用程式的現成元件。MVC 模式導致分離應用程式的不同方面(輸入邏輯、業務邏輯和 UI 邏輯),同時在這些元素之間提供松耦合。

Spring Web MVC 框架圍繞一個 DispatcherServlet 設計,它處理所有 HTTP 請求和響應。

WebApplicationContext 是普通 ApplicationContext 的擴充套件,它具有一些 Web 應用程式所需的額外功能。它與普通 ApplicationContext 的區別在於它能夠解析主題,並且它知道它與哪個 servlet 相關聯。

以下是 Spring MVC 相比於 Struts MVC 的一些優勢:

  • Spring 的 MVC 基於介面,非常通用和靈活,但 Struts 強制將 Action 和 Form 物件繼承為具體類。

  • Spring 提供攔截器和控制器,從而有助於將常見行為分解到多個請求的處理中。

  • Spring 可以配置不同的檢視技術,如 Freemarker、JSP、Tiles、Velocity、XLST 等,還可以透過實現 Spring View 介面建立自己的自定義檢視機制。

  • 在 Spring MVC 中,可以使用 DI(IOC)配置控制器,這使得它的測試和整合變得容易。

  • Spring MVC 的 Web 層比 Struts Web 層更容易測試,因為避免了強制具體繼承和控制器對分派 servlet 的顯式依賴。

  • Struts 強制您的控制器擴充套件 Struts 類,但 Spring 沒有,您可以選擇擴充套件許多便捷的控制器實現。

  • 在 Struts 中,Action 透過在 ActionMapping 中或全域性定義 ActionForwards 來耦合到檢視。SpringMVC 具有 HandlerMapping 介面來支援此功能。

  • 使用 Struts,驗證通常在 ActionForm 的 validate 方法中執行(實現)。在 SpringMVC 中,驗證器是業務物件,不依賴於 Servlet API,這使得這些驗證器可以在將域物件持久化到資料庫之前在您的業務邏輯中重用。

控制器提供對應用程式行為的訪問,您通常透過服務介面定義這些行為。控制器解釋使用者輸入並將其轉換為由檢視呈現給使用者的模型。Spring 以非常抽象的方式實現控制器,這使您可以建立各種控制器。

@Controller 註解表示特定類充當控制器的角色。Spring 不要求您擴充套件任何控制器基類或引用 Servlet API。

@RequestMapping 註解用於將 URL 對映到整個類或特定的處理程式方法。

使用 Spring 訪問 Hibernate 有兩種方法:

  • 使用 Hibernate 模板和回撥進行控制反轉。

  • 擴充套件 HibernateDAOSupport 並應用 AOP 攔截器節點。

Spring 支援以下 ORM:

  • Hibernate
  • iBatis
  • JPA(Java 永續性 API)
  • TopLink
  • JDO(Java 資料物件)
  • OJB

接下來是什麼?

您可以進一步回顧您之前完成的與該主題相關的作業,並確保您能夠自信地談論它們。如果您是應屆畢業生,面試官不會期望您回答非常複雜的問題,而是您必須使自己的基礎概念非常牢固。

其次,如果您無法回答一些問題,其實並不重要,重要的是無論您回答了什麼,都必須充滿自信。所以在面試時要自信。我們在 tutorialspoint 祝您面試順利,並祝您未來的工作一切順利。歡呼 :-)

spring_questions_answers.htm
廣告