Spring中的IOC及AOP概述

前言

  • Spring 框架的兩大核心設計思想是 IOC(控制反轉) 和 AOP(面向切面編程)。
  • 它們共同解決了代碼耦合度高、重復邏輯冗余等問題。

IOC(控制反轉)

1.核心概念

  • 控制反轉(Inversion of Control):將對象的創建、生命周期管理和依賴關系的控制權從應用程序代碼轉移給外部容器(如 Spring的IOC容器)。
  • 依賴注入(Dependency Injection, DI):IOC 的具體實現方式,容器通過構造函數、Setter 方法或字段反射等方式,自動將依賴對象注入到目標對象中。

2.解決的問題

  • 傳統開發的問題:對象直接通過 new 創建依賴,導致代碼高度耦合(如 Service 直接依賴 Dao 的具體實現)。
  • IOC 的優勢:
    • 解耦:對象依賴由容器管理,開發者無需手動處理。
    • 靈活配置:通過配置文件或注解動態替換實現類(如切換數據庫驅動)。
    • 資源復用:Spring 容器默認以單例模式管理 Bean,減少資源消耗。

3.實現方式

  • XML 配置:通過 <bean標簽定義 Bean 及其依賴。
  • 注解驅動:如 @Component、@Autowired、@Service 等,簡化配置。
  • Java Config:使用 @Configuration 和 @Bean 以編程方式定義 Bean。

4.核心容器

  • BeanFactory:基礎容器,提供 Bean 的實例化和依賴注入。
  • ApplicationContext:擴展了 BeanFactory,支持國際化、事件傳播、AOP 等高級功能。

AOP(面向切面編程)

1.核心概念

  • 橫切關注點(Cross-Cutting Concerns):散布在多個模塊中的公共邏輯(如日志、事務、權限校驗)。
  • AOP 的目標:將這些橫切邏輯從業務代碼中剝離,通過動態代理技術織入目標方法,實現代碼復用和解耦。

2.關鍵術語

  • 切面(Aspect):封裝橫切邏輯的類(如日志切面)。
  • 連接點(JoinPoint):程序執行中的特定位置(如方法調用、異常拋出)。
  • 切點(Pointcut):通過表達式匹配需要增強的連接點(如 execution( com.example.service…*(…)))。
  • 通知(Advice):
    • 前置通知(Before):在目標方法執行前執行。
    • 后置通知(After):在目標方法執行后執行(無論是否異常)。
    • 返回通知(AfterReturning):在目標方法正常返回后執行。
    • 異常通知(AfterThrowing):在目標方法拋出異常后執行。
    • 環繞通知(Around):包裹目標方法,可控制其執行過程。

3.實現原理

  • JDK 動態代理:基于接口代理,要求目標類實現接口。
  • CGLIB 動態代理:通過生成目標類的子類實現代理,適用于無接口的類。
  • 織入(Weaving):將切面邏輯與目標類結合的時機,支持編譯期、類加載期和運行期織入。

4.應用場景

  • 日志記錄:統一記錄方法入參、出參和執行時間。
  • 事務管理:通過 @Transactional 注解實現聲明式事務。
  • 權限校驗:在方法執行前檢查用戶權限。
  • 接口限流與冪等:防止重復提交或高并發場景下的資源爭搶。

IOC和AOP的協同

  • IOC 提供基礎設施:Spring 容器管理 Bean 的創建和依賴,為 AOP 提供代理對象的生成環境。
  • AOP 增強 Bean:通過動態代理技術,對容器管理的 Bean 進行功能擴展,實現非侵入式的邏輯增強。

代碼示例

  • 傳統代碼(高耦合)
  • 當修改了實現類的名稱時,所有代碼中new該對象的地方都要修改,不易于維護
public class UserService {/*** 當實現類的名稱修改時,如UserDaoImpl --> UserDaoImpl-01* 則所有代碼中的 new UserDaoImpl() 都要修改為 new UserDaoImpl-01() * 不易維護,代碼耦合度過高**/private UserDao userDao = new UserDaoImpl();public void saveUser() {userDao.save();}
}
  • IOC+AOP優化后
// 1. 通過 IOC 解耦
@Service
public class UserService {@Autowiredprivate UserDao userDao; // 依賴接口,具體實現由容器注入public void saveUser() {userDao.save();}
}// 2. 通過 AOP 添加日志
@Aspect
@Component
public class LogAspect {@Before("execution(* com.example.service.*.*(..))")public void logBefore(JoinPoint joinPoint) {System.out.println("方法執行: " + joinPoint.getSignature().getName());}
}

