【框架】Spring 框架重點解析

Spring 框架重點解析

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

在這里插入圖片描述

不是線程安全的

  • Spring 框架中有一個 @Scope 注解,默認的值是 singleton,即單例的;
  • 因為一般在 Spring 的 bean 對象都是無狀態的(在生命周期中不被修改的,比如正經開發下, service 層的和 dao 層的),沒有線程安全問題;
  • 如果在 bean 中定義了可修改的成員變量,是要考慮線程安全問題的,可以使用多例 prototype 或者加鎖來解決;

2. 什么是 AOP,你們項目中有沒有使用到 AOP 呢?

在這里插入圖片描述

什么是 AOP ?

  • 面向切面編程,用戶將與業務無直接相關,但卻對多個對象產生影響的公共行為和邏輯,將這些抽取成公共模塊進行復用,降低耦合度;
  • 可以理解為 一組業務的效果上的"增強buff"

原理就是動態代理

  • 即目標方法的執行時機和結果可以由代理決定和處理;

你們項目有沒有使用到 AOP ?

  • 統一處理(攔截器、異常處理器、響應處理器),記錄接口訪問日志,緩存處理,Spring 實現的事務
  • 記錄接口訪問日志核心就是,使用 Spring AOP 中的環繞通知 + 切點表達式(找到記錄日志的方法),通過環繞通知的參數獲取請求方法的參數,獲得這些參數后,進行一些業務;

joinPoint.proceed();

代表,切入點執行,也就是目標方法的執行;

3. Spring 中的事務是如何實現的?

對于編程式事務,事務的維護還是有目標方法的業務進行,沒用到 AOP,對業務代碼入侵性大,項目中很少使用;

而對于聲明式事務,通過對方法加注解 @Transactional 聲明該方法是一個事務

  • 其本質是通過 AOP 功能,對方法前后進行攔截,在執行方法之前開啟事務,在執行完目標方法之后進行提交或者捕獲到異常進行回滾事務;

在這里插入圖片描述

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

  1. 異常捕獲處理,自己業務中處理了異常,沒有拋出,這就意味著這個業務被 Spring 認為是“沒有問題,無需回滾”
    • 解決:根據實際業務決定是否要手動拋出、手動回滾;
  2. 拋出檢查異常(throws),Spring 默認認為事務拋出的檢查異常要被調用者處理,故沒有回滾;
    • 解決:設置注解 @Transactional 的 rollbackFor 屬性為 Exception.class,則即使是檢查異常,也會回滾;
  3. 非 public 方法導致的事務失效,由于 Spring 聲明式事務的原理是 Spring AOP,所以創建代理、獲取參數、添加事務通知,都要求方法是 public;
    • 解決:改為 public;

5. Spring 中 Bean 的生命周期(如何去管理和創建 Bean 實例的?)

在這里插入圖片描述

推薦文章:【JavaEE】深入了解Spring中Bean的可見范圍(作用域)以及前世今生(生命周期)_bean的全局變量-CSDN博客

  1. 通過 BeanDefinition 獲取 Bean 的定義信息,調用構造方法創建 Bean(空);

    在這里插入圖片描述

  2. Bean 對象中成員變量的依賴注入;

  3. 處理 Aware 接口(Bean Name Aware、Bean Factory Aware、ApplicationContextAware);

  4. Bean 處理器 BeanPostProcessor - 前置;

  5. 初始化方法(InitializingBean、init-method);

  6. Bean 處理器 BeanPostProcessor - 后置;

    • 可以去加強 Bean 對象,例如使其成為代理對象,可以被動態代理;

    在這里插入圖片描述

  7. 銷毀 Bean;

6. Spring 中的循環引用(循環依賴)

6.1 循環依賴是什么?

在這里插入圖片描述

6.2 Spring 的三種緩存

在這里插入圖片描述

6.3 一級緩存 + 二級緩存解決普通 Bean 對象的循環依賴

顯然,循環依賴的主要原因就是兩個對象都是半成品,所以單憑一級緩存是無法解決循環依賴問題的;

在這里插入圖片描述

6.4 三種緩存一起解決加強 Bean 對象的循環依賴

由于原始對象是沒有被特殊處理的,所以只憑借一二級緩存無法注入一些加強對象,如代理對象;

  • 因為在 6.3 中,將半成品注入給 B,是因為地址后面不會變化,這樣即使注入了半成品,也不會影響結果;
  • 而代理對象地址和性質跟原對象是不同的;

這個時候可以加上三級緩存來解決問題;

在這里插入圖片描述

