SSM框架——Spring面試題

Spring常見面試題

Spring框架中的單例bean是線程安全的嗎

????????不是線程安全的 Spring框架中有一個@Scope注解,默認的值就是singleton,單例的。 因為一般在spring的bean的中都是注入無狀態的對象,沒有線程安全問題,如果在bean中定義了可修改的成員變量,是要考慮線程安全問題的,可以使用多例或者加鎖來解決

Spring框架中的bean是單例的嗎

  • singleton : bean在每個Spring IOC容器中只有一個實例。
  • prototype:一個bean的定義可以有多個實例。

什么是AOP

????????AOP稱為面向切面編程,用于將那些與業務無關,但卻對多個對象產生影響的公共行為和邏輯,抽取并封裝為一個可重用的模塊,這個模塊被命名為“切面”(Aspect),減少系統中的重復代碼,降低了模塊間的耦合度,同時提高了系統的可維護性。

常見的AOP使用場景:

  • 記錄操作日志
  • 緩存處理
  • Spring中內置的事務處理

記錄操作日志思路

????????獲取請求的用戶名、請求方式、訪問地址、模塊名稱、登錄ip、操作時間,記錄到數據庫的日志表中。核心是:使用aop中的環繞通知+切點表達式(找到要記錄日志的方法),通過環繞通知的參數獲取請求方法的參數(類、方法、注解、請求方式等),獲取到這些參數以后,保存到數據庫

Spring中的事務是如何實現的

Spring支持編程式事務管理和聲明式事務管理兩種方式。

  • 編程式事務控制:需使用TransactionTemplate來進行實現,對業務代碼有侵入性,項目中很少使用
  • 聲明式事務管理:聲明式事務管理建立在AOP之上的。其本質是通過AOP功能,對方法前后進行攔截,將事務處理的功能編織到攔截的方法中,也就是在目標方法開始之前加入一個事務,在執行完目標方法之后根據執行情況提交或者回滾事務。

Spring中事務失效的場景有哪些

情況一:異常捕獲處理

原因:事務通知只有捉到了目標拋出的異常,才能進行后續的回滾處理,如果目標自己處理掉異常,事務通知無法知悉

解決:在catch塊添加throw new RuntimeException(e)拋出

情況二:拋出檢查異常

原因:Spring 默認只會回滾非檢查異常

解決:配置rollbackFor屬性@Transactional(rollbackFor=Exception.class)

情況三:非public方法導致的事務失效

原因:Spring 為方法創建代理、添加事務通知、前提條件都是該方法是 public 的。

解決:改為 public?

Spring的bean的生命周期

BeanDefinition

????????Spring容器在進行實例化時,會將xml配置的<bean>的信息封裝成一個BeanDefinition對象,Spring根據BeanDefinition來創建Bean對象,里面有很多的屬性用來描述Bean。

<bean id="userDao" class="com.itheima.dao.impl.UserDaoImpl" lazy-init="true"/>
<bean id="userService" class="com.itheima.service.UserServiceImpl" scope="singleton"><property name="userDao" ref="userDao"></property> 
</bean>
  • beanClassName:bean 的類名
  • initMethodName:初始化方法名稱
  • properryValues:bean 的屬性值
  • scope:作用域
  • lazyInit:延遲初始化

  1. 通過BeanDefinition獲取bean的定義信息
  2. 調用構造函數實例化bean
  3. bean的依賴注入
  4. 處理Aware接口(BeanNameAware、BeanFactoryAware、ApplicationContextAware)
  5. Bean的后置處理器BeanPostProcessor-前置
  6. 初始化方法(InitializingBean、init-method)
  7. Bean的后置處理器BeanPostProcessor-后置
  8. 銷毀bean

Spring中的循環引用

什么是Spring的循環依賴?

????????循環依賴發生在兩個或兩個以上的bean互相持有對方,形成閉環。在創建A對象的同時需要使用的B對象,在創建B對象的同時需要使用到A對象。

三級緩存解決循環依賴

