關于Spring的一些理解

Spring整體結構:
在這里插入圖片描述
Spring實際運行場景:

在這里插入圖片描述

基礎

Spring啟動過程

傳統Spring:
(1)初始化準備階段
(2)容器創建與注入
(3)Bean工廠后置處理
(4)Bean工廠后置處理
(5)Bean實例化與依賴注入
(6)容器啟動完成
Spring Boot應用:
(1)啟動類觸發(@SpringBootApplication)
(2)初始化SpringApplication
(3)環境準備Environment
(4)創建ApplicationContext
(5)自動裝配(@EnableAutoConfiguration)
(6)Bean加載與初始化(同傳統Spring核心流程)
(7)Bean加載與初始化(同傳統Spring核心流程)
(8)Bean加載與初始化(同傳統Spring核心流程)

Spring的組成部分

  • 核心容器模塊:核心包(spring-core)、上下文包(spring-context)、表達式語言包(spring-expression)
  • 面向切面編程模塊:spring-aop、spring-aspects
  • 數據訪問/集成模塊:spring-jdbc、spring-tx、spring-orm
  • web模塊:spring-web、spring-webmvc、spring-websocket
  • 測試模塊:spring-test

Spring的優勢

  • 輕量級與低侵入性
  • 強大的IoC與DI機制
  • 面向切面編程AOP
  • 豐富的模塊支持
  • 良好的整合性
  • 優秀的社區支持與生態系統

Spring運用了哪些設計模式

  • 工廠模式:FactoryBean、BeanFactory和ApplicationContext
  • 單例模式:默認Bean的作用域
  • 代理模式:AOP的實現(基于JDK和CGLIB實現動態代理)
  • 模板方法模式:數據庫操作模板(JDBCTemplate、RedisTemplate)
  • 觀察者模式:事件驅動模型(ApplicationEvent和ApplicationListener)
  • 適配器模式:在Spring AOP中用于增強或通知(Advice)的實現。適配不同的Controller實現類
  • 裝飾器模式:BeanWrapper對Bean的增強(把配置文件中的字符串轉換為Bean的屬性類型)
  • 策略模式:資源加載策略,ResourceLoader通過Resource接口的不同實現(ClassPathResource、FileSystemResource)

IoC

優勢:解耦對象依賴、統一管理對象的生命周期、便于擴展與復用、簡化測試

DI

DI與IOC的關系:

  • IOC是思想:強調“控制權轉移”(容器管對象)。
  • DI是手段:通過“注入依賴”的方式,實現IOC的思想落地。

簡單說:IOC 是“要解決什么問題”,DI 是“具體怎么解決”。

注入方式:構造器注入、Setter注入、字段注入

注入如何解決循環依賴問題(常見問題)

  • 三級緩存:
    • 一級緩存:用于存儲已經初始化完畢的單例Bean實例
    • 二級緩存:存儲已經實例化但未完成屬性注入和初始化的單例Bean實例
    • 三級緩存:存儲能夠生成單例Bean實例的工廠對象

為什么需要三級緩存?(常見問題)

  • 依賴注入方式的選擇:構造器注入(會造成死鎖)、Setter注入
  • 其他解決辦法:使用@Lazy注解、使用@PostConstruct注解、使用ApplicationContext獲取Bean、使用接口和事件機制

Bean

如何創建Bean?

  • BeanFactory:核心接口,用于管理和提供Bean實例;
  • ApplicationContext:繼承BeanFactory,有國際化、資源訪問、事件傳播等高級特性;
  • FactoryBean:接口,存在復雜的初始化流程時使用;
  • ObjectFactory:接口,用于延遲獲取對象,常作為參數傳遞。

Bean的作用域(生命周期和可見范圍)

  • 單例
  • 原型
  • 請求
  • 會話
  • 應用
  • webSocket會話

Bean的生命周期

  • 實例化
  • 屬性復制
  • 初始化前
  • 初始化
  • 初始化后
  • 使用中
  • 銷毀

單例Bean不一定線程安全怎么辦?

  • 使用無狀態的Bean
  • 使用線程安全容器
  • 使用同步機制
  • ThreadLocal
  • 將Scope更改為多例

