Spring面試題記錄?

請簡述 Spring 框架的核心是什么?它主要包含了哪些核心模塊?

spring的核心模塊主要有spring-core(工具類,資源加載),spring-bean(bean的定義,創建,封裝),spring-context。這幾個模塊就形成了spring的核心概念,容器化,控制反轉,依賴注入。所謂容器化就是spring會在啟動初始化根據一些策略比如web或者webflux去生產一個子類上下文,然后在初始化的過程中,填充容器工廠,bean通過控制反轉的概率將自己定義交給容器中的bean工廠進行創建填充,然后通過依賴注入到其他需要目標bean的bean實例。
spring還提供了一個很重要的模塊spring-aop+spring-aspects,通過jdk或者cglib反射生成bean的代理對象,創建AOP鏈,不僅解決了循環依賴,還為bean功能提供了無侵入增強。

Spring Boot 的主要目標是解決什么問題?它是通過哪些核心特性來實現這一目標的?

1.配置簡易化:spring提供了yml配置,以及@SpringApplicationRun組合注解的自動配置,避免大量配置文件。
2.部署簡易化:springboot里面內嵌了一些容器,比如tomcat,不需要額外部署單獨的。
3.依賴簡易化:集成了maven或gradle工具,通過依賴樹解決依賴沖突。
4.開發簡易化:通過springboot實現的自動配置注解和鉤子函數,開發者可以通過spring.factories去實現自己的配置以及鉤子。

自定義一個spring-starter中使用@Configuration的配置類,讓其被spring掃描識別到有幾種方式

1.spring.factories中的org.springframework.boot.autoconfigure.EnableAutoConfiguration=\添加自己的配置。
2.spring新版本創建META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports,添加自己的配置
3.自定義@EnableYourStarter,@EnableYourStarter上添加@Import(YourAutoConfiguration.class),引入該starter的業務啟動方法添加該注解,會自動注入import的類為bean。

請描述 Spring MVC 處理一個 HTTP 請求的核心工作流程

首先瀏覽器發送一個http請求,這個時候會先到springmvc的 Dispatcherservlet, Dispatcherservlet會調用handleMapping來解析該http請求所映射的handleMethod鏈,handleMethod鏈調用適配器執行contorller,執行業務完成后,如果業務添加了@ReponseBody會返回json格式數據,如果沒有就會返回modleAndView給Dispatcherservlet,Dispatcherservlet會將其交給視圖解析器,解析完后返回給瀏覽器。

Spring Framework 中的 Bean 作用域(Scope)有哪幾種?請簡要說明它們之間的區別。

有以下幾種,單例,原型,請求,會話,應用。單例主要是bean就是以單例模式創建的,所有獲取該bean的都是一個實例。原型就是每次都新建一個bean使用,不復用。請求主要是一次請求下會有一個實例bean,在請求生命周期結束死亡。會話是一次會話有一個實例bean,會話結束bean死亡。應用主要是一個應用上下文中有一個實例bean,應用生命周期結束死亡。

在 Spring Boot 中,@SpringBootApplication 注解是一個組合注解,它主要由哪三個核心注解組成?并請簡要說明每個注解的作用。

@SpringbootConfiguration:@Configuration的別名,這個注解作用就是將該類標為配置類,保證內部@bean被容器解析。
@EnableAutoConfiguration:該注解是啟用自動配置,將spring-starter中的通過spring.factories注冊的配置條件化裝配進來。
@ComponetScan:默認掃描當前包和子包所有的@Componet注解以及其派生注解,實現業務的業務bean自動掃描注入。

Spring 框架中,什么是事務傳播行為(Transaction Propagation)?請列舉并簡要說明 PROPAGATION_REQUIRED 和 PROPAGATION_REQUIRES_NEW 這兩種常見傳播行為的區別。

事務傳播行為主要是兩個方法都有事務的情況下的調用中事務的策略,因為聲明式事務時AOP實現的,所有調用都要基于代理對象進行,如果是required,就會繼承老的事務,如果是requires_new被調用方的事務AOP會新建一個事務進行處理。特別注意的是,如果是分布式seata事務,是不推薦spring原生的事務注解的,如果需要使用也是使用required傳播級別,因為seata分布式事務也是基于AOP實現的,只是優先級比spring事務低,將其包住了,如果用了requires_new的級別,會導致新建一個事務上下文,導致事務懸掛,該事務會新建一個seata事務分支,該新事務會單獨提交,全局事務回滾的時候需要補償。

