Spring面試常問內(nèi)容

Spring 面試問題 TOP 50

IOC、AOP、AOP原理動態(tài)代理和cglib原理與二者之間的區(qū)別、Bean 生命周期、ThreadLocal 保證線程安全、事務傳播、Spring MVC、設計模式,除了這些面試題經(jīng)常出現(xiàn)的,還有就是需要看一些Spring源碼解讀,因為一些面試官會問你,有沒有看過源碼,這時候把自己看過的看懂的說一下就OK了。


MVC

M:指的是模型,控制器在完成邏輯處理后,通常會產(chǎn)生一些信息,這些信息需要返回給用戶并在瀏覽器上顯示,這些信息被稱為模型(model)
V:模型需要以用戶友好的方式進行格式化,一般會是HTML,所以信息需要發(fā)送給一個視圖(view)通常會是JSP。
C:控制器,控制器是一個用于處理請求的Spring組件。在典型的應用程序中可能會有多個控制器。


解釋一下ApplicationContext

Spring有兩個核心接口,BeanFactory 和 ApplicationContext,其中ApplicationContext是BeanFactory的子接口。他們都能代表Spring容器,Spring容器是生成Bean實例的工廠,并且管理容器中的bean。Spring容器最基本的接口就是BeanFactory。BeanFactory負責配置、創(chuàng)建、管理Bean,他有一個子接口:ApplicationContext,因此也稱之為Spring上下文。Spring容器負責管理Bean與Bean之間的依賴關系。


ApplicationContext通常的實現(xiàn)是什么?

  • FileSystemXmlApplicationContext :此容器從一個XML文件中加載beans的定義,XML Bean 配置文件的全路徑名必須提供給它的構(gòu)造函數(shù)。

  • ClassPathXmlApplicationContext:此容器也從一個XML文件中加載beans的定義,這里,你需要正確設置classpath因為這個容器將在classpath里找bean配置。

  • WebXmlApplicationContext:此容器加載一個XML文件,此文件定義了一個WEB應用的所有bean。


解釋一下AOP

AOP是面向切面編程技術,通過這種技術,可以實現(xiàn)橫切關注點與它們所影響的對象之間的解耦。切面提供了一種方案,這種方案可以在一個地方定義通用功能,但是可以通過聲明的方式定義這個功能要以何種方式在何處使用,而無需修改受影響的類。橫切關注點可以被模塊化為特殊的類,這些類被稱為切面,這樣做有兩個好處,首先,現(xiàn)在每個關注點都集中于一個地方,而不是分散到多處代碼中,其次,服務模塊更加簡潔,因為他們只需要包含主要關注點(核心功能)的代碼,而次要需要關注的代碼被轉(zhuǎn)移到切面中了。
AOP是基于動態(tài)代理的。如果要代理的對象,實現(xiàn)了某個接口,那么Spring AOP會使用JDK Proxy,去創(chuàng)建代理對象,而對于沒有實現(xiàn)接口的對象,就無法使用 JDK Proxy 去進行代理了,這時候Spring AOP會使用Cglib ,這時候Spring AOP會使用 Cglib 生成一個被代理對象的子類來作為代理


AOP術語

通知:定義了切面是什么以及何時使用
連接點:應用可能有數(shù)以千計的時機應用通知,這些時機被稱為連接點。連接點是在應用執(zhí)行過程中能夠插入切面的一個點。
切點:切點有助于縮小切面所通知的連接點的范圍。如果說通知定義了切面的“什么”和“何時”的話,切點就定義了“何處”。
切面:切面是通知和切點的結(jié)合,通知和切點共同定義了切面的全部內(nèi)容——他是什么?在何時和何處完成其功能。
引入:引入允許我們向現(xiàn)有的類添加新方法或?qū)傩浴?br> 織入:織入是把切面應用到目標對象并創(chuàng)建新的代理對象的過程。切面在指定的連接點被織入到目標對象中。