//單實例對象注冊器
public class DefaultSingletonBeanRegistry extends SimpleAliasRegistry implements SingletonBeanRegistry {private static final int SUPPRESSED_EXCEPTIONS_LIMIT = 100;//一級緩存private final Map<String, Object> singletonObjects = new ConcurrentHashMap(256);//三級緩存private final Map<String, ObjectFactory<?>> singletonFactories = new HashMap(16);//二級緩存private final Map<String, Object> earlySingletonObjects = new ConcurrentHashMap(16);
}

一級緩存作用:限制bean在beanFactory中只存一份,即實現singleton scope,解決不了循環依賴

如果要想打破循環依賴, 就需要一個中間人的參與, 這個中間人就是二級緩存。

從二級緩存中獲取的是指向A對象的地址,即使是半成品對于B來講只要拿到A對象的地址就能創建

  • 循環依賴:循環依賴其實就是循環引用,也就是兩個或兩個以上的bean互相持有對方,最終形成閉環。比如A依賴于B,B依賴于A
  • 循環依賴在spring中是允許存在,spring框架依據三級緩存已經解決了大部分的循環依賴
  1. 一級緩存:單例池,緩存已經經歷了完整的生命周期,已經初始化完成的bean對象
  2. 二級緩存:緩存早期的bean對象(生命周期還沒走完)
  3. 三級緩存:緩存的是ObjectFactory,表示對象工廠,用來創建某個對象的?

緩存名稱

源碼名稱

作用

一級緩存

singletonObjects

單例池,緩存已經經歷了完整的生命周期,已經初始化完成的

bean對象

二級緩存

earlySingletonObjects

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

三級緩存

singletonFactories

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

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

A依賴于B,B依賴于A,注入的方式是構造函數

原因:由于bean的生命周期中構造函數是第一個執行的,spring框架并不能解決構造函數的的依賴注入

解決方案:使用@Lazy進行懶加載,什么時候需要對象再進行bean對象的創建

public A(@Lazy B b){System.out.println("A的構造方法執行了...");this.b = b ;
}

SpringMVC的執行流程

  • 視圖階段(老舊JSP等)

  1. 用戶發送出請求到前端控制器DispatcherServlet
  2. DispatcherServlet收到請求調用HandlerMapping(處理器映射器)
  3. HandlerMapping找到具體的處理器,生成處理器對象及處理器攔截器(如果有),再一起返回給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響應用戶?
  • 前后端分離階段(接口開發,異步)

  1. 用戶發送出請求到前端控制器DispatcherServlet
  2. DispatcherServlet收到請求調用HandlerMapping(處理器映射器)
  3. HandlerMapping找到具體的處理器,生成處理器對象及處理器攔截器(如果有),再一起返回給DispatcherServlet。
  4. DispatcherServlet調用HandlerAdapter(處理器適配器)
  5. HandlerAdapter經過適配調用具體的處理器(Handler/Controller)
  6. 方法上添加了@ResponseBody
  7. ?通過HttpMessageConverter來返回結果轉換為JSON并響應

Springboot自動配置原理

  • @SpringBootConfiguration:該注解與 @Configuration 注解作用相同,用來聲明當前也是一個配置類。
  • @ComponentScan:組件掃描,默認掃描當前引導類所在包及其子包。
  • @EnableAutoConfiguration:SpringBoot實現自動化配置的核心注解。

繼續打開@EnableAutoConfiguration

AutoConfigurationImportSelector實現方式為SpringFactories機制

getAutoConfigurationEntry為Spring自動配置入口

SpringFactories文件路徑

總結:Spring Boot的自動配置原理基于@SpringBootApplication注解,它封裝了@SpringBootConfiguration@EnableAutoConfiguration@ComponentScan@EnableAutoConfiguration是核心,它通過@Import導入配置選擇器,讀取META-INF/spring.factories文件中的類名,根據條件注解決定是否將配置類中的Bean導入到Spring容器中。

Springboot配置原理視頻講解:B站目前講的最透徹的SpringBoot自動配置,大廠面試必備知識點#安員外很有碼_嗶哩嗶哩_bilibili

Spring 的常見注解有哪些??

注解

說明

@Component@Controller@Service@Repository

使用在類上用于實例化Bean

@Autowired

使用在字段上用于根據類型依賴注入

@Qualifier

結合@Autowired一起使用用于根據名稱進行依賴注入

@Scope

標注Bean的作用范圍

