Spring底層原理之proxyBeanMenthod實例 動態代理 反射 Bean的攔截

proxyBeanMenthod

假設我們要進行一個系統的二次開發

然后第一次開發我們實用的是XML聲明bean

二次開發的時候要用注解

我們如何把bean都加載上來呢

我們首先創建一個全新的配置類

package com.bigdata1421.config;public class SpringConfig32 {
}

我們創建一個APP

加載配置類

拿到bean并且打印

package com.bigdata1421.bean.app;import com.bigdata1421.config.SpringConfig3;
import com.bigdata1421.config.SpringConfig32;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;public class App32 {public static void main(String[] args) {ApplicationContext ctx=new AnnotationConfigApplicationContext(SpringConfig32.class);String[] arr = ctx.getBeanDefinitionNames();for (String s : arr) {System.out.println(s);}}}

我們接下來就嘗試

在啟動SpringConfig32的時候

不僅要加載自己在類里面書寫的配置

還要加載xml文件里的配置

我們只需要這一個注解就行

package com.bigdata1421.config;import org.springframework.context.annotation.Import;
import org.springframework.context.annotation.ImportResource;@ImportResource("applicationContext1.xml")
public class SpringConfig32 {
}

spring內部最終就可以把這兩個配置信息

組合到一個容器里面

這樣就搞定了

這就是教我們系統遷移怎么做

小結

拓展

應該是在代理類里面做了方法增強,所以拿到的就是同一個對象

proxyBeanMethods

如果是true

就直接一開始創建了一個bean 然后進入spring容器里面去找bean

用事先就創建好的對象去調用方法 即返回同一個bean

如果是false

就每次執行都要去用對象執行方法

生成一個全新的對象 覆蓋

我們看以前的代碼

就可以進行解釋

在這個類里面

你只要是運行這個方法

得到的對象就是容器中取得bean

如果關掉

就根本就是spring容器中的對象 而是你new出來的

小結小結小結

補充

動態代理是面向對象編程中的一種重要技術,它允許在運行時創建一個實現特定接口或一組接口的代理類對象,而無需顯式編寫這些類的實現代碼。在Java中,動態代理主要通過Java反射機制實現,它通常與代理模式和AOP(面向切面編程)結合使用,以實現橫切關注點的分離和增強功能。


Java中動態代理的實現方式:

  1. Java反射機制

    • Java的反射機制允許在運行時檢查類、接口、方法和字段,并在運行時創建對象、調用方法、獲取或設置字段值等。

    • 動態代理就是利用反射機制在運行時動態生成代理類的技術。

  2. 代理類生成

    • Java動態代理通常使用java.lang.reflect.Proxy類實現。

    • 首先定義一個接口或者獲取一個接口的引用,然后使用Proxy.newProxyInstance()方法創建代理類實例。

  3. InvocationHandler接口

    • 實現動態代理需要一個實現InvocationHandler接口的類,該接口包含一個方法 invoke(Object proxy, Method method, Object[] args),在代理對象調用方法時被調用。

    • invoke()方法中,可以定義對原始方法調用的增強邏輯,例如添加日志、性能監控、事務處理等。

  4. 應用場景

    • AOP(面向切面編程):動態代理常用于實現AOP,通過代理類包裝業務邏輯,實現橫切關注點的分離。

    • 遠程方法調用(RMI):動態代理可以用于創建遠程對象的本地代理,隱藏遠程調用的具體實現細節。

    • 延遲加載(Lazy Loading):動態代理可以延遲加載對象,當真正需要使用時再實例化對象。

  5. 局限性

    • 動態代理只能代理接口,無法直接代理類。

    • 由于使用了反射機制,動態代理可能會帶來一定的性能開銷。


Spring容器是Spring Framework的核心部分,它負責管理應用中的組件(beans)并協調它們的生命周期和配置。Spring容器的主要功能包括:

  1. 依賴注入(Dependency Injection,DI):Spring容器通過依賴注入將組件之間的依賴關系動態地注入到組件中,從而實現了松耦合。

  2. AOP(Aspect-Oriented Programming,面向切面編程):Spring容器支持AOP,允許開發者通過切面來實現跨越應用邏輯的功能,如事務管理、日志記錄等。

  3. 事務管理:Spring容器提供了強大的事務管理支持,可以輕松地在應用中管理事務,支持聲明式事務配置。

  4. 簡化JDBC操作:Spring提供了JDBC模板(JdbcTemplate)等工具類,簡化了數據庫操作,減少了樣板代碼。

  5. 事件發布和監聽:Spring容器支持事件驅動模型,可以發布事件并允許其他組件監聽這些事件,實現了解耦和增強靈活性。

  6. 面向接口編程:Spring鼓勵面向接口編程,通過接口來實現依賴注入,使得代碼更易于測試和維護。

