Spring常見面試題(13個面試題,回答超詳細)
馬上開春了面試前必備技能啊,就算不背下來也得知道一些。免得尷尬。
目錄
面試題一:Spring是什么?
面試題二:說說Spring 的優點?
面試題三:談談你對Spring的IOC理解?
面試題四:說說你對Spring的AOP理解?
面試題五:Spring AOP里面常用名詞的概念:
面試題六:Spring容器的啟動流程?
面試題七:Spring Bean的生命周期?
面試題八:說一下Spring中bean的作用域?
面試題九:說一下Spring基于xml注入bean的幾種方式?
面試題十:Spring如何解決循環依賴問題?
面試題十一:談一下Spring的自動裝配?
面試題十二:Spring框架中都用到了哪些設計模式?
面試題十三:Spring框架中有哪些不同類型的事件?
面試題一:Spring是什么?
Spring是一個輕量級的IoC和AOP容器框架。是為Java應用程序提供基礎性服務的一套框架,目的是用于簡化企業應用程序的開發,它使得開發者只需要關心業務需求。主要包括以下七個模塊:
Spring Context:提供框架式的Bean訪問方式,以及企業級功能(JNDI、定時任務等);
Spring Core:核心類庫,所有功能都依賴于該類庫,提供IOC和DI服務;
Spring AOP:AOP服務;
Spring Web:提供了基本的面向Web的綜合特性,提供對常見框架如Struts2的支持,Spring能夠管理這些框架,將Spring的資源注入給框架,也能在這些框架的前后插入-;
Spring MVC:提供面向Web應用的Model-View-Controller,即MVC實現。
Spring DAO:對JDBC的抽象封裝,簡化了數據訪問異常的處理,并能統一管理JDBC事務;
Spring ORM:對現有的ORM框架的支持;
面試題二:說說Spring 的優點?
spring屬于低侵入式設計,代碼的污染極低;
spring的DI機制將對象之間的依賴關系交由框架處理,減低組件的耦合性;
Spring提供了AOP技術,支持將一些通用任務,如安全、事務、日志、權限等進行集中式管理,從而提供更好的復用。
spring對于主流的應用框架提供了集成支持。
面試題三:談談你對Spring的IOC理解?
IOC,Inversion of Control,控制反轉,指將對象的控制權轉移給Spring框架,由 Spring 來負責控制對象的生命周期(比如創建、銷毀)和對象間的依賴關系。
最直觀的表達就是,以前創建對象的時機和主動權都是由自己把控的,如果在一個對象中使用另外的對象,就必須主動通過new指令去創建依賴對象,使用完后還需要銷毀(比如Connection等),對象始終會和其他接口或類耦合起來。而 IOC 則是由專門的容器來幫忙創建對象,將所有的類都在 Spring 容器中登記,當需要某個對象時,不再需要自己主動去 new 了,只需告訴 Spring 容器,然后 Spring 就會在系統運行到適當的時機,把你想要的對象主動給你。也就是說,對于某個具體的對象而言,以前是由自己控制它所引用對象的生命周期,而在IOC中,所有的對象都被 Spring 控制,控制對象生命周期的不再是引用它的對象,而是Spring容器,由 Spring 容器幫我們創建、查找及注入依賴對象,而引用對象只是被動的接受依賴對象,所以這叫控制反轉。
面試題四:說說你對Spring的AOP理解?
AOP(Aspect-OrientedProgramming),也就是面向切面編程。也可以這樣理解,學java的應該都知道面向對象編程(oop),而OOP是從靜態解讀考慮程序結構,但AOP是從動態角度考慮程序運行過程。也可以說AOP是OOP的補充和完善。OOP引入了封裝、繼承和多態性等概念來建立一種對象層次結構, 用以模擬公共的一個集合。當我們需要為分散的對象引入公共行為的時候,則OOP顯得無能為力了。也就是說,OOP允許你定義從上到下的關系,但并不適合從左到右的關系,例如日志功能。日志代碼往往水平的散布在所有對象層次中,而與它所散布到的對象的核心功能毫無關系。對于其他類型的代碼,如安全性、異常處理和透明的持續性也是如此。這種散布在各處的無關的代碼被稱為橫切代碼,在oop設計中,他導致了大量代碼的重復,而不利于各個模塊的重用。
而AOP技術則恰恰相反,它利用一種稱為“橫切”的技術,剖解開封裝的對象內部,并將哪些影響了多個類的公共行為封裝到一個可重用模塊,并將其名為'Aspect'[??spekt](方面)。 所謂"方面",簡單的來說就是將那些與業務無關,卻為業務模塊所共同調用的邏輯或責任封裝起來。便于減少系統的重復代碼,降低模塊間的耦合度等。
實現AOP的技術,主要分為兩大類:一是采用動態代理技術,利用截取信息的方式,對該信息進行裝飾,以取代魚油對象行為的執行;二是采用靜態織入的方式,引入特定的語法創建“方面”,從而使得編譯器可以在編譯期間織入有關“方面”的代碼。
面試題五:Spring AOP里面常用名詞的概念:
(1)連接點(Join point):指程序運行過程中所執行的方法。在Spring AOP中,一個連接點總代表一個方法的執行。
(2)切面(Aspect):被抽取出來的公共模塊,可以用來會橫切多個對象。Aspect切面可以看成 Pointcut切點 和 Advice通知 的結合,一個切面可以由多個切點和通知組成。
在Spring AOP中,切面可以在類上使用 @AspectJ 注解來實現。
(3)切點(Pointcut):切點用于定義 要對哪些Join point進行攔截。
切點分為execution方式和annotation方式。execution方式可以用路徑表達式指定對哪些方法攔截,比如指定攔截add*、search*。annotation方式可以指定被哪些注解修飾的代碼進行攔截。
(4)通知(Advice):指要在連接點(Join Point)上執行的動作,即增強的邏輯,比如權限校驗和、日志記錄等。通知有各種類型,包括Around、Before、After、After returning、After throwing。
(5)目標對象(Target):包含連接點的對象,也稱作被通知(Advice)的對象。 由于Spring AOP是通過動態代理實現的,所以這個對象永遠是一個代理對象。
(6)織入(Weaving):通過動態代理,在目標對象(Target)的方法(即連接點Join point)中執行增強邏輯(Advice)的過程。
(7)引入(Introduction):添加額外的方法或者字段到被通知的類。Spring允許引入新的接口(以及對應的實現)到任何被代理的對象。例如,你可以使用一個引入來使bean實現 IsModified 接口,以便簡化緩存機制。
幾個概念的關系圖可以參考下圖:
面試題六:Spring容器的啟動流程?
(1)初始化Spring容器,注冊內置的BeanPostProcessor的BeanDefinition到容器中。
(2)將配置類的BeanDefinition注冊到容器中。
(3)調用refresh()方法刷新容器。
面試題七:Spring Bean的生命周期?
實例化 Instantiation?--> 屬性賦值 Populate? -->?初始化 Initialization? --> 銷毀 Destruction
面試題八:說一下Spring中bean的作用域?
(1)singleton:默認作用域,單例bean,每個容器中只有一個bean的實例。
(2)prototype:為每一個bean請求創建一個實例。
(3)request:為每一個request請求創建一個實例,在請求完成以后,bean會失效并被垃圾回收器回收。
(4)session:與request范圍類似,同一個session會話共享一個實例,不同會話使用不同的實例。
(5)global-session:全局作用域,所有會話共享一個實例。如果想要聲明讓所有會話共享的存儲變量的話,那么這全局變量需要存儲在global-session中。
面試題九:說一下Spring基于xml注入bean的幾種方式?
set()方法注入;
構造器注入:①通過index設置參數的位置;②通過type設置參數類型;
靜態工廠注入;
實例工廠;
面試題十:Spring如何解決循環依賴問題?
循環依賴問題在Spring中主要有三種情況:
(1)通過構造方法進行依賴注入時產生的循環依賴問題。
(2)通過setter方法進行依賴注入且是在多例(原型)模式下產生的循環依賴問題。
(3)通過setter方法進行依賴注入且是在單例模式下產生的循環依賴問題。
在Spring中,只有第(3)種方式的循環依賴問題被解決了,其他兩種方式在遇到循環依賴問題時都會產生異常。這是因為:
第一種構造方法注入的情況下,在new對象的時候就會堵塞住了,其實也就是”先有雞還是先有蛋“的歷史難題。
第二種setter方法(多例)的情況下,每一次getBean()時,都會產生一個新的Bean,如此反復下去就會有無窮無盡的Bean產生了,最終就會導致OOM問題的出現。
Spring在單例模式下的setter方法依賴注入引起的循環依賴問題,主要是通過二級緩存和三級緩存來解決的,其中三級緩存是主要功臣。解決的核心原理就是:在對象實例化之后,依賴注入之前,Spring提前暴露的Bean實例的引用在第三級緩存中進行存儲。
面試題十一:談一下Spring的自動裝配?
在spring中,使用autowire來配置自動裝載模式,對象無需自己查找或創建與其關聯的其他對象,由容器負責把需要相互協作的對象引用賦予各個對象。
(1)在Spring框架xml配置中共有5種自動裝配:
no:默認的方式是不進行自動裝配的,通過手工設置ref屬性來進行裝配bean。
byName:通過bean的名稱進行自動裝配,如果一個bean的 property 與另一bean 的name 相同,就進行自動裝配。
byType:通過參數的數據類型進行自動裝配。
constructor:利用構造函數進行裝配,并且構造函數的參數通過byType進行裝配。
autodetect:自動探測,如果有構造方法,通過 construct的方式自動裝配,否則使用 byType的方式自動裝配。
(2)基于注解的自動裝配方式:
使用@Autowired、@Resource注解來自動裝配指定的bean。
在使用@Autowired注解之前需要在Spring配置文件進行配置。
在啟動spring IoC時,容器自動裝載了一個AutowiredAnnotationBeanPostProcessor后置處理器,當容器掃描到@Autowied、@Resource或@Inject時,就會在IoC容器自動查找需要的bean,并裝配給該對象的屬性。
在使用@Autowired時,首先在容器中查詢對應類型的bean:
如果查詢結果剛好為一個,就將該bean裝配給@Autowired指定的數據;
如果查詢的結果不止一個,那么@Autowired會根據名稱來查找;
如果上述查找的結果為空,那么會拋出異常。解決方法時,使用required=false。
@Autowired可用于:構造函數、成員變量、Setter方法
注:@Autowired和@Resource之間的區別:
(1) @Autowired默認是按照類型裝配注入的,默認情況下它要求依賴對象必須存在(可以設置它required屬性為false)。
(2) @Resource默認是按照名稱來裝配注入的,只有當找不到與名稱匹配的bean才會按照類型來裝配注入。
面試題十二:Spring框架中都用到了哪些設計模式?
(1)工廠模式:Spring使用工廠模式,通過BeanFactory和ApplicationContext來創建對象
(2)單例模式:Bean默認為單例模式
(3)策略模式:例如Resource的實現類,針對不同的資源文件,實現了不同方式的資源獲取策略
(4)代理模式:Spring的AOP功能用到了JDK的動態代理和CGLIB字節碼生成技術
(5)模板方法:可以將相同部分的代碼放在父類中,而將不同的代碼放入不同的子類中,用來解決代碼重復的問題。比如RestTemplate, JmsTemplate, JpaTemplate
(6)適配器模式:Spring AOP的增強或通知(Advice)使用到了適配器模式,Spring MVC中也是用到了適配器模式適配Controller
(7)觀察者模式:Spring事件驅動模型就是觀察者模式的一個經典應用。
(8)橋接模式:可以根據客戶的需求能夠動態切換不同的數據源。比如我們的項目需要連接多個數據庫,客戶在每次訪問中根據需要會去訪問不同的數據庫。
面試題十三:Spring框架中有哪些不同類型的事件?
Spring 提供了以下5種標準的事件:
(1)上下文更新事件(ContextRefreshedEvent):在調用ConfigurableApplicationContext 接口中的refresh()方法時被觸發。
(2)上下文開始事件(ContextStartedEvent):當容器調用ConfigurableApplicationContext的Start()方法開始/重新開始容器時觸發該事件。
(3)上下文停止事件(ContextStoppedEvent):當容器調用ConfigurableApplicationContext的Stop()方法停止容器時觸發該事件。
(4)上下文關閉事件(ContextClosedEvent):當ApplicationContext被關閉時觸發該事件。容器被關閉時,其管理的所有單例Bean都被銷毀。
(5)請求處理事件(RequestHandledEvent):在Web應用中,當一個http請求(request)結束觸發該事件。
如果一個bean實現了ApplicationListener接口,當一個ApplicationEvent 被發布以后,bean會自動被通知。
Spring 容器
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。