Spring MVC 中的 @RestController 注解和 @Controller 和@RequstMapping注解有什么區別?

@RestController 時@ReponseBody和@Controller的組合,直接單獨說明作用。@ReponseBody的作用是將告訴dispatherServlet跳過視圖解析器,將返回值直接序列化返回給瀏覽器,而@Controller注解默認需要走視圖解析,同時因為@Controller是@Componet的派生注解,自身也會注冊成一個bean。@RequstMapping及其派生注解主要是提供給handleMapping注冊成HandleMethod,對外暴露接口。

請解釋 Spring 框架中 Bean 的生命周期。簡要描述從創建到銷毀的過程中,有哪些重要的擴展點(例如,你可以通過哪些方式介入這個過程)。

1.首先是bean定義的創建,創建填充好定義后,觸發beanpostprocesser前置鉤子,然后進入創建流程,該流程會首先創建初始bean,判斷是否有循環依賴。
2.如果有循環依賴,需要將依賴bean的早期引用進入三級緩存,當前依賴bean注入時候創建依賴bean放入二級緩存方便當前bean注入,如果沒有循環依賴就進入bean的填充環節,填充屬性后,這里有可能是代理也有可能是原始對象。
3.屬性填充完成后,立即觸發aware函數調用將spring系統的引用拿給bean,方便bean使用容器內部東西。
4.觸發initializingbean鉤子函數進行bean處理。
5.執行beanpostprocesser后置鉤子,這里執行如果有事務注解或者AOP注解的話,需要執行AOP鏈,判斷當前是否有代理對象,如果沒有,就添加,有就復用,增強事務能力或者切面能力。
6.鉤子走完生成成品bean后,然后從三級緩存/二級緩存移除,將成品bean放入一級緩存開始使用,根據bean的作用域消亡。

請詳細解釋 Spring 是如何利用三級緩存來解決單例 Bean 的循環依賴問題的。

三級緩存存放創建bean的function,二級緩存放入早期引用,一級緩存放成品。首先將當前bean的早期引用放入三級緩存,發現有循環依賴,在三級緩存放入依賴bean的工廠function,在當前bean需要注入依賴bean的時候,從三級緩存找到依賴bean的function執行創建一個初始bean放入二級緩存,然后依賴bean進行初始化,在三級緩存找到當前bean工廠,依賴bean注入填充初始完畢從二級緩存移除到一級緩存,然后當前bean注入依賴bean,這個時候直接從一級緩存找到成品依賴bean,當前bean直接注入依賴bean并且初始化自己,就解決了循環依賴。

請詳細說明 Spring 框架中的 BeanFactory 和 ApplicationContext 的區別。以及,在現代 Spring 應用中,我們幾乎總是使用 ApplicationContext,這是為什么?

ApplicationContext來源于spring-context是IOC容器在spring的表現形式;而beanFactory來源于spring-bean,只是一個bean工廠,負責bean的管理。ApplicationContext里面包括一個beanfactory實例,實現了解耦,同時它可以拿到bean工廠完成對bean的一些前后置鉤子,以及通過aware將IOC給到bean使用。
只使用ApplicationContext的原因主要在于,ApplicationContext才是spring對外給開發者暴露的容器,其中暴露的一些接口已經可以使用ApplicationContext的bean工廠能力了,相當于采用了外觀模式,ApplicationContext有beanfactory的所有功能,并且除此之外還有額外拓展。

Spring 框架中,有哪些方式可以把一個類聲明為一個 Bean?(即 Bean 的裝配方式有哪幾種?)

@Controller,@Service,@Componet,@Bean,@Configuration,其中@Controller,@Service,@Componet這種寫在業務子文件夾里面可以被spring直接掃描,@Configuration可以搭配@Bean,讓bean被發現。以及直接使用spring.factories利用spring的鉤子注冊bean.

Spring AOP 和 AspectJ 有什么區別?Spring AOP 是基于哪種方式實現的?它在什么情況下會選擇使用 JDK 動態代理,什么情況下會選擇 CGLIB?

