Spring相關面試題

csdntup

👏作者簡介:大家好,我是愛寫博客的嗯哼,愛好Java的小菜鳥
🔥如果感覺博主的文章還不錯的話,請👍三連支持👍一下博主哦
📝個人博客:敬請期待
📕系列專欄:面試寶典

  • 本文引自黑馬程序員Java面試寶典

文章目錄

      • 面試官:Spring框架中的單例bean是線程安全的嗎?
      • 面試官:什么是AOP
      • 面試官:你們項目中有沒有使用到AOP
      • 面試官:Spring中的事務是如何實現的
      • 面試官:Spring中事務失效的場景有哪些
      • 面試官:Spring的bean的生命周期
      • 面試官:Spring中的循環引用
      • 面試官:那具體解決流程清楚嗎?
      • 面試官:構造方法出現了循環依賴怎么解決?
      • 面試官:SpringMVC的執行流程知道嘛
      • 面試官:Springboot自動配置原理
      • 面試官:Spring 的常見注解有哪些?
      • 面試官:SpringMVC常見的注解有哪些?
      • 面試官:Springboot常見注解有哪些?
      • 面試官:MyBatis執行流程
      • 面試官:Mybatis是否支持延遲加載?
      • 面試官:延遲加載的底層原理知道嗎?
      • 面試官:Mybatis的一級、二級緩存用過嗎?
      • 面試官:Mybatis的二級緩存什么時候會清理緩存中的數據

面試官:Spring框架中的單例bean是線程安全的嗎?

候選人
嗯!

不是線程安全的,是這樣的

當多用戶同時請求一個服務時,容器會給每一個請求分配一個線程,這是多個線程會并發執行該請求對應的業務邏輯(成員方法),如果該處理邏輯中有對該單列狀態的修改(體現為該單例的成員屬性),則必須考慮線程同步問題。

Spring框架并沒有對單例bean進行任何多線程的封裝處理。關于單例bean的線程安全和并發問題需要開發者自行去搞定。

比如:我們通常在項目中使用的Spring bean都是不可可變的狀態(比如Service類和DAO類),所以在某種程度上說Spring的單例bean是線程安全的。

如果你的bean有多種狀態的話(比如 View Model對象),就需要自行保證線程安全。最淺顯的解決辦法就是將多態bean的作用由“singleton”變更為“prototype”。

面試官:什么是AOP

候選人

aop是面向切面編程,在spring中用于將那些與業務無關,但卻對多個對象產生影響的公共行為和邏輯,抽取公共模塊復用,降低耦合,一般比如可以做為公共日志保存,事務處理等

面試官:你們項目中有沒有使用到AOP

候選人

我們當時在后臺管理系統中,就是使用aop來記錄了系統的操作日志

主要思路是這樣的,使用aop中的環繞通知+切點表達式,這個表達式就是要找到要記錄日志的方法,然后通過環繞通知的參數獲取請求方法的參數,比如類信息、方法信息、注解、請求方式等,獲取到這些參數以后,保存到數據庫

面試官:Spring中的事務是如何實現的

候選人

spring實現的事務本質就是aop完成,對方法前后進行攔截,在執行方法之前開啟事務,在執行完目標方法之后根據執行情況提交或者回滾事務。

面試官:Spring中事務失效的場景有哪些

候選人

嗯!這個在項目中之前遇到過,我想想啊

第一個,如果方法上異常捕獲處理,自己處理了異常,沒有拋出,就會導致事務失效,所以一般處理了異常以后,別忘了跑出去就行了

第二個,如果方法拋出檢查異常,如果報錯也會導致事務失效,最后在spring事務的注解上,就是@Transactional上配置rollbackFor屬性為Exception,這樣別管是什么異常,都會回滾事務

第三,我之前還遇到過一個,如果方法上不是public修飾的,也會導致事務失效

嗯,就能想起來那么多

面試官:Spring的bean的生命周期

候選人

嗯!,這個步驟還是挺多的,我之前看過一些源碼,它大概流程是這樣的

首先會通過一個非常重要的類,叫做BeanDefinition獲取bean的定義信息,這里面就封裝了bean的所有信息,比如,類的全路徑,是否是延遲加載,是否是單例等等這些信息