初始化過程

  1. Bean定義信息的載入與解析
  2. Bean的實例化
  3. 屬性填充(依賴注入)
  4. 執行BeanPostProcessor接口
  5. Bean的初始化
  6. Spring Bean的生命周期完整

AOP

實現原理

JDK動態代理、CGLIB動態代理

AOP和AspectJ

  • 實現機制:
    • Spring AOP:基于動態代理和字節碼增強(在運行時通過代理對象或修改字節碼來織入切面邏輯),只能在運行時織如切面邏輯,對類的侵入性相對較小。
    • AspectJ:是一個完整的AOP框架,提供了豐富的AOP語言支持。它可以通過編譯時織入(Compile - time Weaving)、類加載時織入(Load - time Weaving)等方式將切面邏輯織入到目標代碼中,功能更強大,能實現更細粒度的切面控制,但對項目的構建過程有一定影響,需要特定的編譯器或織入器支持。
  • 功能范圍:
    • Spring AOP:主要關注與Spring應用相關的切面需求,如對Spring Bean的方法進行切面增強,支持的連接點主要是方法調用。
    • AspectJ:提供了更廣泛的連接點支持,除了方法調用,還包括字段訪問、構造函數調用等,能滿足更復雜的AOP需求。
  • 使用難度:
    • Spring AOP:與Spring框架緊密集成,使用Spring的配置或注解(如@Aspect、@Before等)就可以很方便地實現切面功能,對于熟悉Spring的開發者來說容易上手。
    • AspectJ: 由于其功能豐富和實現方式的多樣性,學習曲線相對較陡,需要開發者對 AOP 概念和 AspectJ 語法有更深入的理解。

術語

  • 切面
  • 連接點
  • 切入點
  • 通知(前置通知、后置通知、返回通知、異常通知、環繞通知)
  • 目標對象
  • 代理
  • 織入

事務

4種事務特性:原子性、一致性、隔離性、持久性

5種隔離機制:默認隔離級別、讀未提交、讀已提交、可重復讀、可串行化

7種傳播行為:required、supports、mandatory、requires_new、not_supported、never、nested

事務失效場景:

  • 方法不是public修飾
  • 自調用(內部方法調用)
  • 未被Spring容器管理
  • 異步被捕獲且未重新拋出
  • 異步類型不匹配
  • 數據源未配置事務管理器
  • 多線程調用

