spring中的@Configuration注解詳解


一、概述與核心作用

@Configuration是Spring框架中用于定義配置類的核心注解,旨在替代傳統的XML配置方式,通過Java代碼實現Bean的聲明、依賴管理及環境配置。其核心作用包括:

  1. 標識配置類:標記一個類為Spring的配置類,容器啟動時會自動解析其中的Bean定義。
  2. 定義Bean:通過@Bean注解的方法聲明Spring管理的Bean實例。
  3. 依賴管理:支持通過構造函數或字段注入其他Bean,實現依賴關系的自動裝配。
  4. 條件化配置:結合@Conditional等注解,根據環境或屬性動態決定Bean的創建。
  5. 模塊化配置:通過@Import導入其他配置類,實現配置的分層與復用。

二、底層實現原理

  1. 配置類解析機制
    Spring通過ConfigurationClassPostProcessor后置處理器解析@Configuration類,分為三個階段:

    • 解析階段:掃描類中的@Bean方法及依賴關系,生成BeanDefinition對象。

    • 注冊階段:將BeanDefinition注冊到IoC容器中。

    • 驗證階段:檢查配置的合法性(如循環依賴)。

  2. 單例保證與代理機制
    Spring默認使用CGLIB動態代理為配置類生成子類,確保:

    • @Bean方法調用返回同一實例(單例模式)。

    • 避免直接調用@Bean方法導致多次實例化問題。

  3. 條件化配置實現
    結合@Conditional注解,通過實現Condition接口的matches()方法,根據環境變量、屬性文件等條件動態加載Bean。


三、使用示例與語法

  1. 基本配置類

    @Configuration
    public class AppConfig {@Beanpublic MyService myService() {return new MyServiceImpl();}
    }
    
    • @Bean方法返回的實例由Spring管理,默認單例。
  2. 依賴注入示例

    @Configuration
    public class ServiceConfig {@Autowiredprivate DataSource dataSource;@Beanpublic UserService userService() {return new UserServiceImpl(dataSource);}
    }
    

    ? 支持字段注入或構造函數注入依賴。

  3. 條件化Bean定義

    @Configuration
    public class EnvConfig {@Bean@ConditionalOnProperty(name = "env.mode", havingValue = "dev")public DataSource devDataSource() {return new DevDataSource();}
    }
    
    • 僅在env.mode=dev時創建該Bean。

四、高級特性與最佳實踐

  1. 模塊化配置
    將不同功能的配置拆分到多個類(如DataConfigWebConfig),通過@Import組合:

    @Configuration
    @Import({DataConfig.class, ServiceConfig.class})
    public class MainConfig {}
    
  2. 外部化屬性配置
    使用@PropertySource加載屬性文件,并通過@Value注入:

    @Configuration
    @PropertySource("classpath:application.properties")
    public class AppConfig {@Value("${app.name}")private String appName;
    }
    
  3. 避免硬編碼與手動實例化
    ? 優先通過@ComponentScan自動掃描組件,減少顯式@Bean定義。

    ? 禁止在配置類中手動new Bean(),否則繞過Spring生命周期管理。

  4. 處理有參構造函數
    ? 若配置類存在有參構造,需通過@Bean方法顯式實例化或使用@Autowired依賴注入:

    @Configuration
    public class MyConfig {@Beanpublic MyBean myBean(String param) {return new MyBean(param);}
    }
    

五、注意事項與常見問題

  1. 循環依賴
    配置類中若Bean A依賴Bean B,且B也依賴A,需通過@Lazy延遲加載或重構代碼結構。

  2. 代理模式的影響
    若需禁用CGLIB代理(如測試場景),可通過@Configuration(proxyBeanMethods = false)關閉,但需注意單例失效風險。

  3. 多環境配置
    結合@Profile注解區分不同環境的Bean定義(如開發、生產)。


六、@Configuration注解與@Component注解的區別

在Spring框架中,@Configuration@Component都是用于定義Spring Bean的注解,但它們在用途、行為和設計目的上有顯著的區別。以下是兩者的主要區別:

