關于對Spring的理解,以及對spring中的兩大核心概念AOP和IOC的理解

我們先來說一說Spring,從總體上Spring就是一個基礎框架,同時Spring給我們提供了一個Bean容器,用來裝載和管理具體的Bean對象,你像我們之前創建對象的時候就是通過new關鍵字來實現的,但是現在我們只需要告訴容器有哪些對象,就會幫我們去創建好并且管理他的生命周期;然后呢,Spring又是Spring Boot,Spring Cloud等框架的基石,在原有Spring上去做了一些擴展和開發的;

Bean生命周期:

  • 定義Bean:通過<Bean>標簽或者(@Bean,@Component)注解來進行定義Bean,這一步Spring并不會去創建Bean,只是將Bean的描述信息存儲起來,等待后續的實例化和初始化

  • 注冊Bean:將定義信息會注冊到BeanFactoey或者ApplicationContext中

  • 實例化Bean(createBeanInstance):根據注解和配置文件實例化Bean,在實例化之前有一個方法postProcessMergedBeanDefinition()對Bean進行一些額外的配置或者修改,主要是對元數據進行一些修改

  • DI屬性注入:Spring將類通過構造器,setter方法或者接口注入到Bean實例當中

    其中過程中可能會插入一些自定義的邏輯(postProcessAfterInstantiation)和(postProcessProperties)一些Bean屬性的修改和校驗操作

    • 初始化之前調用一些Aware接口,在初始化之前去獲取Bean的名稱、Beanfactory、ApplicationContext方法中的一些前置操作,比如代理包裝和AOP切面等

  • 初始化Bean(initializeBean):調用initializeBean的afterPropertiesSet()方法或者通過init-method屬性指定的初始化方法

    • 初始化之后,通過一些BeanPostProcessor后置處理器進行一些處理(勾子和后置處理器)

  • 調用Bean:初始化完成,就可以被容器中的Bean使用

  • 銷毀Bean:容器關閉時,Spring有三種銷毀方法:通過@preDestory方法;實現DisposableBean接口的destory()方法;或者可以自定義銷毀方法

DI:依賴注入