注解

  • 核心模式與組件定義:
    • @Component:標記一個類為Spring組件。
    • @Controller:標記一個類為 Spring MVC 控制器組件(是 @Component 的特化)。
    • @Service:標記一個類為服務層業務邏輯組件(是 @Component 的特化)。
    • @Repository:標記一個類為數據訪問層(DAO) 組件(是 @Component 的特化),自帶平臺特定的異常轉換功能。
    • @Configuration + @Bean:用于基于Java的配置。@Configuration 標記一個類為配置類,其內部使用 @Bean 標注的方法會定義一個Bean,并交由Spring容器管理。
  • 依賴注入與裝配:
    • @Autowired:用于根據類型(byType)進行自動注入。
    • @Qualifier:與 @Autowired 配合使用,當存在多個相同類型的Bean時,通過名稱(byName)來指定要注入的具體Bean。
    • @Primary:設置一個Bean為首選項。當有多個相同類型的Bean且沒有指定 @Qualifier 時,優先注入帶有此注解的Bean。
    • @Value:用于注入基本數據類型、SpEL表達式或配置文件中的屬性值(如 @Value(“${server.port}”))。
  • Web MVC相關:
    • RequestMapping、@GetMapping、@PostMapping:將HTTP請求映射到特定的控制器方法。
    • @RequestBody:將HTTP請求的Body內容(通常是JSON/XML)綁定到方法的參數上。
    • @ResponseBody:將方法的返回值直接綁定到HTTP響應體上(通常轉換為JSON/XML)。
    • @PathVariable:將URL模板變量綁定到方法參數上(如/users/{id})。
    • @RequestParam:將請求參數(URL查詢參數或表單數據)綁定到方法參數上。
    • @ModelAttribute:將請求參數綁定到模型對象上,或用于在方法上提前準備模型數據。
    • @RequestHeader:將請求頭(Header)的值綁定到方法參數上。
    • @CookieValue:將Cookie的值綁定到方法參數上。
    • @SessionAttribute:訪問預先存在于會話(Session)中的屬性。
    • @ExceptionHandler:在控制器內部聲明一個方法來處理特定類型的異常。
    • @ResponseStatus:標記方法或異常類,指定HTTP響應的狀態碼。
  • 數據驗證:
    • @Validated:Spring提供的注解,用于觸發校驗,支持分組校驗。
    • @Valid:Java標準校驗注解,通常用于方法參數上觸發校驗。在Spring中,兩者常可互換,但@Validated功能更強大。
  • Bean生命周期與作用域:
    • @PostConstruct:標注一個方法,在Bean初始化完成后立即執行(類似于init-method)。
    • @PreDestory:標注一個方法,在Bean被容器銷毀之前執行(類似于destroy-method)。
    • @Scope:定義Bean的作用域(如:singleton、prototype、requeest、session等)。
    • @Lazy:表示一個Bean是延遲初始化的,只有在第一次被使用時才會創建。
  • 配置與條件化:
    • @Profile:指定一個Bean或配置類只在特定的環境Profile激活時才會被注冊(如:“dev”、“prod”)。
    • @Conditional:根據滿足某個特定條件(自定義或Spring內置條件,如 @ConditionalOnProperty)才注冊Bean,是更通用的條件化注解。
    • @PropertySource:指定Spring加載指定的屬性文件(.properties 或 .yml)到環境(Environment)中。
  • 高級功能:
    • @Transactional:聲明式事務管理。
    • @Cached、@CacheEvict、@CachePut:聲明式緩存,用于方法結果的緩存和清除。
    • @Scheduled:用于聲明一個方法是定時任務,可以基于 cron、固定速率或固定延遲執行。
    • @Async:聲明一個方法是異步執行的,調用此方法會立即返回,實際執行將提交給TaskExecutor。
    • @EventListener:聲明一個方法為應用事件監聽器,用于監聽Spring容器內發布的Application。

Async

內部失效原因:Spring的AOP是基于代理實現的,而內部調用會繞過代理機制。

如何避免內部調用失效?

  1. 自我注入
  2. 使用ApplicationContext獲取代理對象
  3. 使用AopContext獲取代理對象
  4. 拆分為單獨的服務類
  5. 手動使用TaskExecutor

什么時候會失效?

  • 未使用@EnableAsync注解
  • 內部方法調用
  • 方法非public
  • 方法返回值錯誤
  • 方法用static修飾了
  • 方法用final修飾
  • 業務類沒加@Service注解
  • 自己new的對象
  • Spring無法掃描異步類

攔截器和過濾器

過濾器和攔截器都是基于AOP思想實現的,用來解決項目中某一類問題的兩種工具。

攔截器

攔截器用于請求處理之前或之后執行的某些邏輯。攔截器可以用來實現日志記錄、權限檢查、性能監控等功能。

過濾器

比較

  • 出身不同:過濾器來自Servlet,而攔截器來自于Spring框架。
  • 觸發時機不同:請求進入容器 > 進入過濾器 > 進入 Servlet > 進入攔截器 > 執行控制器(Controller)。過濾器會先執行,然后才會執行攔截器,最后才會進入真正的要調用的方法。
  • 實現不同:過濾器是基于方法回調實現的;攔截器是基于動態代理實現的。
  • 支持的項目類型不同:過濾器要依賴 Servlet 容器,它只能用在 Web 項目中;而攔截器是 Spring 中的一個組件,因此攔截器既可以用在 Web 項目中,同時還可以用在 Application 或 Swing 程序中。
  • 使用的場景不同:攔截器主要用來實現項目中的業務判斷的,過濾器通常是用來實現通用功能過濾的。

JPA和Hibernate