總結

  • IOC 通過控制反轉和依賴注入,解決了對象間的強耦合問題。
  • AOP 通過動態代理和切面編程,實現了橫切邏輯的復用和解耦。
  • 二者共同構建了 Spring 的輕量級、高擴展性架構,廣泛應用于企業級開發。

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

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

相關文章

STM32_HAL開發環境搭建【Keil(MDK-ARM)、STM32F1xx_DFP、 ST-Link、STM32CubeMX】

安裝Keil(MDK-ARM)【集成開發環境IDE】 我們會在Keil(MDK-ARM)上去編寫代碼、編譯代碼、燒寫代碼、調試代碼。 Keil(MDK-ARM)的安裝方法&#xff1a; 教學視頻的第02分03秒開始看。 安裝過程中請修改一下下面兩個路徑&#xff0c;避免占用C盤空間。 Core就是Keil(MDK-ARM)的…

python 第三方庫 - dotenv讀取配置文件

.env 文件是一種用于存儲環境變量的配置文件&#xff0c;常用于項目的運行環境設置。環境變量是操作系統層面的一些變量&#xff0c;它們可以被應用程序訪問和使用&#xff0c;通常包含敏感信息或特定于環境的配置&#xff0c;如數據庫連接信息、API 密鑰、調試模式等。 安裝p…

用python壓縮圖片大小