在創建bean的時候,第一步是調用構造函數實例化bean

第二步是bean的依賴注入,比如一些set方法注入,像平時開發用的@Autowire都是這一步完成

第三步是處理Aware接口,如果某一個bean實現了Aware接口就會重寫方法執行

第四步是bean的后置處理器BeanPostProcessor,這個是前置處理器

第五步是初始化方法,比如實現了接口InitializingBean或者自定義了方法init-method標簽或@PostContruct

第六步是執行了bean的后置處理器BeanPostProcessor,主要是對bean進行增強,有可能在這里產生代理對象

最后一步是銷毀bean

面試官:Spring中的循環引用

候選人

嗯,好的,我來解釋一下

循環依賴:循環依賴其實就是循環引用,也就是兩個或兩個以上的bean互相持有對方,最終形成閉環。比如A依賴于B,B依賴于A

循環依賴在spring中是允許存在,spring框架依據三級緩存已經解決了大部分的循環依賴

①一級緩存:單例池,緩存已經經歷了完整的生命周期,已經初始化完成的bean對象

②二級緩存:緩存早期的bean對象(生命周期還沒走完)

③三級緩存:緩存的是ObjectFactory,表示對象工廠,用來創建某個對象的

面試官:那具體解決流程清楚嗎?

候選人

第一,先實例A對象,同時會創建ObjectFactory對象存入三級緩存singletonFactories

第二,A在初始化的時候需要B對象,這個走B的創建的邏輯

第三,B實例化完成,也會創建ObjectFactory對象存入三級緩存singletonFactories

第四,B需要注入A,通過三級緩存中獲取ObjectFactory來生成一個A的對象同時存入二級緩存,這個是有兩種情況,一個是可能是A的普通對象,另外一個是A的代理對象,都可以讓ObjectFactory來生產對應的對象,這也是三級緩存的關鍵

第五,B通過從通過二級緩存earlySingletonObjects 獲得到A的對象后可以正常注入,B創建成功,存入一級緩存singletonObjects

第六,回到A對象初始化,因為B對象已經創建完成,則可以直接注入B,A創建成功存入一次緩存singletonObjects

第七,二級緩存中的臨時對象A清除

面試官:構造方法出現了循環依賴怎么解決?

候選人

由于bean的生命周期中構造函數是第一個執行的,spring框架并不能解決構造函數的的依賴注入,可以使用@Lazy懶加載,什么時候需要對象再進行bean對象的創建

面試官:SpringMVC的執行流程知道嘛

候選人

嗯,這個知道的,它分了好多步驟

1、用戶發送出請求到前端控制器DispatcherServlet,這是一個調度中心

2、DispatcherServlet收到請求調用HandlerMapping(處理器映射器)。

3、HandlerMapping找到具體的處理器(可查找xml配置或注解配置),生成處理器對象及處理器攔截器(如果有),再一起返回給DispatcherServlet。

4、DispatcherServlet調用HandlerAdapter(處理器適配器)。

5、HandlerAdapter經過適配調用具體的處理器(Handler/Controller)。

6、Controller執行完成返回ModelAndView對象。

7、HandlerAdapter將Controller執行結果ModelAndView返回給DispatcherServlet。

8、DispatcherServlet將ModelAndView傳給ViewReslover(視圖解析器)。

9、ViewReslover解析后返回具體View(視圖)。

10、DispatcherServlet根據View進行渲染視圖(即將模型數據填充至視圖中)。

11、DispatcherServlet響應用戶。

當然現在的開發,基本都是前后端分離的開發的,并沒有視圖這些,一般都是handler中使用Response直接結果返回

面試官:Springboot自動配置原理

候選人

嗯,好的,它是這樣的。

在Spring Boot項目中的引導類上有一個注解@SpringBootApplication,這個注解是對三個注解進行了封裝,分別是:

  • @SpringBootConfiguration

  • @EnableAutoConfiguration

  • @ComponentScan

其中@EnableAutoConfiguration是實現自動化配置的核心注解。

該注解通過@Import注解導入對應的配置選擇器。關鍵的是內部就是讀取了該項目和該項目引用的Jar包的的classpath路徑下META-INF/spring.factories文件中的所配置的類的全類名。