JPA是一套ORM的規范,定義了標準接口和注解
Hibernate是JPA規范的一種實現
Spring Data JPA 則是基于 JPA 規范的進一步抽象和封裝

參考

https://chuangshi.qq.com/read/29977156/9

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

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

相關文章

Windows右下角系統托盤圖標快速顯示或隱藏

系統托盤指的是Windows電腦桌面右下角的區域,包括時間、wifi(網絡)、音量、電源、輸入法、一些程序/應用等。啟動了應用后,Windows會把部分應用的圖標顯示或隱藏在系統托盤區。我們可以根據需要快速顯示或隱藏相關應用&#xff0c…

Kotlin編程學習記錄2

Kotlin編程學習記錄2——條件與循環 條件語句:if 與 when ? Kotlin 的控制流把“表達式優先”作為設計原則——if、when 不只是控制語句,都可以作為表達式使用并返回值,這影響了日常代碼風格(更函數式、可組合)。筆…

印度物聯網崛起:政策紅利下的千億藍海與本土化博弈

印度物聯網市場正處于快速發展階段,2025年市場規模預計達到200億美元,主要得益于政府"數字印度"計劃和智能城市項目的推動。蜂窩物聯網連接數在2024年同比增長34%,2025年Q1增速進一步提升至32%,其中智能電表部署和資產追蹤應用成為核心驅動力。然而,市場也面臨著…

html學習:

ok,今天準備學一下html&#xff0c;花費點時間整理一下&#xff1a; HTML標簽的語法格式 HTML 中的標簽就像關鍵字一樣&#xff0c;每個標簽都有自己的語義&#xff08;含義&#xff09;。 HTML 標簽的語法格式 屬性↓ <div class"begin">cyx</div>↑…

CRYPT32!PkiAsn1Decode函數分析的一個例子

第一部分&#xff1a; 0: kd> g Breakpoint 35 hit CRYPT32!PkiAsn1Decode: 001b:75c9af0c 55 push ebp 1: kd> kc# 00 CRYPT32!PkiAsn1Decode 01 CRYPT32!PkiAsn1DecodeAndAllocInfo 02 CRYPT32!PkiAsn1DecodeAndAllocInfoEx 03 CRYPT32!Asn1InfoDecode…

大模型蒸餾、大模型微調、RAG

前言&#xff1a; 有很多同學想學習大模型開發&#xff0c;又無從下手&#xff0c;網上一搜&#xff0c;鋪天蓋地的付費課程。又不想當韭菜&#xff0c;打破認知障礙&#xff0c;通過自學&#xff0c;改變自己&#xff0c;改變世界&#xff01; 一、大模型蒸餾、微調、RAG的適…

25高教社杯數模國賽【E題保姆級思路+問題分析】

注&#xff1a;本內容由”數模加油站“ 原創出品&#xff0c;雖無償分享&#xff0c;但創作不易。 歡迎參考teach&#xff0c;但請勿抄襲、盜賣或商用。 E 題 AI輔助智能體測 《國家學生體質健康標準》的頒布&#xff0c;有效地促進了大中小學生關注自身體質健康的發展&#xf…

基于單片機車內換氣溫度檢測空氣質量檢測系統Proteus仿真(含全部資料)

全套資料包含&#xff1a;Proteus仿真源文件keil C語言源程序AD原理圖流程圖元器件清單說明書等 資料下載&#xff1a; 通過網盤分享的文件&#xff1a;資料分享 鏈接: 百度網盤 請輸入提取碼 提取碼: tgnu 目錄 資料下載&#xff1a; Proteus仿真功能 項目文件資料&#…

MySQL子查詢的分類講解與實戰

精選專欄鏈接 &#x1f517; MySQL技術筆記專欄Redis技術筆記專欄大模型搭建專欄Python學習筆記專欄深度學習算法專欄 歡迎訂閱&#xff0c;點贊&#xff0b;關注&#xff0c;每日精進1%&#xff0c;與百萬開發者共攀技術珠峰 更多內容持續更新中&#xff01;希望能給大家帶來…

Leetcode 206. 反轉鏈表 迭代/遞歸