@Configuration

指定當前類是一個?Spring?配置類,當創建容器時會從該類上加載注解

@ComponentScan

用于指定?Spring???在初始化容器時要掃描的包

@Bean

使用在方法上,標注將該方法的返回值存儲到Spring容器中

@Import

使用@Import導入的類會被Spring加載到IOC容器中

@Aspect@Before@After@Around@Pointcut

用于切面編程(AOP

Springboot常見注解

注解

說明

@SpringBootConfiguration

組合了-?@Configuration注解,實現配置文件的功能

@EnableAutoConfiguration

打開自動配置的功能,也可以關閉某個自動配置的選

@ComponentScan

Spring組件掃描

SpringMVC

注解

說明

@RequestMapping

用于映射請求路徑,可以定義在類上和方法上。用于類上,則表示類中的所有的方法都是以該地址作為父路徑

@RequestBody

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

@RequestParam

指定請求參數的名稱

@PathViriable

從請求路徑下中獲取請求參數(/user/{id}),傳遞給方法的形式參數

@ResponseBody

注解實現將controller方法返回對象轉化為json對象響應給客戶端

@RequestHeader

獲取指定的請求頭數據

@RestController

@Controller?+?@ResponseBody

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

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

相關文章

20250317筆記本電腦在ubuntu22.04下使用acpi命令查看電池電量

20250317筆記本電腦在ubuntu22.04下使用acpi命令查看電池電量 2025/3/17 18:05 百度&#xff1a;ubuntu查看電池電量 百度為您找到以下結果 ubuntu查看電池電量 在Ubuntu操作系統中&#xff0c;查看電池電量通常可以通過命令行或者圖形界面來完成。下面是一些常見的方法&…

SpringBoot第三站:配置嵌入式服務器使用外置的Servlet容器

目錄 1. 配置嵌入式服務器 1.1 如何定制和修改Servlet容器的相關配置 1.server.port8080 2. server.context-path/tx 3. server.tomcat.uri-encodingUTF-8 1.2 注冊Servlet三大組件【Servlet&#xff0c;Filter&#xff0c;Listener】 1. servlet 2. filter 3. 監聽器…

Docker 使用指南

Docker 是一種開源的容器化平臺&#xff0c;它通過使用容器來進行應用程序的打包、分發和部署。下面是 Docker 的基本概念和優勢&#xff1a; 容器化&#xff1a;Docker 使用容器來封裝應用程序及其所有依賴項&#xff0c;使其能夠在任何環境中運行&#xff0c;并且與底層系統隔…

C# WPF編程-啟動新窗口

C# WPF編程-啟動新窗口 新建窗口&#xff1a; 工程》添加》窗口 命名并添加新的窗口 這里窗口名稱為Window1.xaml 啟動新窗口 Window1 win1 new Window1(); win1.Show(); // 非模態啟動窗口win1.ShowDialog(); // 模態啟動窗口 模態窗口&#xff1a;當一個模態窗口被打開時&a…

談談 undefined 和 null

*** 補充 null 和 ‘’

Ubuntu快速安裝使用gRPC C++

目錄 引言一、快速安裝1. 安裝必要依賴庫2. 安裝gRPC 二、測試使用三、參考博客 引言 關于gRPC隨著云原生微服務的火熱也流行了起來&#xff0c;而且學好一個gRPC框架對目前來說也是必須的了。然而對于一個基礎的小白來說&#xff0c;這個gRPC的框架運用起來是及其的困難&…

高數1.5 極限的運算法則

1. 預備知識 2.四則求極限法則 3.復合運算求極限法則

Python中的“泛型”和“多重繼承”

“泛型”和“多重繼承”屬于 Python 的語法規則。 1. 泛型&#xff08;Generic[T]&#xff09; 通俗解釋 泛型允許你在定義類或函數時&#xff0c;不指定具體的類型&#xff0c;而是使用一個“占位符”&#xff08;通常命名為 T&#xff09;。這就像你制作一個盒子&#xff0…

pandas學習筆記(一)——基礎知識和應用案例

pandas學習筆記 基礎語法參考菜鳥教程&#xff1a;https://www.runoob.com/pandas/pandas-tutorial.html # jupyter import pandas as pd import matplotlib from matplotlib import pyplot as plt import numpy as npmatplotlib.use(TkAgg)data {timestamp: [1, 2, 3, 4, 5…

海綿音樂 3.4.0 | 免費AI音樂創作軟件,支持多種風格智能生成

海綿音樂是一款專為Android用戶設計的免費AI音樂創作軟件&#xff0c;搭載深度神經網絡作曲引擎&#xff0c;支持流行、電子、古風等12種音樂風格智能生成。提供多軌道編輯界面&#xff08;8軌同步混音&#xff09;&#xff0c;可自定義鼓點、旋律和和弦進行實時混音&#xff0…

2025 香港 Web3 嘉年華:全球 Web3 生態的年度盛會

自 2023 年首屆香港 Web3 嘉年華成功舉辦以來&#xff0c;這一盛會已成為全球 Web3 領域規模最大、影響力最深遠的行業活動之一。2025 年 4 月 6 日至 9 日&#xff0c;第三屆香港 Web3 嘉年華將在香港盛大舉行。本屆活動由萬向區塊鏈實驗室與 HashKey Group 聯合主辦、W3ME 承…

【Dify平臺】Function Call 模式模式和ReAct模型有什么不同?

本文原創作者:姚瑞南 AI-agent 大模型運營專家,先后任職于美團、獵聘等中大廠AI訓練專家和智能運營專家崗;多年人工智能行業智能產品運營及大模型落地經驗,擁有AI外呼方向國家專利與PMP項目管理證書。(轉載需經授權) 目錄 1. DIFY 平臺的 Function Call 模式 2. ReAct…

解決 React Native 0.76 中 com.facebook.react.settings 插件缺失問題

在使用 React Native 0.76 創建項目時&#xff0c;遇到以下錯誤&#xff1a; FAILURE: Build failed with an exception. * Where: Settings file /Users/wangxp/learn/AwesomeProject/android/settings.gradle line: 2 * What went wrong: Plugin [id: com.facebook.react.se…

Linux目錄結構以及文件操作

Linux目錄結構以及文件操作 ubuntu屬于Linux的發行版&#xff0c;帶圖形界面。但是跑在嵌入式設備中的Linux操作系統往往不帶圖形界面&#xff0c;直接使用命令來操作。Linux區分大小寫。 在Linux系統上&#xff0c;文件被看作字節序列。 普通文件&#xff08;—&#xff09…

React19源碼系列之FiberRoot節點和Fiber節點

在上一篇文章&#xff0c;看了createRoot函數的大致流程。 createContainer函數創建并返回了FiberRoot 。FiberRoot是由createFiberRoot函數創建&#xff0c; createFiberRoot函數還將 FiberRoot和 根Fiber 通過current屬性建立起了聯系。將FiberRoot作為參數傳給 ReactDOMRoo…

vue3+antd+a-menu配置

antd是用的3版本 <a-menu v-model:selectedKeys"selectedKeys" mode"inline" click"toPage"><template v-for"i in menus"><a-menu-item v-if"!i.children" :key"i.path"><span>{{ i.nam…

【2025年3月最新】Cities_Skylines:城市天際線1全DLC解鎖下載與教程

親測2025年3月11日能用&#xff0c;能解鎖全部DLC 使用教程 點擊下載 點擊下載

基于Django的交通指示圖像識別分析系統

【Django】基于Django的交通指示圖像識別分析系統 &#xff08;完整系統源碼開發筆記詳細部署教程&#xff09;? 目錄 一、項目簡介二、項目界面展示三、項目視頻展示 一、項目簡介 本項目旨在通過大量交通標志數據訓練后&#xff0c;得到較好的識別模型&#xff0c;便于用戶…

SAP HANA on AWS Amazon Web Services

SAP HANA on AWS Amazon Web Services

【設計模式】】工廠模式

三、工廠模式 3.1 工廠模式 創建一個類對象的傳統方式是使用關鍵字new, 因為用new 創建的類對象是一個堆對象&#xff0c;可以實現多態。工廠模式通過把創建對象的代碼包裝起來&#xff0c;實現創建對象的代碼與具體 的業務邏輯代碼相隔離的目的(將對象的創建和使用進行解耦)…