關於Spring的69個面試問答——終極列表

importnew發表於2014-06-03

  這篇文章總結了一些關於Spring框架的重要問題,這些問題都是你在面試或筆試過程中可能會被問到的。下次你再也不用擔心你的面試了,Java Code Geeks這就幫你解答。

  大多數你可能被問到的問題都列舉在下面的列表中了。所有的核心模組,從基礎的Spring功能(如Spring Beans)到上層的Spring MVC框架,文章中都會進行簡短的講解。看完這些面試問題,你應該看看我們的Spring教程

  我們開始吧!

  目錄

  Spring概述

  依賴注入

  Spring Beans

  Spring註解

  Spring的物件訪問

  Spring面向切面程式設計

  Spring MVC框架

  Spring概述

  1.什麼是Spring?

  Spring是一個開源的Java EE開發框架。Spring框架的核心功能可以應用在任何Java應用程式中,但對Java EE平臺上的Web應用程式有更好的擴充套件性。Spring框架的目標是使得Java EE應用程式的開發更加簡捷,通過使用POJO為基礎的程式設計模型促進良好的程式設計風格。

  2.Spring有哪些優點?

  • 輕量級:Spring在大小和透明性方面絕對屬於輕量級的,基礎版本的Spring框架大約只有2MB。

  • 控制反轉(IOC):Spring使用控制反轉技術實現了鬆耦合。依賴被注入到物件,而不是建立或尋找依賴物件。

  • 面向切面程式設計(AOP): Spring支援面向切面程式設計,同時把應用的業務邏輯與系統的服務分離開來。

  • 容器:Spring包含並管理應用程式物件的配置及生命週期。

  • MVC框架:Spring的web框架是一個設計優良的web MVC框架,很好的取代了一些web框架。

  • 事務管理:Spring對下至本地業務上至全域性業務(JAT)提供了統一的事務管理介面。

  • 異常處理:Spring提供一個方便的API將特定技術的異常(由JDBC, Hibernate, 或JDO丟擲)轉化為一致的、Unchecked異常。

  3.Spring框架有哪些模組?

  Spring框架的基本模組如下所示:

  • Core module
  • Bean module
  • Context module
  • Expression Language module
  • JDBC module
  • ORM module
  • OXM module
  • Java Messaging Service(JMS) module
  • Transaction module
  • Web module
  • Web-Servlet module
  • Web-Struts module
  • Web-Portlet module

  4.解釋核心容器(應用上下文)模組

  這是Spring的基本模組,它提供了Spring框架的基本功能。BeanFactory 是所有Spring應用的核心。Spring框架是建立在這個模組之上的,這也使得Spring成為一個容器。

  5.BeanFactory – BeanFactory 例項

  BeanFactory是工廠模式的一種實現,它使用控制反轉將應用的配置和依賴與實際的應用程式碼分離開來。

  最常用的BeanFactory實現是XmlBeanFactory類。

  6.XmlBeanFactory

  最常用的就是org.springframework.beans.factory.xml.XmlBeanFactory,它根據XML檔案中定義的內容載入beans。該容器從XML檔案中讀取配置後設資料,並用它來建立一個完備的系統或應用。

  7.解釋AOP模組

  AOP模組用來開發Spring應用程式中具有切面性質的部分。該模組的大部分服務由AOP Aliance提供,這就保證了Spring框架和其他AOP框架之間的互操作性。另外,該模組將後設資料程式設計引入到了Spring。

  8.解釋抽象JDBC和DAO模組

  通過使用抽象JDBC和DAO模組保證了與資料庫連線程式碼的整潔與簡單,同時避免了由於未能關閉資料庫資源引起的問題。它在多種資料庫伺服器的錯誤資訊之上提供了一個很重要的異常層。它還利用Spring的AOP模組為Spring應用程式中的物件提供事務管理服務。

  9.解釋物件/關係對映整合模組

  Spring通過提供ORM模組在JDBC的基礎上支援物件關係對映工具。這樣的支援使得Spring可以整合主流的ORM框架,包括Hibernate, JDO, 及iBATIS SQL Maps。Spring的事務管理可以同時支援以上某種框架和JDBC。

  10.解釋web模組

  Spring的web模組建立在應用上下文(application context)模組之上,提供了一個適合基於web應用程式的上下文環境。該模組還支援了幾個面向web的任務,如透明的處理多檔案上傳請求及將請求引數同業務物件繫結起來。

  11.解釋Spring MVC模組

  Spring提供MVC框架構建web應用程式。Spring可以很輕鬆的同其他MVC框架結合,但Spring的MVC是個更好的選擇,因為它通過控制反轉將控制邏輯和業務物件完全分離開來。

  12.Spring的配置檔案

  Spring的配置檔案是一個XML檔案,檔案包含了類資訊並描述了這些類是如何配置和互相呼叫的。

  13.Spring IoC容器是什麼?

  Spring IOC負責建立物件、管理物件(通過依賴注入)、整合物件、配置物件以及管理這些物件的生命週期。

  14.IOC有什麼優點?

  IOC或依賴注入減少了應用程式的程式碼量。它使得應用程式的測試很簡單,因為在單元測試中不再需要單例或JNDI查詢機制。簡單的實現以及較少的干擾機制使得鬆耦合得以實現。IOC容器支援勤性單例及延遲載入服務。

 15.應用上下文是如何實現的?

  FileSystemXmlApplicationContext 容器載入XML檔案中beans的定義。XML Bean配置檔案的完整路徑必須傳遞給構造器。

  FileSystemXmlApplicationContext 容器也載入XML檔案中beans的定義。注意,你需要正確的設定CLASSPATH,因為該容器會在CLASSPATH中檢視bean的XML配置檔案。

  WebXmlApplicationContext:該容器載入xml檔案,這些檔案定義了web應用中所有的beans。

  16.Bean Factory和ApplicationContext有什麼區別?

  ApplicationContext提供了一種解決文件資訊的方法,一種載入檔案資源的方式(如圖片),他們可以向監聽他們的beans傳送訊息。另外,容器或者容器中beans的操作,這些必須以bean工廠的程式設計方式處理的操作可以在應用上下文中以宣告的方式處理。應用上下文實現了MessageSource,該介面用於獲取本地訊息,實際的實現是可選的。

  17.Spring應用程式看起來像什麼?

  • 一個定義功能的介面
  • 實現包括屬性,setter和getter方法,功能等
  • Spring AOP
  • Spring的XML配置檔案
  • 使用該功能的客戶端程式設計

  依賴注入

  18.Spring中的依賴注入是什麼?

  依賴注入作為控制反轉(IOC)的一個層面,可以有多種解釋方式。在這個概念中,你不用建立物件而只需要描述如何建立它們。你不必通過程式碼直接的將元件和服務連線在一起,而是通過配置檔案說明哪些元件需要什麼服務。之後IOC容器負責銜接。

  19.有哪些不同型別的IOC(依賴注入)?

  • 構造器依賴注入:構造器依賴注入在容器觸發構造器的時候完成,該構造器有一系列的引數,每個引數代表注入的物件。

  • Setter方法依賴注入:首先容器會觸發一個無參建構函式或無參靜態工廠方法例項化物件,之後容器呼叫bean中的setter方法完成Setter方法依賴注入。

  20.你推薦哪種依賴注入?構造器依賴注入還是Setter方法依賴注入?

  你可以同時使用兩種方式的依賴注入,最好的選擇是使用構造器引數實現強制依賴注入,使用setter方法實現可選的依賴關係。

  Spring Beans

  21.什麼是Spring Beans?

  Spring Beans是構成Spring應用核心的Java物件。這些物件由Spring IOC容器例項化、組裝、管理。這些物件通過容器中配置的後設資料建立,例如,使用XML檔案中定義的建立。

  在Spring中建立的beans都是單例的beans。在bean標籤中有一個屬性為”singleton”,如果設為true,該bean是單例的,如果設為false,該bean是原型bean。Singleton屬性預設設定為true。因此,spring框架中所有的bean都預設為單例bean。

  22.Spring Bean中定義了什麼內容?

  Spring Bean中定義了所有的配置後設資料,這些配置資訊告知容器如何建立它,它的生命週期是什麼以及它的依賴關係。

  23.如何向Spring 容器提供配置後設資料?

  有三種方式向Spring 容器提供後設資料:

  24.你如何定義bean的作用域?

  在Spring中建立一個bean的時候,我們可以宣告它的作用域。只需要在bean定義的時候通過’scope’屬性定義即可。例如,當Spring需要產生每次一個新的bean例項時,應該宣告bean的scope屬性為prototype。如果每次你希望Spring返回一個例項,應該宣告bean的scope屬性為singleton。

  25.說一下Spring中支援的bean作用域

  Spring框架支援如下五種不同的作用域:

  • singleton:在Spring IOC容器中僅存在一個Bean例項,Bean以單例項的方式存在。

  • prototype:一個bean可以定義多個例項。

  • request:每次HTTP請求都會建立一個新的Bean。該作用域僅適用於WebApplicationContext環境。

  • session:一個HTTP Session定義一個Bean。該作用域僅適用於WebApplicationContext環境.

  • globalSession:同一個全域性HTTP Session定義一個Bean。該作用域同樣僅適用於WebApplicationContext環境.

  bean預設的scope屬性是’singleton‘。

  26.Spring框架中單例beans是執行緒安全的嗎?

  不是,Spring框架中的單例beans不是執行緒安全的。

  27.解釋Spring框架中bean的生命週期

  • Spring容器讀取XML檔案中bean的定義並例項化bean。

  • Spring根據bean的定義設定屬性值。

  • 如果該Bean實現了BeanNameAware介面,Spring將bean的id傳遞給setBeanName()方法。

  • 如果該Bean實現了BeanFactoryAware介面,Spring將beanfactory傳遞給setBeanFactory()方法。

  • 如果任何bean BeanPostProcessors 和該bean相關,Spring呼叫postProcessBeforeInitialization()方法。

  • 如果該Bean實現了InitializingBean介面,呼叫Bean中的afterPropertiesSet方法。如果bean有初始化函式宣告,呼叫相應的初始化方法。

  • 如果任何bean BeanPostProcessors 和該bean相關,呼叫postProcessAfterInitialization()方法。

  • 如果該bean實現了DisposableBean,呼叫destroy()方法。

  28.哪些是最重要的bean生命週期方法?能重寫它們嗎?

  有兩個重要的bean生命週期方法。第一個是setup方法,該方法在容器載入bean的時候被呼叫。第二個是teardown方法,該方法在bean從容器中移除的時候呼叫。

  bean標籤有兩個重要的屬性(init-method 和 destroy-method),你可以通過這兩個屬性定義自己的初始化方法和析構方法。Spring也有相應的註解:@PostConstruct 和 @PreDestroy。

  29.什麼是Spring的內部bean?

  當一個bean被用作另一個bean的屬性時,這個bean可以被宣告為內部bean。在基於XML的配置後設資料中,可以通過把元素定義在 元素內部實現定義內部bean。內部bean總是匿名的並且它們的scope總是prototype。

  30.如何在Spring中注入Java集合類?

  Spring提供如下幾種型別的集合配置元素

  • list元素用來注入一系列的值,允許有相同的值。

  • set元素用來注入一些列的值,不允許有相同的值。

  • map用來注入一組”鍵-值”對,鍵、值可以是任何型別的。

  • props也可以用來注入一組”鍵-值”對,這裡的鍵、值都字串型別。

  31.什麼是bean wiring?

  Wiring,或者說bean Wiring是指beans在Spring容器中結合在一起的情況。當裝配bean的時候,Spring容器需要知道需要哪些beans以及如何使用依賴注入將它們結合起來。

  32.什麼是bean自動裝配?

  Spring容器可以自動配置相互協作beans之間的關聯關係。這意味著Spring可以自動配置一個bean和其他協作bean之間的關係,通過檢查BeanFactory 的內容裡沒有使用和< property>元素。

  33.解釋自動裝配的各種模式?

  自動裝配提供五種不同的模式供Spring容器用來自動裝配beans之間的依賴注入:

  • no:預設的方式是不進行自動裝配,通過手工設定ref 屬性來進行裝配bean。

  • byName:通過引數名自動裝配,Spring容器查詢beans的屬性,這些beans在XML配置檔案中被設定為byName。之後容器試圖匹配、裝配和該bean的屬性具有相同名字的bean。

  • byType:通過引數的資料型別自動自動裝配,Spring容器查詢beans的屬性,這些beans在XML配置檔案中被設定為byType。之後容器試圖匹配和裝配和該bean的屬性型別一樣的bean。如果有多個bean符合條件,則丟擲錯誤。

  • constructor:這個同byType類似,不過是應用於建構函式的引數。如果在BeanFactory中不是恰好有一個bean與建構函式引數相同型別,則丟擲一個嚴重的錯誤。

  • autodetect:如果有預設的構造方法,通過 construct的方式自動裝配,否則使用 byType的方式自動裝配。

  34.自動裝配有哪些侷限性?

  自動裝配有如下侷限性:

  • 重寫:你仍然需要使用 和< property>設定指明依賴,這意味著總要重寫自動裝配。

  • 原生資料型別:你不能自動裝配簡單的屬性,如原生型別、字串和類。

  • 模糊特性:自動裝配總是沒有自定義裝配精確,因此,如果可能儘量使用自定義裝配。

  35.你可以在Spring中注入null或空字串嗎?

  完全可以。

  Spring註解

  36.什麼是Spring基於Java的配置?給出一些註解的例子

  基於Java的配置允許你使用Java的註解進行Spring的大部分配置而非通過傳統的XML檔案配置。

  以註解@Configuration為例,它用來標記類,說明作為beans的定義,可以被Spring IOC容器使用。另一個例子是@Bean註解,它表示該方法定義的Bean要被註冊進Spring應用上下文中。

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

  另外一種替代XML配置的方式為基於註解的配置,這種方式通過位元組後設資料裝配元件而非使用尖括號宣告。開發人員將直接在類中進行配置,通過註解標記相關的類、方法或欄位宣告,而不再使用XML描述bean之間的連線關係。

  38.如何開啟註解裝配?

  註解裝配預設情況下在Spring容器中是不開啟的。如果想要開啟基於註解的裝配只需在Spring配置檔案中配置元素即可。

  39.@Required 註解

  @Required表明bean的屬性必須在配置時設定,可以在bean的定義中明確指定也可通過自動裝配設定。如果bean的屬性未設定,則丟擲BeanInitializationException異常。

  40.@Autowired 註解

  @Autowired 註解提供更加精細的控制,包括自動裝配在何處完成以及如何完成。它可以像@Required一樣自動裝配setter方法、構造器、屬性或者具有任意名稱和/或多個引數的PN方法。

  41. @Qualifier 註解

  當有多個相同型別的bean而只有其中的一個需要自動裝配時,將@Qualifier 註解和@Autowire 註解結合使用消除這種混淆,指明需要裝配的bean。

  Spring資料訪問

  42.在Spring框架中如何更有效的使用JDBC?

  使用Spring JDBC框架,資源管理以及錯誤處理的代價都會減輕。開發人員只需通過statements和queries語句從資料庫中存取資料。Spring框架中通過使用模板類能更有效的使用JDBC,也就是所謂的JdbcTemplate(例子)。

  43.JdbcTemplate

  JdbcTemplate類提供了許多方法,為我們與資料庫的互動提供了便利。例如,它可以將資料庫的資料轉化為原生型別或物件,執行寫好的或可呼叫的資料庫操作語句,提供自定義的資料庫錯誤處理功能。

  44.Spring對DAO的支援

  Spring對資料訪問物件(DAO)的支援旨在使它可以與資料訪問技術(如 JDBC, Hibernate 及JDO)方便的結合起來工作。這使得我們可以很容易在的不同的持久層技術間切換,編碼時也無需擔心會丟擲特定技術的異常。

  45.使用Spring可以通過什麼方式訪問Hibernate?

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

  • 使用Hibernate Template的反轉控制以及回撥方法

  • 繼承HibernateDAOSupport,並申請一個AOP攔截器節點

  46.Spring支援的ORM

  Spring支援一下ORM:

  • Hibernate
  • iBatis
  • JPA (Java -Persistence API)
  • TopLink
  • JDO (Java Data Objects)
  • OJB

  47.如何通過HibernateDaoSupport將Spring和Hibernate結合起來?

  使用Spring的SessionFactory 呼叫LocalSessionFactory。結合過程分為以下三步:

  • 配置Hibernate SessionFactory

  • 繼承HibernateDaoSupport實現一個DAO

  • 使用AOP裝載事務支援

  48.Spring支援的事務管理型別

  Spring支援如下兩種方式的事務管理:

  • 程式設計式事務管理:這意味著你可以通過程式設計的方式管理事務,這種方式帶來了很大的靈活性,但很難維護。

  • 宣告式事務管理:這種方式意味著你可以將事務管理和業務程式碼分離。你只需要通過註解或者XML配置管理事務。

  49.Spring框架的事務管理有哪些優點?

  • 它為不同的事務API(如JTA, JDBC, Hibernate, JPA, 和JDO)提供了統一的程式設計模型。

  • 它為程式設計式事務管理提供了一個簡單的API而非一系列複雜的事務API(如JTA).

  • 它支援宣告式事務管理。

  • 它可以和Spring 的多種資料訪問技術很好的融合。

  50.你更推薦那種型別的事務管理?

  許多Spring框架的使用者選擇宣告式事務管理,因為這種方式和應用程式的關聯較少,因此更加符合輕量級容器的概念。宣告式事務管理要優於程式設計式事務管理,儘管在靈活性方面它弱於程式設計式事務管理(這種方式允許你通過程式碼控制業務)。

  Spring面向切面程式設計(AOP)

  51.解釋AOP

  面向切面程式設計,或AOP允許程式設計師模組化橫向業務邏輯,或定義核心部分的功能,例如日誌管理和事務管理。

  52.切面(Aspect)

  AOP的核心就是切面,它將多個類的通用行為封裝為可重用的模組。該模組含有一組API提供 cross-cutting功能。例如,日誌模組稱為日誌的AOP切面。根據需求的不同,一個應用程式可以有若干切面。在Spring AOP中,切面通過帶有@Aspect註解的類實現。

  53.在Spring AOP中concern和 cross-cutting concern的區別是什麼?

  Concern(核心邏輯):表示在應用程式中一個模組的行為。Concern可以定義為我們想要實現的功能。

  Cross-cutting concern(橫向的通用邏輯):指的是整個應用程式都會用到的功能,它影響整個應用程式。例如,日誌管理(Logging)、安全管理(Security)以及資料互動是應用程式的每個模組都要涉及到的,因此這些都屬於Cross-cutting concern。

  54.連線點(Join point)

  連線點代表應用程式中插入AOP切面的地點。它實際上是Spring AOP框架在應用程式中執行動作的地點。

  55.通知(Advice)

  通知表示在方法執行前後需要執行的動作。實際上它是Spring AOP框架在程式執行過程中觸發的一些程式碼。

  Spring切面可以執行一下五種型別的通知:

  • before(前置通知):在一個方法之前執行的通知。

  • after(最終通知):當某連線點退出的時候執行的通知(不論是正常返回還是異常退出)。

  • after-returning(後置通知):在某連線點正常完成後執行的通知。

  • after-throwing(異常通知):在方法丟擲異常退出時執行的通知。

  • around(環繞通知):在方法呼叫前後觸發的通知。

  56.切入點(Pointcut)

  切入點是一個或一組連線點,通知將在這些位置執行。可以通過表示式或匹配的方式指明切入點。

  57.什麼是引入?

  引入允許我們在已有的類上新增新的方法或屬性。

  58.什麼是目標物件?

  被一個或者多個切面所通知的物件。它通常是一個代理物件。也被稱做被通知(advised)物件。

  59.什麼是代理?

  代理是將通知應用到目標物件後建立的物件。從客戶端的角度看,代理物件和目標物件是一樣的。

  60.有幾種不同型別的自動代理?

  • BeanNameAutoProxyCreator:bean名稱自動代理建立器

  • DefaultAdvisorAutoProxyCreator:預設通知者自動代理建立器

  • Metadata autoproxying:後設資料自動代理

  61.什麼是織入?什麼是織入應用的不同點?

  織入是將切面和其他應用型別或物件連線起來建立一個通知物件的過程。織入可以在編譯、載入或執行時完成。

  62.解釋基於XML Schema方式的切面實現

  在這種情況下,切面由使用XML檔案配置的類實現。

  63.解釋基於註解方式(基於@AspectJ)的切面實現

  在這種情況下(基於@AspectJ的實現),指的是切面的對應的類使用Java 5註解的宣告方式。

  Spring的MVC框架

  64.什麼是Spring的MVC框架?

  Spring提供了一個功能齊全的MVC框架用於構建Web應用程式。Spring框架可以很容易的和其他的MVC框架融合(如Struts),該框架使用控制反轉(IOC)將控制器邏輯和業務物件分離開來。它也允許以宣告的方式繫結請求引數到業務物件上。

  65.DispatcherServlet

  Spring的MVC框架圍繞DispatcherServlet來設計的,它用來處理所有的HTTP請求和響應。

  66.WebApplicationContext

  WebApplicationContext繼承了ApplicationContext,並新增了一些web應用程式需要的功能。和普通的ApplicationContext 不同,WebApplicationContext可以用來處理主題樣式,它也知道如何找到相應的servlet。

  67.什麼是Spring MVC框架的控制器?

  控制器提供對應用程式行為的訪問,通常通過服務介面實現。控制器解析使用者的輸入,並將其轉換為一個由檢視呈現給使用者的模型。Spring 通過一種極其抽象的方式實現控制器,它允許使用者建立多種型別的控制器。

  68.@Controller annotation

  @Controller註解表示該類扮演控制器的角色。Spring不需要繼承任何控制器基類或應用Servlet API。

  69.@RequestMapping annotation

  @RequestMapping註解用於將URL對映到任何一個類或者一個特定的處理方法上。

  好了,現在你可以去面試了!不要忘了訪問我們的Spring教程。原文連結: javacodegeeks 翻譯: ImportNew - 人曉

相關文章