在這些配置類中所定義的Bean會根據條件注解所指定的條件來決定是否需要將其導入到Spring容器中。

一般條件判斷會有像@ConditionalOnClass這樣的注解,判斷是否有對應的class文件,如果有則加載該類,把這個配置類的所有的Bean放入spring容器中使用。

面試官:Spring 的常見注解有哪些?

候選人

嗯,這個就很多了

第一類是:聲明bean,有@Component、@Service、@Repository、@Controller

第二類是:依賴注入相關的,有@Autowired、@Qualifier、@Resourse

第三類是:設置作用域 @Scope

第四類是:spring配置相關的,比如@Configuration,@ComponentScan 和 @Bean

第五類是:跟aop相關做增強的注解 @Aspect,@Before,@After,@Around,@Pointcut

面試官:SpringMVC常見的注解有哪些?

候選人

嗯,這個也很多的

有@RequestMapping:用于映射請求路徑;

@RequestBody:注解實現接收http請求的json數據,將json轉換為java對象;

@RequestParam:指定請求參數的名稱;

@PathViriable:從請求路徑下中獲取請求參數(/user/{id}),傳遞給方法的形式參數;@ResponseBody:注解實現將controller方法返回對象轉化為json對象響應給客戶端。@RequestHeader:獲取指定的請求頭數據,還有像@PostMapping、@GetMapping這些。

面試官:Springboot常見注解有哪些?

候選人

嗯~~

Spring Boot的核心注解是@SpringBootApplication , 他由幾個注解組成 :

  • @SpringBootConfiguration: 組合了- @Configuration注解,實現配置文件的功能;
  • @EnableAutoConfiguration:打開自動配置的功能,也可以關閉某個自動配置的選項
  • @ComponentScan:Spring組件掃描

面試官:MyBatis執行流程

候選人

好,這個知道的,不過步驟也很多

①讀取MyBatis配置文件:mybatis-config.xml加載運行環境和映射文件

②構造會話工廠SqlSessionFactory,一個項目只需要一個,單例的,一般由spring進行管理

③會話工廠創建SqlSession對象,這里面就含了執行SQL語句的所有方法

④操作數據庫的接口,Executor執行器,同時負責查詢緩存的維護

⑤Executor接口的執行方法中有一個MappedStatement類型的參數,封裝了映射信息

⑥輸入參數映射

⑦輸出結果映射

面試官:Mybatis是否支持延遲加載?

候選人

是支持的~

延遲加載的意思是:就是在需要用到數據時才進行加載,不需要用到數據時就不加載數據。

Mybatis支持一對一關聯對象和一對多關聯集合對象的延遲加載

在Mybatis配置文件中,可以配置是否啟用延遲加載lazyLoadingEnabled=true|false,默認是關閉的

面試官:延遲加載的底層原理知道嗎?

候選人

嗯,我想想啊

延遲加載在底層主要使用的CGLIB動態代理完成的

第一是,使用CGLIB創建目標對象的代理對象,這里的目標對象就是開啟了延遲加載的mapper

第二個是當調用目標方法時,進入攔截器invoke方法,發現目標方法是null值,再執行sql查詢

第三個是獲取數據以后,調用set方法設置屬性值,再繼續查詢目標方法,就有值了

面試官:Mybatis的一級、二級緩存用過嗎?

候選人

嗯~~,用過的~

mybatis的一級緩存: 基于 PerpetualCache 的 HashMap 本地緩存,其存儲作用域為 Session,當Session進行flush或close之后,該Session中的所有Cache就將清空,默認打開一級緩存

關于二級緩存需要單獨開啟

二級緩存是基于namespace和mapper的作用域起作用的,不是依賴于SQL session,默認也是采用 PerpetualCache,HashMap 存儲。

如果想要開啟二級緩存需要在全局配置文件和映射文件中開啟配置才行。

面試官:Mybatis的二級緩存什么時候會清理緩存中的數據

候選人

嗯!!

當某一個作用域(一級緩存 Session/二級緩存Namespaces)的進行了新增、修改、刪除操作后,默認該作用域下所有 select 中的緩存將被 clear。