1. 核心用途與設計目的
  • @Configuration

    • 用途:用于標記一個類是配置類,通常用于定義Bean的創建邏輯和依賴關系。
    • 設計目的:通過@Bean方法顯式聲明Bean,支持復雜的Bean初始化邏輯(如條件判斷、依賴注入、方法調用等)。
    • 適用場景:需要集中管理Bean定義、支持編程式配置或動態配置時。
  • @Component

    • 用途:用于標記一個類是Spring管理的組件(如服務、DAO、工具類等)。
    • 設計目的:通過類掃描自動發現Bean,簡化配置。
    • 適用場景:普通組件類,無需復雜初始化邏輯。

2. Bean的創建方式
  • @Configuration

    • 通過@Bean方法顯式定義Bean。
    • 關鍵行為
      • 默認使用CGLIB代理,確保@Bean方法在同一個配置類中多次調用時返回同一個Bean實例(避免重復創建)。
      • 支持方法間的依賴注入(例如,一個@Bean方法可以調用另一個@Bean方法)。
    • 示例
      @Configuration
      public class AppConfig {@Beanpublic ServiceA serviceA() {return new ServiceA();}@Beanpublic ServiceB serviceB() {// 依賴注入serviceAreturn new ServiceB(serviceA());}
      }
      
  • @Component

    • 通過類掃描自動注冊Bean。
    • 關鍵行為
      • 不支持@Bean方法,Bean的創建邏輯通常在類的構造函數或初始化方法中定義。
      • 如果需要依賴其他Bean,通過@Autowired注入。
    • 示例
      @Component
      public class MyService {private final Dependency dependency;@Autowiredpublic MyService(Dependency dependency) {this.dependency = dependency;}
      }
      

3. 代理機制
  • @Configuration

    • 使用CGLIB代理,確保@Bean方法在同一個配置類中多次調用時返回同一個實例
    • 示例
      @Configuration
      public class Config {@Beanpublic BeanA beanA() {return new BeanA();}@Beanpublic BeanB beanB() {// 多次調用beanA()返回同一個實例return new BeanB(beanA(), beanA()); }
      }
      
  • @Component

    • 不使用代理,直接實例化類。如果類中包含方法調用(非@Bean方法),每次調用都會創建新實例。
    • 示例
      @Component
      public class MyComponent {public BeanA createBeanA() {return new BeanA(); // 每次調用都會創建新實例}
      }
      

4. 適用場景對比
場景推薦使用原因
集中管理Bean定義@Configuration支持@Bean方法、方法間依賴、條件化配置等。
普通組件類@Component簡化配置,通過類掃描自動發現。
動態Bean初始化邏輯@Configuration可以通過@Bean方法實現條件判斷、環境依賴等復雜邏輯。
靜態Bean定義@Component適合無復雜邏輯的組件類。
測試或Mock配置@Configuration方便在測試中覆蓋或替換Bean。

5. 其他相關注解
  • @Component的派生注解
    • @Service@Repository@Controller等都是@Component的特化版本,功能相同,但語義更明確。
  • @Configuration的擴展
    • @Profile:結合@Configuration實現條件化配置。
    • @Import:導入其他配置類。

6. 總結
  • @Configuration:用于配置類,支持@Bean方法和復雜Bean初始化邏輯,適合集中管理Bean定義。
  • @Component:用于普通組件類,通過類掃描自動注冊,適合簡單組件。

選擇建議

  • 如果需要定義Bean的創建邏輯或管理依賴關系,使用@Configuration
  • 如果只是標記一個普通類為Spring Bean,使用@Component或其派生注解(如@Service)。

總結

@Configuration注解是Spring實現Java-Based配置的核心工具,通過動態代理、條件化加載和模塊化設計,簡化了Bean管理與依賴注入流程。合理使用其特性可顯著提升代碼的可維護性與靈活性,同時需注意避免循環依賴和硬編碼問題。


spring中的@bean注解詳解

在這里插入圖片描述

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

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

相關文章

7.計算機網絡相關術語

7. 計算機網絡相關術語 ACK (Acknowledgement) 確認 ADSL (Asymmetric Digital Subscriber Line) 非對稱數字用戶線 AP (Access Point) 接入點 AP (Application) 應用程序 API (Application Programming Interface) 應用編程接口 APNIC (Asia Pacific Network Informatio…

Hadoop 集群基礎指令指南

目錄 🧩 一、Hadoop 基礎服務管理指令 ?? 啟動 Hadoop ?? 關閉 Hadoop 🧾 查看進程是否正常運行 📁 二、HDFS 常用文件系統指令 🛠? 三、MapReduce 作業運行指令 📋 四、集群狀態監控指令 💡 …

【MySQL數據庫】事務

目錄 1,事務的詳細介紹 2,事務的屬性 3,事務常見的操作方式 1,事務的詳細介紹 在MySQL數據庫中,事務是指一組SQL語句作為一個指令去執行相應的操作,這些操作要么全部成功提交,對數據庫產生影…

一、OrcaSlicer源碼編譯

一、下載 1、OrcaSlicer 2.3.0版本的源碼 git clone https://github.com/SoftFever/OrcaSlicer.git -b v2.3.0 二、編譯 1、在OrcaSlicer目錄運行cmd窗口,輸入build_release.bat 2、如果出錯了,可以多運行幾次build_release.bat 3、在OrcaSlicer\b…

港口危貨儲存單位主要安全管理人員考試精選題目

港口危貨儲存單位主要安全管理人員考試精選題目 1、危險貨物儲存場所的電氣設備應符合( )要求。 A. 防火 B. 防爆 C. 防塵 D. 防潮 答案:B 解析:港口危貨儲存單位存在易燃易爆等危險貨物,電氣設備若不防爆&…

格雷希爾用于工業氣體充裝站的CZ系列氣罐充裝轉換連接器,其日常維護有哪些

格雷希爾氣瓶充裝連接器,長期用于壓縮氣體的快速充裝和壓縮氣瓶的氣密性檢測,需要進行定期的維護,為每一次的充裝提供更好的連接。下列建議的幾點維護準則適用于格雷希爾所有充注接頭,請非專業人士不要隨意拆卸連接器。 格雷希爾氣…

Java 多線程進階:什么是線程安全?

在多線程編程中,“線程安全”是一個非常重要但又常被誤解的概念。尤其對于剛接觸多線程的人來說,不理解線程安全的本質,容易寫出“偶爾出錯”的代碼——這類 bug 往往隱蔽且難以復現。 本文將用盡可能通俗的語言,從三個角度解釋線…

MSO-Player:基于vlc的Unity直播流播放器,支持主流RTSP、RTMP、HTTP等常見格式

MSO-Player 基于libVLC的Unity視頻播放解決方案 支持2D視頻和360度全景視頻播放的Unity插件 📑 目錄 🎥 MSO-Player 📋 功能概述🚀 快速入門📚 關鍵組件📝 使用案例🔌 依賴項📋 注意…

navicat中導出數據表結構并在word更改為三線表(適用于navicat導不出doc)

SELECTCOLUMN_NAME 列名,COLUMN_TYPE 數據類型,DATA_TYPE 字段類型,IS_NULLABLE 是否為空,COLUMN_DEFAULT 默認值,COLUMN_COMMENT 備注 FROMINFORMATION_SCHEMA.COLUMNS WHEREtable_schema db_animal(數據庫名) AND table_name activity(…

docker學習筆記6-安裝wordpress

一、創建自定義網絡、查看網絡 docker netword create blog docker network ls 二、 啟動mysql容器 啟動命令: docker run -d -p 3306:3306 \ -e MYSQL_ROOT_PASSWORD123456 \ -e MYSQL_DATABASEwordpress \ -v mysql-data:/var/lib/mysql \ -v /app/myconf:/etc…

03_Mybatis-Plus LambadaQueryWrapper 表達式爆空指針異常

&#x1f31f; 03_MyBatis-Plus LambdaQueryWrapper 爆出空指針異常的坑點分析 ? 場景描述 來看一段常見的 MyBatis-Plus 查詢寫法&#xff0c;是否存在問題&#xff1f; Page<VideoInfoVo> videoInfoVosPage videoMapper.selectPage(page, new LambdaQueryWrapper&…

WEB安全--社會工程--SET釣魚網站

1、選擇要釣魚的網站 2、打開kali中的set 3、啟動后依次選擇&#xff1a; 4、輸入釣魚主機的地址&#xff08;kali&#xff09;和要偽裝的網站域名&#xff1a; 5、投放釣魚網頁&#xff08;服務器域名:80&#xff09; 6、獲取賬號密碼

Ethan獨立開發產品日報 | 2025-04-29

1. mrge 代碼審查的光標 mrge 是一個由人工智能驅動的代碼審查平臺&#xff0c;能夠自動審核拉取請求&#xff08;PR&#xff09;&#xff0c;為人工審查員提供超級能力。它是像 cal.com 和 n8n 這樣快速發展的團隊的首選工具。 關鍵詞&#xff1a;mrge, 代碼審查, AI驅動, …

ubuntu22.04 qemu arm64 環境搭建

目錄 創建 安裝 Qemu 啟動 # 進入qemu虛擬機后執行 qemu編譯器安裝 創建 qemu-img create ubuntu22.04_arm64.img 40G 安裝 qemu-system-aarch64 -m 4096 -cpu cortex-a57 -smp 4 -M virt -bios QEMU_EFI.fd -nographic -drive ifnone,fileubuntu-22.04.5-live-server-a…

安全生產知識競賽宣傳口號160句

1. 安全生產是責任&#xff0c;每個人都有責任 2. 安全生產是保障&#xff0c;讓我們遠離危險 3. 安全生產是團結&#xff0c;共同守護每一天 4. 注重安全&#xff0c;守護明天 5. 安全生產無小事&#xff0c;關乎千家萬戶 6. 安全第一&#xff0c;人人有責 7. 安全生產無差別&…

Python 虛擬環境管理:venv 與 conda 的選擇與配置

文章目錄 前言一、虛擬環境的核心價值1.1 依賴沖突的典型場景1.2 隔離機制實現原理 二、venv 與 conda 的架構對比2.1 工具定位差異2.2 性能基準測試&#xff08;以創建環境 安裝 numpy 為例&#xff09; 三、venv 的配置與最佳實踐3.1 基礎工作流3.2 多版本 Python 管理 四、…

【自然語言處理與大模型】如何獲取特定領域的微調數據集?

在特定領域中&#xff0c;數據集通常由提出需求的一方提供。然而&#xff0c;在某些情況下&#xff0c;如果他們未能提供所需的數據&#xff0c;或者你正在獨立開展一個項目&#xff0c;并且需要相應的數據來推進工作&#xff0c;這時你應該怎么辦呢&#xff1f;本文提供一種思…

Map系列之ConcurrentHashMap源碼分析:高并發場景下的性能密碼

引言&#xff1a;當線程安全成為剛需 1.1 并發時代的Map困境 經典案例&#xff1a;電商秒殺系統超賣事故分析&#xff08;附線程堆棧截圖&#xff09;傳統方案缺陷&#xff1a;synchronizedMap的吞吐量陷阱&#xff08;JMH測試數據對比&#xff09;ConcurrentHashMap的定位&a…

URP - 序列圖動畫的實現

效果&#xff1a; 【太妃糖耶】更新了一條視頻&#xff0c;快來圍觀&#xff01; 序列圖動畫的實現 首先先了解下序列圖樣式的紋理圖片 如上圖一可在Shader中使用該圖片制作燃燒的火的動畫&#xff0c;但是如何實現呢&#xff1f;接下來一起來看一下吧 序列圖動畫的實現原理大…

python中 str.strip() 是什么意思

在 Python 中&#xff0c;str.strip() 是字符串&#xff08;str&#xff09;類型的一個方法&#xff0c;用于移除字符串兩端的空白字符&#xff08;默認情況下&#xff09;或指定字符&#xff0c;并返回處理后的新字符串。 語法&#xff1a; str.strip([chars])chars&#xf…