然后又可以提出兩個核心概念IOC和AOP:

  • IOC(控制反轉):是一種控制反轉的思想,通過依賴注入實現的。IOC讓對象的創建和管理都交給容器來實現,而不是對象本身

    • 核心思想控制其實就是控制對象的創建,ICO容器通過配置文件來創建對象,在對象的生命周期中,在不同時期通過不同配置來進行對象的創建和改造;反轉其實就是關于我們創建對象和注入依賴的過程,本來是由我們程序員在代碼中指定的,而反轉之后,這個動作就交給ICO容器觸發,由主動獲取變成被動得到,在創建對象A的時候,發現依賴對象B,IOC容器就會根據配置文件,創建B,將B注入A中

    • 依賴注入:通過構造器注入、setter注入或者接口注入,將對象所需要的依賴傳遞給它,而不是讓對象自行創建依賴

    • 優點:1.降低耦合度:減少代碼之間的直接依賴,代碼更容易維護和擴展。 2.提高可測試性:更容易替換依賴進行單元測試,測試更方便。 3.增強靈活性:依賴關系可以通過配置文件或注解更改,代碼更靈活。 4.促進接口編程:有助于編寫更靈活的代碼,遵循面向接口編程的原則。 5.簡化管理:容器管理對象的創建和生命周期,開發更高效。 6.組件重用:組件可以更方便地組合使用,減少重復代碼。

  • AOP(面向切面編程):是一種編程范式,通過橫切關注點將與業務邏輯無關的分離出來,允許開發者通過“切面”將通用功能模塊化,將其應用到程序中的多個地方,避免代碼重復。(例如日志記錄,控制權限,安全檢查,事務管理等)

    • 核心思想:將與業務邏輯無關的橫切關注點抽取出來,通過動態代理的方式應用到業務方法,而不是將代碼直接寫入業務邏輯

    • 基本概念

      • 切面:橫切關注點的模塊化,比如日志、事務等。可以包含多個通知;

      • 連接點:程序執行中的某個點或者位置,例如方法調用,異常處理、字段訪問等;

      • 通知:定義在連接點處執行的動作,可以是一些方法前后,方法拋出異常時的操作

      • 切入點:定義在哪些連接點處的應用通知

    • 動態代理

      • JDK動態代理:通過代理接口來創建一個代理對象,代理對象實現目標類所實現的接口。依賴Java反射機制,由Proxy類和InvocationHandler接口來實現,代理類在運行時,調用其中的invoke()方法

        • 優點:簡單高效,代理類是接口的實現類,不需要第三方庫,Java自帶支持

        • 缺點:只能為實現了接口的類生成代理,如果目標沒事實現接口,就無法使用JDK動態代理

        • public class test1 {public static void main(String[] args) {Car car = new CarImpl();//生成代理對象,在調用方法時會轉發到invoke方法Car proxy = (Car) Proxy.newProxyInstance(car.getClass().getClassLoader(),car.getClass().getInterfaces(),new CarInvocationHandler(car));//這里drive方法會觸發invoke方法proxy.drive();}
          }
          interface Car {void drive();
          }
          class CarImpl implements Car {@Overridepublic void drive() {System.out.println("Car is driving...");}
          }class CarInvocationHandler implements InvocationHandler {//在創建對象的時候,接受一個target代理目標對象private Object target;public CarInvocationHandler(Object target) {this.target = target;}//invoke方法時InvocationHander接口中必須實現的方法,所有通過代理對象調用的方法都會進入這里@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {System.out.println("Before method " + method.getName());Object result = method.invoke(target, args);System.out.println("After method " + method.getName());return result;}
          }
      • CGLIB動態代理:通過生成目標類的子類,并重寫目標類中的方法來實現代理,代理類會覆蓋目標類中的方法,并在調用方法前后進行邏輯加強

      • 優點:能夠處理沒有實現接口的類,這是相比較JDK動態代理的優勢,可以適用于所有類

      • 缺點:生成目標子類,如果在大量創建代理對象的話,開銷可能會很大,性能可能也會比較低,不能代理final類或者final方法,因為final不能被繼承

      • class Car {public void drive() {System.out.println("Car is driving...");}
        }class CarInterceptor implements MethodInterceptor {@Overridepublic Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable {System.out.println("Before method " + method.getName());Object result = proxy.invokeSuper(obj, args); // 調用父類方法System.out.println("After method " + method.getName());return result;}
        }public class test2 {public static void main(String[] args) {Enhancer enhancer = new Enhancer();enhancer.setSuperclass(Car.class);enhancer.setCallback(new CarInterceptor());Car carProxy = (Car) enhancer.create();carProxy.drive();}
        }

        ?

  • **循環依賴問題**:就是指兩個或者多個模塊,類,組件之間相互依賴,相乘閉環;簡單舉一個例子,當A實例化完成以后,要去進行DI屬性注入,去getBean(B),但是B還沒有創建,那我就轉去實例化B,同樣,在B中DI屬性注入的時候也拿不到A,導致了循環依賴的發生;

    - **解決方法**(自定):一個簡單的解決方案,在Bean對象實例化完成后,就放入到一個緩存容器中,當其他Bean對象需要獲取到他時可以去緩存中調用,利用緩存去提前暴露對象

    - **解決方法**:其實無論用什么方法關鍵都是得提前暴露未創建完畢的Bean

    ? ??? ?在Spring中主要使用三級緩存來解決緩存依賴:

    ? - 一級緩存:用于存儲完全初始化完成的單例Bean
    - 二級緩存:存儲沒有完全初始換,但是已經實例化的Bean,用于提前暴露對象,避免出現循環依賴問題
    - 三級緩存:儲存對象工廠,當需要時,可以通過工廠創建早期的Bean

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

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

相關文章

Next Terminal 實戰:內網無密碼安全登錄

本文首發于 Anyeの小站&#xff0c;點擊閱讀原文體驗更加。 前言 在日常的 HomeLab 或小型私有云環境中&#xff0c;我們常常通過反向代理&#xff08;如 Nginx、Caddy 等&#xff09;將內網服務暴露到公網&#xff0c;方便遠程訪問。然而&#xff0c;一旦端口映射開啟、公網…

WebSocket斷線重連機制:保障實時通信的高可用性

一、為什么需要斷線重連&#xff1f;WebSocket雖提供全雙工通信能力&#xff0c;但實際環境中連接穩定性受多重威脅&#xff1a;??網絡層波動??&#xff1a;Wi-Fi切換、4G/5G信號抖動&#xff08;觸發onclose事件&#xff09;??服務端異常??&#xff1a;服務器宕機、主…

低空三維多物理場耦合風洞試驗,保證飛行器的性能安全是低空飛行的底線,是低空經濟發展的基礎

風墻\風矩陣開發背景&#xff1a;2024年被稱為中國低空經濟產業發展元年&#xff0c;國家發改委提出“無安全、不低空”原則&#xff0c;要求低空經濟產業在技術研發、適航認證、運營管理各環節優先保障安全。目前無人機及其他低空飛行器技術已深度融入軍事、民用與工業領域&am…

中文基于Qwen3-235B-2507蒸餾數據集的操作

中文基于Qwen3-235B-2507蒸餾數據集的操作 flyfish 方式1 from datasets import load_dataset from transformers import AutoTokenizer# -------------------------- 配置參數 -------------------------- TOKENIZER_PATH "/media/models/models/Qwen/Qwen3-8B/" #…

論文閱讀筆記:《Dataset Distillation by Matching Training Trajectories》

論文閱讀筆記&#xff1a;《Dataset Distillation by Matching Training Trajectories》1.動機與背景2.核心方法&#xff1a;軌跡匹配&#xff08;Trajectory Matching&#xff09;3.實驗與效果4.個人思考與啟發主體代碼算法邏輯總結一句話總結&#xff1a; 這篇論文通過讓合成…

STM32標準庫的工程創建

一.所需文件說明 1.啟動文件startup_xxxx.s 作用&#xff1a;初始化堆棧指針、復位向量、中斷向量表&#xff0c;執行 SystemInit() 后跳轉到 main()。 位置&#xff1a;Libraries/CMSIS/Device/ST/STM32Fxx/Source/Templates/arm/ 文件名&#xff1a; startup_stm32f10x_l…

k8s ceph sc 設置文件系統格式化參數

前言 默認的 sc 文件系統 inode 太少,對于小文件場景,往往會出現容量沒滿,inode 已經用盡的情況,本文說明如何設置 inode。 說明 本文使用的是 rook-ceph 部署的 ceph 作為存儲后端。 xfs 文件系統 sc 創建帶格式化參數的 xfs 文件系統的 sc allowVolumeExpansion: t…

關于Npm和Nvm的用法

npm是個什么東西 npm是什么 node package managernodejs包管理工具處理復雜的包的管理的問題那么使用npm以后就不需要從前端引入相應的代碼和文件等。 npm相關的命令 查看版本npm -v 更新npm install npm5.4.0 更新到最新版本npm install npmlatest 初始化項目 npm ini…

MyBatis高效查詢:簡化JDBC開發實戰

Mybatis MyBatis 是一款優秀持久層(DAO)框架&#xff0c;用于簡化 JDBC 開發 &#xff0c;原是 Apache 開源項目 iBatis&#xff0c;經歷遷移改名&#xff0c;2010 年從 Apache 遷到 Google Code 并改名&#xff0c;2013 年 11 月遷至 GitHub&#xff0c;官網為 https://mybati…

系統信息及進程管理命令

系統信息及進程管理 一、系統信息查看 常用命令&#xff1a;uname、hostnam、hostnamectl、uptime、df、du、free、lscpu 1、uname (1)、命令簡介 uname 是一個在 Unix 和類 Unix 系統&#xff08;如 Linux、macOS&#xff09;中常用的命令行工具&#xff0c;用于顯示系統信息。…

【Z字形變換】

代碼思路分析&#xff1a;Z 字形變換 1. 邊界情況處理 if (r 1 || r > n) return s;r 1&#xff1a;只有一行&#xff0c;直接返回原字符串&#xff08;無需變換&#xff09;。r > n&#xff1a;行數大于等于字符串長度&#xff0c;每行只有一個字符&#xff0c;直接返…

VBA中類的解讀及應用第二十五講:把源數據賦給類利用類完成查找

《VBA中類的解讀及應用》教程【10165646】是我推出的第五套教程&#xff0c;目前已經是第一版修訂了。這套教程定位于最高級&#xff0c;是學完初級&#xff0c;中級后的教程。類&#xff0c;是非常抽象的&#xff0c;更具研究的價值。隨著我們學習、應用VBA的深入&#xff0c;…

Vue3核心語法進階(Hook)

Vue3 自定義 Hook&#xff1a;讓你的代碼像樂高一樣“可復用”&#xff01;大家好&#xff0c;我是你們的前端小伙伴&#xff01;上一篇我們聊了 Vue3 的生命周期&#xff0c;今天咱們繼續深入 Vue3 的核心利器——自定義 Hook&#xff08;Custom Hook&#xff09;。如果你已經…

工控領域協議之Modbus

Modbus 是一種通信協議&#xff0c;用于工業自動化領域中的設備之間的通信。它是一種串行通信協議&#xff0c;廣泛應用于連接不同設備、傳感器和執行器的工業控制系統。 Modbus 在工業控制系統、自動化設備、能源管理系統等領域得到廣泛應用。 Modbus 協議的基本特點&#xff…

大件垃圾識別 mAP↑28%:陌訊多模態融合算法實戰解析

一、行業痛點&#xff1a;大件垃圾識別的現實困境在城市環衛智能化轉型過程中&#xff0c;大件垃圾&#xff08;如廢舊家具、電器等&#xff09;的自動化識別與分揀成為關鍵環節。據住建部《城市環境衛生發展報告》顯示&#xff0c;傳統人工分揀模式下大件垃圾識別準確率不足 6…

vk框架或者普通函數封裝的一些函數可以拿取使用【會持續更新】

1.身份證校驗【通用】/*** function isIDCard* description 判斷是否為有效的身份證號碼。* param {string} idCard - 待驗證的身份證號碼。* returns {boolean} 返回驗證結果。*/ pubFun.isIDCard function (idCard) {// 身份證號碼為15位或者18位&#xff0c;15位時全為數字…

如何給Word和WPS文檔添加密碼或取消密碼

要保護Word和WPS文檔&#xff0c;可以為它們加密&#xff0c;加密有兩類&#xff1a;打開密碼和修改密碼。密碼設置有兩個入口&#xff0c;一個是在另存為&#xff0c;一個是在文件菜單。Word和WPS文字的路徑略有不同&#xff0c;微軟Office和WPS的其他套件也是如此操作。一、W…

uni-app項目gitignore文件示例

uni-app 忽略以下文件和目錄 DS_Store 忽略 UniApp 編譯生成的小程序相關目錄 unpackage/ uni_modules/ 忽略編輯器自動生成的文件 idea/ vscode/ 忽略日志文件 logs/ 忽略臨時文件 temp/ 忽略構建工具自動生成的文件 build/ 忽略 npm 安裝的包文件 package-lock.json yarn.loc…

LeetCode 135:分糖果

LeetCode 135&#xff1a;分糖果問題本質與核心挑戰 給定孩子的評分數組&#xff0c;需滿足 “每個孩子至少1顆糖果&#xff0c;相鄰評分高的孩子糖果更多”&#xff0c;求最少糖果總數。核心挑戰&#xff1a; 相鄰約束是雙向的&#xff08;左→右和右→左都需滿足&#xff09;…

【QT】安裝與配置

個人主頁&#xff1a;Guiat 歸屬專欄&#xff1a;QT 文章目錄1. QT簡介與準備工作1.1 什么是QT1.2 QT的版本選擇1.3 系統要求檢查2. QT安裝方式詳解2.1 官方在線安裝器2.2 離線安裝包2.3 包管理器安裝3. Windows平臺安裝配置3.1 Windows安裝步驟3.2 環境變量配置3.3 Visual Stu…