Spring常見面試題(13個面試題,回答超詳細)

      網友投稿 942 2025-04-04

      馬上開春了面試前必備技能啊,就算不背下來也得知道一些。免得尷尬。

      目錄

      面試題一: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

      Spring常見面試題(13個面試題,回答超詳細)

      (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小時內刪除侵權內容。

      上一篇:wps表格怎樣合并計算(WPS表格合并計算)
      下一篇:HP8720D 20G網絡分析儀
      相關文章
      亚洲高清在线视频| 久久精品国产亚洲AV无码娇色| 亚洲熟妇av一区二区三区下载 | 少妇中文字幕乱码亚洲影视| 亚洲va中文字幕无码久久 | 国产成人A亚洲精V品无码 | 中日韩亚洲人成无码网站| 亚洲伊人久久大香线焦| 亚洲一卡二卡三卡| 在线综合亚洲中文精品| 亚洲色精品三区二区一区| 亚洲乱码av中文一区二区| 亚洲七久久之综合七久久| 亚洲欧美不卡高清在线| 亚洲youwu永久无码精品| 亚洲JLZZJLZZ少妇| 一本久到久久亚洲综合| 亚洲裸男gv网站| 亚洲午夜久久久久妓女影院| 亚洲精品乱码久久久久久自慰| 亚洲精品V欧洲精品V日韩精品| 国产成A人亚洲精V品无码性色 | 亚洲情a成黄在线观看动漫尤物| 91亚洲va在线天线va天堂va国产| 亚洲美女精品视频| 激情综合亚洲色婷婷五月| 亚洲中文字幕久久精品无码A| 亚洲乱妇熟女爽到高潮的片| 精品国产_亚洲人成在线| 亚洲国产精品尤物yw在线| 亚洲精品乱码久久久久久中文字幕 | 亚洲avav天堂av在线网爱情| 亚洲砖码砖专无区2023| 精品亚洲国产成人av| 亚洲精品久久久www| 在线A亚洲老鸭窝天堂| 亚洲国产一区在线| 亚洲va精品中文字幕| 亚洲AV永久无码精品一福利| 精品国产人成亚洲区| 亚洲AV无码精品色午夜果冻不卡 |