下載庫 cmd開命令或者PyCharm執行都行 pip install pillow2. 然后就是代碼 from PIL import Imagedef compress_image(input_path, output_path, quality85, max_sizeNone):"""壓縮圖片大小。參數:- input_path: 輸入圖片路徑- output_path: 輸出圖片路徑- qu…

【自用記錄】本地關聯GitHub以及遇到的問題

最近終于又想起GitHub&#xff0c;想上傳代碼和項目到倉庫里。 由于很早之前有在本地連接過GitHub&#xff08;但沒怎么用&#xff09;&#xff0c;現在需要重新搞起&#xff08;操作忘得差不多&#xff09;。 在看教程實操的過程中遇到了一些小問題&#xff0c;遂記錄一下。 前…

在一個scss文件中定義變量,在另一個scss文件中使用

_variables.scss文件 : $line-gradient-init-color: linear-gradient(90deg, #8057ff 0%, #936bff 50%, #b892ff 100%); $line-gradient-hover-color: linear-gradient(90deg, #936bff 0%, #b892ff 50%, #f781ce 100%); $line-gradient-active-color: linear-gradient(90deg, …

從零開始研發GPS接收機連載——19、自制GPS接收機的春運之旅

提示&#xff1a;文章寫完后&#xff0c;目錄可以自動生成&#xff0c;如何生成可參考右邊的幫助文檔 從零開始研發GPS接收機連載——19、自制GPS接收機的春運之旅 許久未曾更新這個系列&#xff0c;并非我平日里對這事兒沒了興致&#xff0c;不再愿意折騰。實則是受限于自身條…

智能駕駛功能LCC車道保持居中

畫龍現象就是LCC常見bug LDW車道偏離預警 LKA車道保持 聲音其實就是蜂鳴器 有些車是40 有些是60

Java全棧面試寶典:線程機制與Spring依賴注入深度解析

目錄 一、Java線程核心機制 &#x1f525; 問題3&#xff1a;start()與run()的底層執行差異 線程啟動流程圖解 核心差異對照表 代碼驗證示例 &#x1f525; 問題4&#xff1a;Thread與Runnable的六大維度對比 類關系UML圖 最佳實踐代碼 &#x1f525; 問題5&#xff1…

使用ANTLR4解析Yaml,JSON和Latex

文章目錄 ANTLR4基本使用**1. 安裝 Java 運行時&#xff08;必需&#xff09;****2. 安裝 ANTLR4 命令行工具****方法一&#xff1a;通過包管理器&#xff08;推薦&#xff09;****macOS/Linux (Homebrew)****Windows (Chocolatey)** **方法二&#xff1a;手動安裝&#xff08;…

NixVis 開源輕量級 Nginx 日志分析工具

NixVis NixVis 是一款基于 Go 語言開發的、開源輕量級 Nginx 日志分析工具&#xff0c;專為自部署場景設計。它提供直觀的數據可視化和全面的統計分析功能&#xff0c;幫助您實時監控網站流量、訪問來源和地理分布等關鍵指標&#xff0c;無需復雜配置即可快速部署使用。 演示…

黑盒測試的等價類劃分法(輸入數據劃分為有效的等價類和無效的等價類)

重點: 有效等價和單個無效等價各取1個即可 1、正向用例:一條盡可能覆蓋多條2、逆向用例:每一條數據&#xff0c;都是一條單獨用例。 步驟: 1、明確需求 2、確定有效和無效等價 3、根據有效和無效造數據編寫用例 3、適用場景 針對:需要有大量數據測試輸入&#xff0c; …

Linux Mem -- 通過reserved-memory縮減內存

目錄 1. reserved-memory縮減內存 2. 為什么要通過2段512GB預留內存實現該縮減呢&#xff1f; 3. reserved-momery中的no-map屬性 4. 預留的的內存是否會被統計到系統MemTotal中&#xff1f; 本文是解決具體的一些思考總結&#xff0c;和Linux內核的reserved-memory機制相關…

多線程—synchronized原理

上篇文章&#xff1a; 多線程—鎖策略https://blog.csdn.net/sniper_fandc/article/details/146508232?fromshareblogdetail&sharetypeblogdetail&sharerId146508232&sharereferPC&sharesourcesniper_fandc&sharefromfrom_link 目錄 1 synchronized的鎖…

AWS混合云部署實戰:打造企業級數字化轉型的“黃金架構”

引言 “上云是必然&#xff0c;但全部上云未必是必然。”在數字化轉型的深水區&#xff0c;企業面臨的核心矛盾日益凸顯&#xff1a;如何在享受公有云敏捷性的同時&#xff0c;滿足數據主權、低延遲和遺留系統兼容的剛性需求&#xff1f; AWS混合云憑借“云上云下一張網”的獨…

進程模型5-0號進程

內核版本架構作者GitHubCSDNLinux-3.0.1armv7-ALux1206 0號進程的作用 在 Linux 中除了 init_task 0號進程&#xff0c;所有的線/進程都是通過 do_fork 函數復制父線/進程創建得到&#xff0c;因為 0號進程產生時沒有任何進程可以參照&#xff0c;只能通過靜態方式構造進程描述…

計算機二級考前急救(Word篇)

重點題&#xff08;20套&#xff0c;標黃為精選10套&#xff09;&#xff1a;4&#xff0c;15&#xff0c;17&#xff0c;19&#xff0c;21&#xff0c;24&#xff0c;25&#xff0c;27&#xff0c;36&#xff0c;40&#xff0c;12&#xff0c;18&#xff0c;20&#xff0c;22&…

constant(safe-area-inset-bottom)和env(safe-area-inset-bottom)在uniapp中的使用方法解析

在微信小程序中&#xff0c;padding-bottom: constant(safe-area-inset-bottom); 和 padding-bottom: env(safe-area-inset-bottom); 這兩個 CSS 屬性用于處理 iPhone X 及更高版本設備的安全區域&#xff08;safe area&#xff09;。這些設備的底部有一個“Home Indicator”&a…

十二、Cluster集群

目錄 一、集群簡介1、現狀問題2、集群作用 二、集群結構設計1、集群存儲設2、消息通信設計 三、Cluster集群三主三從結構搭建1、redis.conf配置文件可配置項2、配置集群3、鏈接集群4、命令客戶端連接集群并使用 四、集群擴容1、添加節點2、槽位分配3、添加從節點 五、集群縮容1…

Java基礎 3.29

1.數組的相關注意事項 錯誤示范一 String strs[] new String[2]{"a", "b"}; 正確示范一 String strs[] new String[]{"a", "b"}; 讓JVM自己判斷有幾個數據&#xff0c;無需再其中寫明有幾組數據 錯誤示范二 String strs[] new…

從入門到精通:HTML 項目實戰中的學習進度(一)

一、基礎夯實階段 1.1 HTML 文檔結構與核心語法 在 HTML5 的世界里&#xff0c;構建一個文檔就像是搭建一座大廈&#xff0c;堅實的基礎至關重要。HTML5 文檔的基礎框架以<!DOCTYPE html>聲明開場&#xff0c;這就好比是給瀏覽器下達的一份 “指令書”&#xff0c;明確…