通知的種類

  • 前置通知:在目標方法被調(diào)用之前調(diào)用通知功能
  • 后置通知:在目標方法完成之后調(diào)用通知,此時不會關心方法的輸出是什么
  • 返回通知:在目標方法成功執(zhí)行之后調(diào)用通知
  • 異常通知:在目標方法拋出異常后調(diào)用通知
  • 環(huán)繞通知:通知包裹了被通知的方法,再被通知的方法調(diào)用之前和之后執(zhí)行自定義的行為。

解釋一下IoC

IoC(Inverse of Control)控制反轉(zhuǎn)是一種設計思想,就是將原本在程序中手動創(chuàng)建對象的控制權(quán),交由Spring框架來管理。IoC在其他語言中也有應用,并非Spring特有,IOC容器是Spring用來實現(xiàn)IOC的載體,IOC容器實際就是一個Map,Map中存放的是各種對象。使用IOC的好處:第一,資源集中管理,實現(xiàn)資源的可配置和易管理。第二,降低了使用資源雙方的依賴程度,也就是我們說的耦合度。
原理:工廠模式+反射


Java中實現(xiàn)注入的幾種方式

  • 構(gòu)造器注入
  • Setter方法注入
  • 接口注入

Spring中注入的方式

  1. 構(gòu)造器注入
  2. setter方法注入

Spring中bean的作用域

  • Singleton(缺省)不管有多少個請求,每個容器中只有一個bean的實例。
  • Prototype 原型實例,為每一個bean請求提供一個實例
  • request 在請求bean范圍內(nèi)會給每一個來自客戶端的網(wǎng)絡請求創(chuàng)建一個實例,在請求完成之后,bean會失效并被垃圾回收器回收。
  • Session 與請求范圍類似,確保每個session中有一個bean的實例,在session過期之后,bean會隨之失效。
  • global-session

IoC和DI的區(qū)別

IoC控制反轉(zhuǎn),指將對象的創(chuàng)建權(quán),反轉(zhuǎn)到Spring容器,DI依賴注入,指的是Spring在創(chuàng)建對象的過程中,講對象依賴屬性通過配置進行注入。


Spring中bean是線程安全的嗎?如果不是如何保證線程安全?

Spring中的bean不是線程安全的。
如果要保證線程安全,可以使用ThreadLocal解決。我們知道在一般情況下,只有無狀態(tài)的Bean才可以在多線程環(huán)境下共享,在Spring中,絕大部分Bean都可以聲明為singleton作用域。就是因為Spring對一些Bean(如RequestContextHolder、TransactionSynchronizationManager、LocaleContextHolder等)中非線程安全狀態(tài)采用ThreadLocal進行處理,讓它們也成為線程安全的狀態(tài),因為有狀態(tài)的Bean就可以在多線程中共享了。
ThreadLocal和線程同步機制都是為了解決多線程中相同變量的訪問沖突問題。
在同步機制中,通過對象的鎖機制保證同一時間只有一個線程訪問變量。這時該變量是多個線程共享的,使用同步機制要求程序慎密地分析什么時候?qū)ψ兞窟M行讀寫,什么時候需要鎖定某個對象,什么時候釋放對象鎖等繁雜的問題,程序設計和編寫難度相對較大。
而ThreadLocal則從另一個角度來解決多線程的并發(fā)訪問。ThreadLocal會為每一個線程提供一個獨立的變量副本,從而隔離了多個線程對數(shù)據(jù)的訪問沖突。因為每一個線程都擁有自己的變量副本,從而也就沒有必要對該變量進行同步了。ThreadLocal提供了線程安全的共享對象,在編寫多線程代碼時,可以把不安全的變量封裝進ThreadLocal。
由于ThreadLocal中可以持有任何類型的對象,低版本JDK所提供的get()返回的是Object對象,需要強制類型轉(zhuǎn)換。但JDK5.0通過泛型很好的解決了這個問題,在一定程度地簡化ThreadLocal的使用。
概括起來說,對于多線程資源共享的問題,同步機制采用了“以時間換空間”的方式,而ThreadLocal采用了“以空間換時間”的方式。前者僅提供一份變量,讓不同的線程排隊訪問,而后者為每一個線程都提供了一份變量,因此可以同時訪問而互不影響。


Spring中事物隔離級別
Spring事務的七種傳播行為


最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容