原題鏈接&#xff1a;Leetcode 206. 反轉鏈表 解法一&#xff1a;迭代 /*** Definition for singly-linked list.* struct ListNode {* int val;* ListNode *next;* ListNode() : val(0), next(nullptr) {}* ListNode(int x) : val(x), next(nullptr) {}* …

C++11新特性 | 歡迎來到現代C++的世界!

左值與右值 左值與右值的概念 可以被取地址的值為左值&#xff08;left value&#xff0c;簡稱lvalue&#xff09;&#xff0c;否則為右值&#xff08;right value&#xff0c;簡稱rvalue&#xff09;。 常見的左值、右值例子&#xff1a; // >>>>>>> 左值…

因為對象裝箱拆箱導致的空指針異常

今天業務突然提了個事件單&#xff0c;客戶添加承租人一直報錯&#xff0c;但是很奇怪&#xff0c;報錯信息是空的二話不說&#xff0c;先跟API組要了接口和參數&#xff0c;然后看日志然鵝&#xff0c;這個接口并沒有打印日志&#xff0c;只有一個e.printStackTrace()然后靜下…

Rust 在 Windows 環境下交叉編譯其他操作系統可執行文件的詳細指南

前言&#xff1a;為什么需要交叉編譯&#xff1f; 想象一下這樣的場景&#xff1a;你在 Windows 電腦上開發了一個 Rust 程序&#xff0c;希望它能在 Linux 服務器上運行&#xff0c;或者在朋友的 macOS 電腦上測試 —— 總不能為了編譯不同系統的版本&#xff0c;專門買一臺 …

Ubuntu系統配置鏡像源

要修改的文件 /etc/apt/sources.list操作步驟 1. 備份原文件 sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak2. 編輯文件 sudo nano /etc/apt/sources.list3. 清空文件內容&#xff0c;填入以下內容 先獲取Ubuntu版本代號&#xff1a; lsb_release -cs然后根據版本填…

【Spring Cloud Alibaba】Sentinel(一)

【Spring Cloud Alibaba】Sentinel&#xff08;一&#xff09;1. 簡介2. 服務雪崩1. 簡介 Sentinel 是阿里巴巴開源的分布式系統的流量防護組件&#xff0c;主要用來做流量控制、熔斷降級、系統保護。它的定位類似于 Hystrix&#xff0c;但更側重在 流量治理 上。目前在微服務…

Delphi 5 操作Word表格選區問題解析

在 Delphi 5 中操作 Word 時&#xff0c;您遇到的 Selection.MoveDown 方法選中整行而不是僅移動一行的原因與 Word 的選擇機制和單元格內部結構有關。以下是詳細解釋和解決方案&#xff1a;問題分析單元格的選區范圍&#xff1a;當使用 .Cell(r, c).Select 選中單元格時&#…

小米fastboot不能被電腦識別但手機正常使用模式時能被電腦識別

小米手機USB連接電腦不識別解決方法 – MIUI歷史版本 小米手機USB連接電腦不識別解決方法 問題經驗 手機連接電腦通常會自動安裝驅動&#xff0c;如果驅動安裝失敗或是電腦不能識別手機設備&#xff0c;可嘗試下面方法。 1. 嘗試換根 USB 數據線&#xff0c;最好是手機原…

Git 版本管理工具基本操作匯總—命令總結

通常&#xff0c;很多朋友在使用 Git 的時候都會直接用 IDE 中集成的插件或者自帶的工具等來實現代碼的拉取、提交、合并以及其他操作&#xff0c;當然這肯定也是可以的&#xff0c;但是長期這樣子操作&#xff0c;我們就會忽略掉 Git 業務運行的底層邏輯。那么&#xff0c;我這…

自學嵌入式第三十三天:網絡編程-UDP

一、OSI模型(open system interconnect)開放系統互聯模型&#xff0c;分為7層應用層&#xff1a;為網絡用戶提供各種服務&#xff0c;例如電子郵件、文件傳輸等&#xff1b;表示層&#xff1a;為不同主機間的通信提供統一的數據表示形式。加密解密&#xff0c;壓縮&#xff1b;…