6.5 構造方法出現了循環依賴

由于 Bean 的生命周期中構造函數是第一個執行的,Spring 框架并不能解決構造器函數的依賴注入,而我們可以通過“延遲加載”來解決問題;

在這里插入圖片描述

6.6 回答

  • 循環依賴:循環依賴也就是循環引用,也就是一個或一個以上的 Bean 互相注入的現象,形成了閉環。如 A 依賴 B,B 依賴 A;
  • 循環依賴在 Spring 中是允許存在的,Spring 框架依據三級緩存已經解決了大部分的循環依賴;
    1. 一級緩存:單例池,存放完整的 Bean 對象;
    2. 二級緩存:緩存 Bean 半成品對象;
    3. 三級緩存:緩存的是 ObjectFactory,表示對象工廠,用來創建某個 Bean(間接存儲 Bean 對象);
  • 當然,Spring 無法解決構造方法出現了循環依賴的問題,但是我們可以通過 @Lazy 注解讓某個 Bean “延遲加載”來解決問題;

7. Spring MVC 的執行流程知道嗎?

7.1 JSP

在這里插入圖片描述

7.2 前后端分離

在這里插入圖片描述

AOP 也大概在 3、4、5 起代理作用,感興趣可以去研究,不作為重點;

7.3 回答

Spring MVC 的執行流程是這個框架最核心的內容了,有兩種:

  1. 比較老舊的 JSP;
  2. 比較主流的前后端分離的異步、接口開發;

對于 JSP :

  1. 用戶發送請求到 前端控制器 DispatcherServlet;
  2. 前端控制器 DispatcherServlet 收到請求調用 處理器映射器 HandlerMapping;
  3. 處理器映射器 HandlerMapping 將 url 映射到對應的處理器,生成 處理器執行鏈 HandlerExecutionChain 返回給 前端控制器 DispatcherServlet;
  4. 前端控制器 DispatcherServlet 調用 處理器適配器 HandlerAdapter;
  5. 處理器適配器 HandlerAdapter 經過適配調用具體的處理器(Handler/Controller),進行目標方法的參數處理以及返回值處理,并將結果轉化為邏輯視圖數據 ModelAndView 返回給 前端控制器 DispatcherServlet;
  6. 前端控制器 DispatcherServlet 將 ModelAndView 傳給 視圖解析器 ViewReslover;
  7. 視圖解析器 ViewReslover 將 ModelAndView 解析成真實的視圖數據 View 返回給 前端控制器 DispatcherServlet;
  8. 前端控制器 DispatcherServlet 根據 View 進行渲染視圖;
  9. 前端控制器 DispatcherServlet 將頁面響應給用戶;

對于前后端分離:

  1. 用戶發送請求到 前端控制器 DispatcherServlet;
  2. 前端控制器 DispatcherServlet 收到請求調用 處理器映射器 HandlerMapping;
  3. 處理器映射器 HandlerMapping 將 url 映射到對應的處理器,生成 處理器執行鏈 HandlerExecutionChain 返回給 前端控制器 DispatcherServlet;
  4. 前端控制器 DispatcherServlet 調用 處理器適配器 HandlerAdapter;
  5. 處理器適配器 HandlerAdapter 經過適配調用具體的處理器(Handler/Controller),進行目標方法的參數處理以及返回值處理,將數據直接響應給用戶;
  6. 方法上如果添加了 @ResponseBody處理器適配器 HandlerAdapter 將目標方法的返回值轉化為 JSON 字符串再響應給用戶;

8. Spring Boot 自動配置原理

我們知道,Spring 中有不少的 Bean 是自帶的和程序員自己寫的,那么我們通過啟動類,是怎么讓這些 Bean 自動配置的呢?

就需要理解一下 Spring Boot 自動配置原理

8.1 @SpringBootApplication 注解

  1. @SpringBootConfiguration:聲明一個配置類;
  2. @ComponentScan:組件掃描,掃描的包路徑下的 Bean 存到 Spring 容器中;
  3. @EnableAutoConfiguration:Spring Boot 實現自動化配置的核心注解;

在這里插入圖片描述

8.2 @EnableAutoConfiguration 注解

  1. @Import 注解導入了配置選擇器,讀取該項目的以及引用的 jar 包的包路徑下的 META-INF/spring.factories 文件中的所有配置類;
  2. 根據一些條件判斷的注解去判斷是否把配置類中的 Bean 放入 Spring 容器;

在這里插入圖片描述

在這里插入圖片描述

8.3 回答