spring aop是基于動態代理做的切面增強。而AspectJ是使用字節碼增強的能力去增強功能,增強的jar屬于另一個服務。如果是接口代理就會選擇jdk動態代理,如果是類代理就是CGLIB代理

Spring 框架中,聲明式事務管理(@Transactional)的工作原理是什么?請詳細說明它是如何通過 AOP 和代理機制實現的,以及在什么情況下會失效。

spring的聲明式事務是基于AOP做的,他在AOP的前置切面建立事務,在AOP的后置切面提交事務。如果你不通過代理對象去調用相關服務,AOP就會失效,比如直接this或者直接調用方法,這種就會調用原始對象。還有就是不符合AOP切面生成的,比如方法聲明非public,這種就無法生成切面,事務也會失效。

Spring Framework 中如何管理多數據源的事務?在一個需要同時操作兩個不同數據庫的業務方法上,如何使用 Spring 事務保證數據一致性?請描述實現思路和需要注意的關鍵問題。

spring framework有所有數據源的事務管理器,如果需要跨數據源做事務有多種方式,1:使用編程式事務,在A,B兩個數據源都成功的時候進行提交,如果其中一個提交成功,另一個失敗,進行補償處理。2.使用seata分布式事務AT或者TCC模式控制,使用AT模式結合本地事務添加注解自動處理事務,使用TCC模式通過三段式來保障事務一致性。3.不使用事務直接控制,直接通過補償的方式寫事務表,然后補償任務。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/98690.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/98690.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/98690.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

一次緩存引發的文件系統數據不一致問題排查與深度解析

01 起因EFC(Elastic File Client)是 NAS 自研的分布式文件系統客戶端,最近完成了對緩存架構的更新,現在支持多個客戶端之間構成分布式緩存,底層支持 NAS、CPFS 和 OSS。由于開發時間較短,一直沒有做 NAS 場…

Spring Boot Gateway 教程:從入門到精通

一、Spring Cloud Gateway 簡介Spring Cloud Gateway 是基于 Spring 5、Project Reactor 和 Spring Boot 2 構建的 API 網關,旨在為微服務架構提供一種簡單而有效的路由管理方式。它取代了 Netflix Zuul,提供了更高效和更強大的網關解決方案。核心特點&a…

防火墻 只允許信任的幾臺服務器訪問

1. 首先,確保 firewalld 服務正在運行:systemctl start firewalld systemctl enable firewall2. 設置默認拒絕規則:設置默認拒絕所有流量(拒絕所有的入站流量):firewall-cmd --zonepublic --add-rejectal…

十三,數據結構-樹

定義樹也是基于節點的數據結構,和鏈表不同的是,樹的節點可以指向多個節點。首先對樹的一些常用術語進行說明:最上面的節點叫做根節點,根位于樹頂,如圖中的節點A;和族譜一樣,節點有后代和祖先&am…

JVM-默背版

1.JVM對sychronized的優化:鎖膨脹、鎖消除、鎖粗化、自適應自旋鎖 (1)鎖膨脹:從無鎖、偏向鎖、輕量級鎖、重量級鎖的過程叫做鎖膨脹。在JDK1.6以前,sychronized是由重量級鎖實現的,加鎖和解鎖的過程需要從用…

Mac M 系列芯片 YOLOv8 部署教程(CPU/Metal 后端一鍵安裝)

在 Mac M 系列芯片(Apple Silicon/ARM 架構)上部署 YOLOv8,有一些注意事項:PyTorch 需要安裝 ARM 原生版本,推理可利用 Metal 后端加速 CPU。本文教你一步步完成環境配置、模型下載、依賴安裝和驗證推理。1?? 環境準…

Python爬蟲實戰:研究Units模塊,構建氣象數據采集和分析系統

1. 引言 1.1 研究背景 隨著信息技術的飛速發展,互聯網已成為全球最大的信息庫,涵蓋氣象、金融、醫療、農業等多個領域的海量數據。這些數據蘊含著巨大的潛在價值,如何有效獲取并深入分析這些數據成為當下研究的熱點。Python 作為一種功能強大的編程語言,憑借其豐富的庫資…

網頁設計模板 HTML源碼網站模板下載

互聯網已成為現代社會不可或缺的一部分,網站則是連接線上與線下世界的橋梁。無論是用于展示個人作品集、推廣商業產品還是提供公共服務信息,一個設計精良且功能完善的網站都能發揮巨大作用。然而,傳統的手工編碼方式不僅耗時費力,…