Spring容器主要有兩種類型:BeanFactoryApplicationContext。ApplicationContext是BeanFactory的子接口,提供了更多的企業級功能,如國際化、事件傳播等,是在大多數應用中推薦使用的容器類型。

總體來說,Spring容器是Spring框架的核心,它通過依賴注入和面向切面編程等特性,極大地簡化了Java應用的開發和維護工作。


proxyBeanMethods是Spring框架中的一個配置選項,它主要用于控制Spring Boot中@Configuration類的代理行為。在Spring中,通常使用@Configuration注解來標記一個類,表示這是一個配置類,可以包含@Bean方法用于定義Spring Bean。

作用和用法:

  1. 默認行為

    • 默認情況下,Spring會對@Configuration類進行CGLIB代理,以確保@Bean方法的調用可以被攔截,從而管理@Bean方法返回的實例的生命周期和依賴關系。

  2. proxyBeanMethods選項

    • proxyBeanMethods = true:這是Spring Boot 2.2版本引入的默認值。表示Spring會對@Configuration類進行代理,以支持方法調用的攔截和依賴管理。

    • proxyBeanMethods = false:這個選項告訴Spring不要對@Configuration類進行代理。這在某些情況下可以提高性能,尤其是當@Configuration類中的@Bean方法很簡單,不涉及復雜的依賴關系時。

  3. 性能考慮

    • proxyBeanMethods = false時,Spring不會為@Configuration類生成代理,這意味著@Bean方法的調用將直接返回實例,不經過Spring的AOP攔截器和增強處理,可以提高應用程序的啟動性能和運行時性能。

    • proxyBeanMethods = true時,雖然增加了一些性能開銷,但可以確保@Bean方法的各種功能(如AOP切面、依賴注入等)得到正確的支持和管理。

  4. 配置方式

    • 在Spring Boot中,可以通過在@Configuration類上使用@Configuration(proxyBeanMethods = true)或者@Configuration(proxyBeanMethods = false)來顯式指定代理行為。

  5. 建議

    • 通常情況下,使用默認的proxyBeanMethods = true是比較安全的選擇,因為它保證了Spring框架的各種功能可以正常工作。只有在確實需要優化性能時,才考慮將其設置為false


在Spring框架中,確保@Bean方法的調用可以被攔截意味著Spring容器能夠攔截對@Configuration類中@Bean方法的調用,并在需要時執行一些額外的邏輯或者處理。

具體來說,對@Configuration類中@Bean方法的攔截可以實現以下幾個方面的功能:

  1. AOP切面

    • Spring框架支持通過AOP(面向切面編程)攔截@Bean方法的調用。這意味著你可以使用切面來在方法執行前后執行額外的邏輯,比如日志記錄、性能監控、安全性檢查等。

  2. 依賴注入

    • 當@Bean方法返回的對象有依賴其他Spring管理的Bean時,Spring需要攔截@Bean方法的調用,以確保依賴的Bean可以被正確注入。

  3. 單例管理

    • Spring默認情況下會將@Configuration類中@Bean方法返回的對象作為單例管理,即每次調用@Bean方法返回的是同一個實例。這需要Spring能夠攔截@Bean方法的調用,并按照單例的要求進行管理。

  4. 條件化Bean的注冊

    • 通過條件化的方式,可以根據一定條件決定是否注冊某些@Bean方法返回的Bean實例。Spring在攔截@Bean方法時,可以根據條件進行判斷,從而控制Bean的注冊。

  5. Bean生命周期管理

    • Spring框架負責管理@Bean方法返回的Bean的生命周期,包括初始化和銷毀階段。攔截@Bean方法的調用是確保Spring可以在需要時執行這些生命周期管理操作的關鍵。

總體來說,Spring框架通過攔截@Configuration類中@Bean方法的調用,能夠實現對Bean的完整管理和控制,包括依賴注入、生命周期管理、AOP增強等。這種機制確保了Spring的IoC(控制反轉)和DI(依賴注入)特性能夠正常工作,使得開發者能夠專注于業務邏輯的實現而不必關心底層的管理和維護工作。


個人號推廣

博客主頁

多多!-CSDN博客

Web后端開發

https://blog.csdn.net/qq_30500575/category_12624592.html?spm=1001.2014.3001.5482