往期文章推薦

  • Mysql相關面試題
  • 趣聊WebSocket
  • 關于redis的讀寫一致問題
  • springsecurity加入第三方授權認證
  • Java連接mysql常遇時間問題

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

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

相關文章

時序預測 | MATLAB實現EEMD-GRU、GRU集合經驗模態分解結合門控循環單元時間序列預測對比

時序預測 | MATLAB實現EEMD-GRU、GRU集合經驗模態分解結合門控循環單元時間序列預測對比 目錄 時序預測 | MATLAB實現EEMD-GRU、GRU集合經驗模態分解結合門控循環單元時間序列預測對比效果一覽基本介紹模型搭建程序設計參考資料 效果一覽 基本介紹 1.MATLAB實現EEMD-GRU、GRU時…

springcloud+nacos實現灰度發布

灰度發布 gateway網關實現灰度路由 灰度發布實體 package com.scm.boss.common.bean;import lombok.Data; import lombok.experimental.Accessors;import java.io.Serializable;/*** 灰度發布實體*/ Data Accessors(chain true) public class GrayBean implements Serializ…

【Linux】—— 進程程序替換

目錄 序言 (一)替換原理 1、進程角度——見見豬跑 1?? 認識 execl 函數 2、程序角度——看圖理解 (二)替換函數 1、命名理解 2、函數理解 1??execlp 2??execv 3??execvp 4??execle 5??execve 6??execve…

機器學習重要內容:特征工程之特征抽取

目錄 1、簡介 2、?為什么需要特征工程 3、特征抽取 3.1、簡介 3.2、特征提取主要內容 3.3、字典特征提取 3.4、"one-hot"編碼 3.5、文本特征提取 3.5.1、英文文本 3.5.2、結巴分詞 3.5.3、中文文本 3.5.4、Tf-idf ?所屬專欄:人工智能 文中提…

LLaMA長度外推高性價比trick:線性插值法及相關改進源碼閱讀及相關記錄

前言 最近,開源了可商用的llama2,支持長度相比llama1的1024,拓展到了4096長度,然而,相比GPT-4、Claude-2等支持的長度,llama的長度外推顯得尤為重要,本文記錄了三種網絡開源的RoPE改進方式及相…

Vue-打印組件頁面

場景: 需要將頁面的局部信息打印出來&#xff0c;只在前端實現&#xff0c;不要占用后端的資源。經過百度經驗&#xff0c;決定使用 print-js和html2canvas組件。 1. 下載包 npm install print-js --save npm install --save html2canvas 2. 組件內引用 <script>impo…

C語言之數組指針和指針數組

C語言之數組指針和指針數組 一、含義二、定義2.1 指針數組2.2 數組指針 三、使用3.1 指針數組在參數傳遞時的使用3.1.1 指針數組的排序3.2 數組指針在參數傳遞時的使用 一、含義 指針數組&#xff1a;顧名思義&#xff0c;其為一個數組&#xff0c;數組里面存放著多個指針&…

C#生成隨機驗證碼

以下是一個簡單的C#驗證碼示例&#xff1a; private void GenerateCaptcha() {// 生成隨機字符串string chars "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";Random random new Random();string captchaString new string(Enumerable.Repe…

TPAMI, 2023 | 用壓縮隱逆向神經網絡進行高精度稀疏雷達成像