Flink KeyedProcessFunction為什么能為每個key定義State和Timer?

問題描述 一個常見的開窗邏輯(12H 或者 500條): import org.apache.flink.api.common.state.ValueState; import org.apache.flink.api.common.state.ValueStateDescriptor; import org.apache.flink.api.common.typeinfo.Types; import or…

【C++】模版初階---函數模版、類模版

🌟個人主頁:第七序章 🌈專欄系列:C++ 目錄 ??前言: 🌈1.泛型編程: 🌈2.函數模板 🍭2.1函數模板概念 🍭2.2函數模板格式 &am…

查找算法(Java)

目錄 一.定義 二.分類 三.線性查找 原理: 思路分析 代碼實現 例題實踐 1.兩數之和 方法一:暴力窮舉法 思路分析 代碼實現 方法二:創建哈希表 思路分析 代碼實現 2.移動零 思路分析 代碼實現 四.二分查找 原理: …

計算機網絡--四層模型,IP地址和MAC地址

四層模型:分別是應用層,傳輸層,網絡層和鏈路層。應用層:提供了應用程序之間相互通信的接口,允許用戶訪問網絡服務。這一層定義了應用程序如何與底層網絡進行交互。例如HTTP協議。傳輸層:它處理數據的分段、…

解析、創建Excel文件的開源庫OpenXLSX介紹

OpenXLSX是一個C庫,用于讀取、寫入、創建和修改.xlsx格式的Microsoft Excel文件,源碼地址:https://github.com/troldal/OpenXLSX ,License為BSD-3-Clause,可在Windows、Linux、MaCOS平臺上使用。最新發布版本為v0.3.2&…

【C++】C++11 篇二

【C】C11 篇二前言移動構造函數移動賦值運算符重載類成員變量初始化 (缺省值出自C11強制生成默認函數的關鍵字default:禁止生成默認函數的關鍵字delete:繼承和多態中的final與override關鍵字(出自C11可變參數模板遞歸函數方式展開參數包逗號表達式展開參…

構建Python環境的幾種工具

本文主要介紹如何構建Python環境來處理不同的工作。 1.常用的構建Python環境的工具 ①venv(內置模塊):Python 3.3 內置標準庫模塊,無需額外安裝。 ②virtualenv:venv的前身,功能更強大且支持舊版Python。 ③conda:來自 Anaconda 或 Miniconda。不僅能…

c#項目編譯時外部依賴文件的同步問題

很多場景因為資源文件太多或太大無法放到資源里面或者是依賴的dll文件,需要編譯時同步到bin\debug或bin\release下的,這里面要修改工程文件代碼實現。 比如,我把這個項目依賴的dll和附加文件放到ref_dll文件夾里面,希望編譯的時候…

數學建模常用算法-模擬退火算法

一、模擬退火算法模擬退火的靈感來源于物理中的 “退火過程”—— 將金屬加熱到高溫后,緩慢冷卻,金屬原子會在熱能作用下自由運動,逐漸形成能量最低的穩定結構。算法將這一過程抽象為數學模型:“溫度 T”:對應物理中的…

架構很簡單:業務架構圖

緣起業務架構是一個復雜的體系,如何更簡單的表達,并能使用起來呢?所謂:大道至簡。基于此,這篇文章就開始了。業務是一切架構的開始,如果沒有業務,架構又有什么作用呢?所以做架構首先…

【前端埋點】純前端實現 A/B Test

“純前端實現 A/B Test”,意思就是 沒有后端分流、也不依賴流量網關,那么只能靠前端邏輯來做“流量切分”。 🎯 目標 80% 的用戶 → A 頁面20% 的用戶 → B 頁面且要保證 同一個用戶每次訪問結果一致(否則用戶刷新頁面時 A/B 會跳…

Day22_【機器學習—集成學習(3)—Boosting—Adaboost算法】

Adaptive Boosting(自適應提升)是基于 Boosting思想實現的一種集成學習算法,核心思想是通過逐步提高那些被前一步分類錯誤的樣本的權重來訓練一個強分類器。一、Adaboost算法直線相當于一個弱學習器,正確的數據權重減小,錯誤的數據權重增加二…