Web前端開發

https://blog.csdn.net/qq_30500575/category_12642989.html?spm=1001.2014.3001.5482

數據庫開發

https://blog.csdn.net/qq_30500575/category_12651993.html?spm=1001.2014.3001.5482

項目實戰

https://blog.csdn.net/qq_30500575/category_12699801.html?spm=1001.2014.3001.5482

算法與數據結構

https://blog.csdn.net/qq_30500575/category_12630954.html?spm=1001.2014.3001.5482

計算機基礎

https://blog.csdn.net/qq_30500575/category_12701605.html?spm=1001.2014.3001.5482

回憶錄

https://blog.csdn.net/qq_30500575/category_12620276.html?spm=1001.2014.3001.5482

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

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

相關文章

Perl語言入門學習讀物

1. PERL 是什么? Perl 最初的設計者為Larry Wall,Perl借取了C、sed、awk、shell scripting以及很多其他程序語言的特性。Perl一般被稱為“實用報表提取語言”(PracticalExtraction andReportLanguage),有時也被稱做“病態折中垃圾列表器”(Pathologica…

springboot+vue3無感知刷新token實戰

目錄 一、java后端 1、token構造實現類 ①驗證碼方式實現類 ②刷新token方式實現類 2、token相關操作:setCookie ①createToken ②refreshToken 二、前端(vue3axios) web網站中,前后端交互時,通常使用token機制…

全球最快的 JSON 文件查詢工具

本文字數:1684;估計閱讀時間:5分鐘 審校:莊曉東(魏莊) 本文在公眾號【ClickHouseInc】首發 介紹 在 ClickHouse,我們熱衷于基準測試和性能優化。所以當我第一次看到 Hacker News 上那篇“查詢大…

代碼隨想錄算法訓練營day31|134.加油站、135. 分發糖果、406.根據身高重建隊列

134.加油站 如下圖所示&#xff1a; 當索引一道2的時候&#xff0c;剩余油量的總量13-6 < 0&#xff0c;這個時候說明以索引0為起點不合適&#xff0c;將起點更新為索引3. 兩點證明&#xff1a; 1.如果我們從藍色段中間選一個點開始&#xff0c;是不是最后sumGas就不小于0…

從靈感到成品:使用AI生成博客文章的完整指南

在信息爆炸的時代&#xff0c;每個人都有講述自己故事的權利和需求。博客作為一種表達方式&#xff0c;不僅能記錄個人經歷&#xff0c;還能分享知識和觀點。然而&#xff0c;許多人在寫博客文章時&#xff0c;常常會遇到靈感枯竭、時間不夠用或者不知道如何開始等問題。幸運的…

光伏儲能系統/安科瑞DTSD1352-CF雙向計量表-安科瑞 蔣靜

1 長期以來&#xff0c;我國施行居民用電低價政策&#xff0c;居民電價大幅低于供電成本&#xff0c;雖然實施了全天分三時段的階梯電價政策&#xff0c;但過去近10年中高峰節電的效果卻不夠明顯。從分時用電運作機制來看&#xff0c;居民用電價格的波動幅度不大&#xff0c;但…

華為云鯤鵬架構docker部署2048小游戲

華為云鯤鵬架構docker部署2048小游戲 1. 鯤鵬架構ESC2. 配置docker3. 上傳2048鏡像4. 刪除容器,鏡像 1. 鯤鵬架構ESC 2. 配置docker 安裝dockeryum -y install docker開機啟動 systemctl enable docker啟動docker服務 systemctl start docker查詢docker的運行版本 docker -v3…

時序分析基本概念介紹——min pulse width 最小脈沖寬度

文章目錄 前言一、什么是 min pulse width&#xff1f;二、為什么檢查 min pulse width&#xff1f;三、如何設置 min pulse width約束&#xff1f;1. 在sdc里面定義2. library里面定義 四、如何檢查 min pulse width&#xff1f;五、如何修復 min pulse width&#xff1f;總結…

docker啟動ws-scrcpy和redroid記錄

git克隆最新的ws-scrcpy代碼 git clone gitgithub.com:NetrisTV/ws-scrcpy.git進入ws-scrcpy目錄新建Dockerfile文件&#xff0c;內容如下 FROM node:16-alpine WORKDIR /appRUN npm config set registry http://mirrors.cloud.tencent.com/npm/ RUN npm install -g node-gyp…

攻防世界-Web題目1

目錄 cookie 1、題目 2、知識點 3、思路 get_post 1、題目 2、知識點 3、思路 disabled_button 1、題目 2、知識點 3、思路 backup 1、題目 2、知識點 3、思路 cookie 1、題目 2、知識點 cookie&#xff0c;數據包 3、思路 題目提示我們cookie&#xff0c;抓…

Markdown中如何插入空行和空格

Markdown 是一種輕量級的標記語言&#xff0c;它的主要目標是以易讀易寫為優先&#xff0c;并兼容 HTML。雖然 Markdown 本身對于排版的要求比較寬松&#xff0c;但在某些情況下&#xff0c;我們可能需要在文檔中插入空行或空格來達到特定的排版效果。 插入空行 在Markdown中…

【ai】trition:tritonclient.utils.shared_memory 僅支持linux

Can’t find tritonclient.utils.shared_memory on WIN10 #4149yolov4的python客戶端 導入以后,windows 的pycharm 就是看不到折騰了很久:SaviorEnv 環境下安裝tritonclient[all]也會失敗 (base) C:\Users\zhangbin>conda create -n SaviorEnv python=3.8 Collecting pack…

ubuntu 18 虛擬機安裝(1)

ubuntu 18 虛擬機安裝 ubuntu 18.04.6 Ubuntu 18.04.6 LTS (Bionic Beaver) https://releases.ubuntu.com/bionic/ 參考&#xff1a; 設置固定IP地址 https://blog.csdn.net/wowocpp/article/details/126160428 https://www.jianshu.com/p/1d133c0dec9d ubuntu-18.04.6-l…

元數據管理的發展歷程你了解嗎?元數據管理要克服哪些挑戰?

在當今的信息化時代&#xff0c;數據的價值已被廣泛認可&#xff0c;而元數據作為描述數據的數據&#xff0c;其作用日益凸顯。元數據管理&#xff0c;作為確保數據質量、促進數據共享和提高數據透明度的關鍵環節&#xff0c;對企業的數據戰略至關重要。隨著技術的發展&#xf…

程序設計中對內存分配管理的思考,進程內存、線程內存、共享池、棧、堆

設計一個程序&#xff0c;要考慮如何分配和管理內存&#xff0c;以下是對所有內存分配和管理類型的總結。 第一、進程級的內存資源&#xff0c;也叫全局靜態內存&#xff0c;其生命周期是伴隨整個進程的運行期間&#xff0c;可以用作在進程范圍內共享數據的方法。對應于C語言的…

C#1.0-11.0所有歷史版本主要特性總結

文章目錄 前言名詞解釋主要版本一覽表各版本主要特性一句話總結 C# 1.0 (Visual Studio 2002, .Net Framework 1.0)C# 2.0 (Visual Studio 2005, .Net Framework 2.0)C# 3.0 (Visual Studio 2008, .Net Framework 3.0)C# 4.0 (Visual Studio 2010, .Net Framework 4)C# 5.0 (V…

Bigram 分詞學習

Bigram 分詞&#xff1a;概念、應用與中文實踐 Bigram 分詞是一種基礎而有效的文本處理技術&#xff0c;特別是在自然語言處理中有著廣泛的應用。本文將詳細解釋 Bigram 分詞的概念、它在各個領域的應用&#xff0c;以及在中文處理中的獨特優勢和實踐。 什么是 Bigram 分詞&a…

DataWhale - 吃瓜教程學習筆記(三)

學習視頻&#xff1a;第3章-對數幾率回歸_嗶哩嗶哩_bilibili 西瓜書對應章節&#xff1a; 3.3 對數幾率回歸 sigmoid函數 極大似然估計建模 信息論 以概率論、隨機過程為基本研究工具&#xff0c;研究廣義通信系統的整個過程 - 信息熵 &#xff08;信息期望&#xff09; 度…

Windows bat 提取多個目錄下的文件,到一個目錄

批處理命令 echo off setlocalrem 設置源目錄和目標目錄 set "sourceDirE:\motrix" set "targetDirE:\新建文件夾"rem 創建目標目錄&#xff0c;如果不存在 if not exist "%targetDir%" mkdir "%targetDir%"rem 循環遍歷源目錄中的所…

TCP:TCP連接的建立與終止

TCP連接的建立與終止 建立連接第一次握手第二次握手第三次握手 終止連接第一次揮手第二次揮手第三次揮手第四次揮手 T C P是一個面向連接的協議。無論哪一方向另一方發送數據之前&#xff0c;都必須先在雙方之間建立一條連接。本文將詳細討論一個T C P連接是如何建立的以及通信…