CoIR: Compressive Implicit Radar | IEEE TPAMI, 2023 | 用壓縮隱逆向神經網絡進行高精度稀疏雷達成像 注1:本文系“無線感知論文速遞”系列之一,致力于簡潔清晰完整地介紹、解讀無線感知領域最新的頂會/頂刊論文(包括但不限于Nature/Science及其子刊;MobiCom, Sigcom, MobiSy…

Java【算法 04】HTTP的認證方式之DIGEST認證詳細流程說明及舉例

HTTP的認證方式之DIGEST 1.是什么2.認值流程2.1 客戶端發送請求2.2 服務器返回質詢信息2.2.1 質詢參數2.2.2 質詢舉例 2.3 客戶端生成響應2.4 服務器驗證響應2.5 服務器返回響應 3.算法3.1 SHA-2563.1.1 Response3.1.2 A13.1.3 A2 3.2 MD53.2.1 Request-Digest3.2.2 A13.2.3 A2…

CSS3 中新增了哪些常見的特性?

聚沙成塔每天進步一點點 ? 專欄簡介? 圓角&#xff08;Border Radius&#xff09;? 漸變&#xff08;Gradients&#xff09;? 陰影&#xff08;Box Shadow&#xff09;? 文本陰影&#xff08;Text Shadow&#xff09;? 透明度&#xff08;Opacity&#xff09;? 過渡&…

Spring boot與Spring cloud 之間的關系

Spring boot與Spring cloud 之間的關系 Spring boot 是 Spring 的一套快速配置腳手架&#xff0c;可以基于spring boot 快速開發單個微服務&#xff0c;Spring Boot&#xff0c;看名字就知道是Spring的引導&#xff0c;就是用于啟動Spring的&#xff0c;使得Spring的學習和使用…

MATLAB中xlsread函數用法

目錄 語法 說明 示例 將工作表讀取到數值矩陣 讀取元胞的范圍 讀取列 請求數值、文本和原始數據 對工作表執行函數 請求自定義輸出 局限性 xlsread函數的功能是讀取Microsoft Excel 電子表格文件 語法 num xlsread(filename) num xlsread(filename,sheet) num x…

Nacos和GateWay路由轉發NotFoundException: 503 SERVICE_UNAVAILABLE “Unable to find

問題再現&#xff1a; 2023-08-15 16:51:16,151 DEBUG [reactor-http-nio-2][CompositeLog.java:147] - [dc73b32c-1] Encoding [{timestampTue Aug 15 16:51:16 CST 2023, path/content/course/list, status503, errorService Unavai (truncated)...] 2023-08-15 16:51:16,17…

leetcode27—移除元素

思路&#xff1a; 參考26題目雙指針的思想&#xff0c;只不過這道題不是快慢指針。 看到示例里面數組是無序的&#xff0c;也就是說后面的元素也是可能跟給定 val值相等的&#xff0c;那么怎么處理呢。就想到了從前往后遍歷&#xff0c;如果left對應的元素 val時&#xff0c…

汽車制造業上下游協作時 外發數據如何防泄露?

數據文件是制造業企業的核心競爭力&#xff0c;一旦發生數據外泄&#xff0c;就會給企業造成經濟損失&#xff0c;嚴重的&#xff0c;可能會帶來知識產權剽竊損害、名譽傷害等。汽車制造業&#xff0c;會涉及到重要的汽車設計圖紙&#xff0c;像小米發送汽車設計圖紙外泄事件并…

[足式機器人]Part5 機械設計 Ch00/01 緒論+機器結構組成與連接 ——【課程筆記】

本文僅供學習使用 本文參考&#xff1a; 《機械設計》 王德倫 馬雅麗課件與日常作業可登錄網址 http://edu.bell-lab.com/manage/#/login&#xff0c;選擇觀摩登錄&#xff0c;查看2023機械設計2。 機械設計-Ch00Ch01——緒論機器結構組成與連接 Ch00-緒論0.1 何為機械設計——…

12.Eclipse導入Javaweb項目

同事復制一份他的項目給我ekp.rar (懶得從SVN上拉取代碼了)放在workspace1目錄下 新建一個文件夾 workspace2&#xff0c;Eclipse切換到workspace2工作空間 選擇Import導入 選擇導入的項目(這里是放到workspace1里面) 拷貝一份到workspace2里面 例子 所有不是在自己電腦上開發…

可白嫖的4家免費CDN,并測試其網絡加速情況(2023版)

網站加載速度優化過程中&#xff0c;不可避免的會用上CDN來加速資源的請求速度。但是市面上的CDN資源幾乎都是要收費的&#xff0c;而且價格還不便宜&#xff0c;對于小公司站長來講&#xff0c;這將是一筆不小的開銷。不過還是有一些良心公司給我們提供了免費的資源&#xff0…

ZooKeeper的基本概念

集群角色 通常在分布式系統中&#xff0c;構成一個集群的每一臺機器都有自己的角色&#xff0c;最典型的集群模式就是Master/Slave模式(主備模式)。在這種模式中&#xff0c;我們把能夠處理所有寫操作的機器稱為Master機器&#xff0c;把所有通過異步復制方式獲取最新數據&…