在這里插入圖片描述

  1. 在 Spring Boot 項目中的引導類有一個注解 @SpringBootApplication,這個注解其實是對三個注解進行了封裝,分別是:
    1. @SpringBootConfiguration:聲明一個配置類;
    2. @ComponentScan:組件掃描,掃描的包路徑下的 Bean 存到 Spring 容器中;
    3. @EnableAutoConfiguration:Spring Boot 實現自動化配置的核心注解;
  2. 其中,核心注解 @EnableAutoConfiguration,通過 @Import 注解導入了配置選擇器,讀取該項目的以及引用的 jar 包的包路徑下的 META-INF/spring.factories 文件中的所有配置類;
  3. 會有一些條件判斷的注解(@Conditional 開頭),例如:
    1. @ConditionalOnClass 判斷是否有對應的字節碼文件,如果有字節碼,就加載該類把這個配置類所有的 Bean 放入 Spring 容器中;
    2. @ConditionalOnMissingBean 加在 @Bean 標注的方法上,判斷是否有對應的 Bean,如果對應的 Bean 不存在,則將這個 Bean 放入 Spring 容器;

9. Spring、Spring Boot、Spring MVC 常見注解有哪些?

9.1 Spring 的常見注解有哪些?

在這里插入圖片描述

9.2 Spring MVC 的常見注解有哪些?

在這里插入圖片描述

9.3 Spring Boot 的常見注解有哪些?

在這里插入圖片描述

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

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

相關文章

解決Mybatis報Type interface *.*Mapper is not known to the MapperRegis

解決Mybatis報Type interface *.*Mapper is not known to the MapperRegis 問題發現問題解決方法一:檢查Mapper文件的namespace路徑是否正確方法二:使用其他方法是否正確 問題發現 在學習MyBatis框架的時候,不使用 XML 構建 SqlSessionFacto…

字符串函數 sscanf() 詳解

什么是 sscanf() 函數? sscanf() 函數是 C 語言中的一個標準庫函數,它的作用是從一個字符串中按照指定的格式提取數據,并將其存儲到對應的變量中。它的原型如下: int sscanf(const char *str, const char *format, ...);其中&am…

Project_Euler-44 題解

Project_Euler-44 題解 題目 思路 題目給出了一個性質,讓我在對應性質的數據中找出目標值,這種問題首先想到的就是枚舉。 我們可以枚舉 P k P_k Pk? ,對于每一個 P k P_k Pk? ,我們再枚舉 P j P_j Pj?, P j P_…

【ue5】滑鏟系統藍圖筆記

大致邏輯如下: 一、導入動畫 滑鏟蹲待機蹲行走 導入到文件夾中 可以右鍵設置顏色,便于區分。 二、調整動畫 1.啟動根運動 啟動根運動后,人物才可以位移,不然只能在原地。 打開動畫序列,勾選啟用根運動Enabled…

用node或者vscode開啟一個簡單的本地server服務器,加載html網頁

使用Live Server 想要加載本地html頁面可以快速能讓它在你本地瀏覽器中打開,可以有好多種方式,如果你有使用vscode,可以安裝一個插件:Live Server,然后直接在vscode中直接右鍵就可以開啟這個服務: 安裝好之…

C++基于多設計模式下的同步異步日志系統day2

📟作者主頁:慢熱的陜西人 🌴專欄鏈接:C基于多設計模式下的同步&異步日志系統 📣歡迎各位大佬👍點贊🔥關注🚓收藏,🍉留言 主要內容實現了日志代碼設計的實…

在 Spring Boot 3.x 中使用 SpringDoc 2 / Swagger V3

SpringDoc V1 只支持到 Spring Boot 2.x springdoc-openapi v1.7.0 is the latest Open Source release supporting Spring Boot 2.x and 1.x. Spring Boot 3.x 要用 SpringDoc 2 / Swagger V3, 并且包名也改成了 springdoc-openapi-starter-webmvc-ui SpringDoc V2 https://s…

select,poll和epoll有什么區別

它們都是NIO中多路復用的三種實現機制,是由linux操作系統提供的。 用戶空間和內核空間:操作系統為了保證系統安全,將內核分為兩個部分,一個是用戶空間,一個是內核空間。用戶空間不能直接訪問底層的硬件設備&#xff0…

IT廉連看——Uniapp——配置文件pages

IT廉連看——Uniapp——配置文件pages [IT廉連看] 本堂課主要為大家介紹pages.json這個配置文件 一、打開官網查看pages.json可以配置哪些屬性。 下面邊寫邊講解 新建一個home頁面理解一下這句話。 以下一些頁面的通用配置 通用設置里我們可以對導航欄和狀態欄進行一些設…

Android修行手冊-集成Python開發環境

Unity3D特效百例案例項目實戰源碼Android-Unity實戰問題匯總游戲腳本-輔助自動化Android控件全解手冊再戰Android系列Scratch編程案例軟考全系列Unity3D學習專欄藍橋系列ChatGPT和AIGC 👉關于作者 專注于Android/Unity和各種游戲開發技巧,以及各種資源分…

Debezium發布歷史161

原文地址: https://debezium.io/blog/2023/09/13/debezium-2-4-beta2-released/ 歡迎關注留言,我是收集整理小能手,工具翻譯,僅供參考,筆芯筆芯. Debezium 2.4.0.Beta2 Released September 13, 2023 by Chris Cranfo…

Apache Flink連載(三十五):Flink基于Kubernetes部署(5)-Kubernetes 集群搭建-1

?? 個人主頁:IT貧道-CSDN博客 ?? 私聊博主:私聊博主加WX好友,獲取更多資料哦~ ?? 博主個人B棧地址:豹哥教你學編程的個人空間-豹哥教你學編程個人主頁-嗶哩嗶哩視頻 目錄 ?編輯

Python爬蟲——Urllib庫-2

編解碼 問題引入 例如: https://www.baidu.com/s?wd章若楠 https://www.baidu.com/s?wd%E7%AB%A0%E8%8B%A5%E6%A5%A0 第二部分的一串亂碼就是章若楠 如果這里是寫的章若楠就會 產生這樣的錯誤 所以我們就可以使用get請求方式的quote方法了 get請求方式的q…

laravel ApiResponse接口統一響應封裝

一&#xff0c;新增接口返回碼配置文件 在config中新增配置文件apicode.php <?phpreturn [ apicodes>[/*** Message("OK")* 對成功的 GET、PUT、PATCH 或 DELETE 操作進行響應。也可以被用在不創建新資源的 POST 操作上*/HTTP_OK > 200,/*** Message(&qu…

使用el-form之表單校驗自動定位到報錯位置問題,,提升用戶體驗

需求描述 由于需要填寫的表單項太多&#xff0c;提交的時候校驗不通過&#xff0c; 如果沒填寫的表單項在最上面&#xff0c;用戶看不到不知道發生了啥&#xff0c; 所以需要將頁面滾動定位到第一個報錯的表單項位置&#xff0c;提升用戶體驗實現步驟 1. 給form表單添加ref …

數據中心GPU集群高性能組網技術分析

數據中心GPU集群組網技術是指將多個GPU設備連接在一起&#xff0c;形成一個高性能計算的集群系統。通過集群組網技術&#xff0c;可以實現多個GPU設備之間的協同計算&#xff0c;提供更大規模的計算能力&#xff0c;適用于需要大規模并行計算的應用場景。 常用的組網技術&…

1209. 帶分數 刷題筆記

思路 暴力匹配 讀入目標數 n 看n是否與ab/c相等 因為c里面的除法是整除 我們將 nab/c 轉換為 c*na*cb 那么如何獲得a,b&#xff0c;c 依題意 a&#xff0c;b&#xff0c;c三個數由1-9九個數字組成 且每個數字只能出現一次 由此 我們可以搜出123456789的全部排列方式…

我做的app上架應用市場一天,快破400下載量,0差評

上集說到&#xff0c;我做了一個叫QB音樂的安卓app&#xff0c;經過一段時間的自我使用與測試終于算發布了。我昨天順便把它上架了奇妙應用市場&#xff0c;截止目前3月1號過去了一天&#xff0c;下載量快到400&#xff0c;0差評。看來還是能正常使用的。 一、為什么做這個ap…

CleanMyMac X2024免費Mac電腦清理和優化工具

CleanMyMac X是一款專業的 Mac 清理和優化工具&#xff0c;它具備一系列強大的功能&#xff0c;可以幫助用戶輕松管理和維護他們的 Mac 電腦。以下是一些關于 CleanMyMac X 的主要功能和特點&#xff1a; 智能清理&#xff1a;CleanMyMac X 能夠智能識別并清理 Mac 上的無用文件…

深入剖析k8s-Pod篇

為什么需要Pod&#xff1f; 進程是以進程組的方式組織在一起。受限制容器的“單進程模型”&#xff0c; 成組調用沒有被妥善處理&#xff08;資源調用有限&#xff09;&#xff0c;使用資源囤積則導致復雜度上升。 在k8s項目中&#xff0c;Pod的實現需要使用一個中間容器——…