最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

揭秘Spring核心注解@Configuration與@Component的本質區(qū)別

 更新時間:2025年07月10日 08:48:08   作者:一勺菠蘿丶  
在Spring框架中,@Configuration和@Component都是常用的注解,但它們有著本質的區(qū)別,本文將深入剖析這兩者的核心區(qū)別,并通過代碼示例展示它們的實際行為差異

引言:Spring中的兩個關鍵角色

在Spring框架中,@Configuration@Component都是常用的注解,但它們有著本質的區(qū)別。許多開發(fā)者在使用時容易混淆它們的行為,特別是當涉及@Bean方法時。本文將深入剖析這兩者的核心區(qū)別,并通過代碼示例展示它們的實際行為差異。

核心區(qū)別一覽表

場景被標記的類本身類內部調用 @Bean 方法
@Component/@Service 類默認單例每次調用都創(chuàng)建新對象
@Configuration 類默認單例調用其他 @Bean 方法返回單例

這個表格揭示了Spring中一個關鍵但常被誤解的區(qū)別:類本身的單例行為與類內部方法調用的單例行為是不同的概念。

場景一:業(yè)務組件(@Component/@Service)

類本身的單例行為

@Service // 等同于 @Component
public class UserService {
    // 業(yè)務邏輯...
}

類本身是單例

Spring容器只會創(chuàng)建一個UserService實例

通過@Autowired注入時

注入的是同一個實例

@Controller
public class UserController {
    @Autowired 
    private UserService service1; // 單例
    
    @Autowired 
    private UserService service2; // 同一個單例
    
    public void checkSingleton() {
        System.out.println(service1 == service2); // 輸出 true
    }
}

關鍵特性

  • Spring直接管理類的實例化(單例)
  • 不涉及方法調用攔截
  • 適用于業(yè)務邏輯組件(Service、Controller等)

場景二:配置類中的@Bean方法調用

危險示例:在@Component中調用@Bean方法

@Component // 錯誤用法!
public class DatabaseConfig {
    
    @Bean
    public DataSource dataSource() {
        System.out.println("創(chuàng)建新的DataSource實例");
        return new HikariDataSource(); // 創(chuàng)建連接池
    }
    
    @Bean
    public JdbcTemplate jdbcTemplate() {
        // 直接調用 → 每次創(chuàng)建新連接池!
        return new JdbcTemplate(dataSource()); 
    }
}

問題所在

當Spring調用jdbcTemplate()方法時:

直接執(zhí)行dataSource()方法

每次調用都new HikariDataSource() → 創(chuàng)建多個連接池

輸出結果:

創(chuàng)建新的DataSource實例
創(chuàng)建新的DataSource實例

根本原因

  • @Component類沒有代理機制
  • @Bean方法調用等同于普通Java方法調用
  • 導致單例被破壞,資源被重復創(chuàng)建

安全解決方案

方案一:使用@Configuration代理保護

@Configuration // 關鍵!
public class CorrectConfig {
    @Bean
    public A a() {
        return new A(b()); // ? 代理確??偡祷赝粚嵗?
    }
    
    @Bean
    public B b() { 
        System.out.println("創(chuàng)建B實例");
        return new B(); 
    }
}

代理機制

Spring通過CGLIB代理增強@Configuration

單例保護

多次調用b()返回同一個實例

輸出結果:

創(chuàng)建B實例 // 僅打印一次

方案二:使用方法參數注入(推薦)

@Configuration // 或 @Component
public class BestConfig {
    @Bean
    public A a(B b) { // ? 通過參數注入單例
        return new A(b);
    }
    
    @Bean
    public B b() { return new B(); }
}
  • 最安全的方式
  • 適用于@Configuration和@Component
  • 明確聲明依賴關系,代碼更清晰

為什么會有這種差異?

1.@Component/@Service類

  • Spring直接管理類的實例化(單例)
  • 不涉及方法調用攔截
  • 設計目標:業(yè)務組件實現(xiàn)

2.@Configuration類

  • Spring通過CGLIB代理增強類
  • 攔截@Bean方法調用,確保單例
  • 設計目標:Bean定義和配置中心

實際應用場景

正確使用@Configuration

@Configuration
public class AppConfig {
    // 全局單例的基礎設施
    @Bean
    public DataSource dataSource() {
        HikariDataSource ds = new HikariDataSource();
        ds.setJdbcUrl("jdbc:mysql://localhost/db");
        return ds;
    }
    
    // 安全調用其他@Bean方法
    @Bean
    public JdbcTemplate jdbcTemplate(DataSource dataSource) {
        return new JdbcTemplate(dataSource);
    }
}

正確使用@Component

@Service
public class OrderService {
    // 業(yè)務方法
    public void processOrder(Order order) {
        // 業(yè)務邏輯...
    }
}

常見錯誤及修復

錯誤示例

@Component // 錯誤!應該用@Configuration
public class PaymentConfig {
    @Bean
    public PaymentService paymentService() {
        // 每次創(chuàng)建新驗證器 → 破壞單例
        return new PaymentService(validator()); 
    }
    
    @Bean
    public Validator validator() { 
        return new PaymentValidator();
    }
}

修復方案

@Configuration // 修復方法1:改為@Configuration
public class PaymentConfig {
    @Bean
    public PaymentService paymentService(Validator validator) { // 修復方法2:參數注入
        return new PaymentService(validator);
    }
    
    @Bean
    public Validator validator() { 
        return new PaymentValidator();
    }
}

終極總結

“被@Component或@Service標記的類本身默認是單例的,@Autowired注入時不會創(chuàng)建新對象。

但在@Component類內部調用@Bean方法時,會像普通Java方法一樣執(zhí)行,每次調用都創(chuàng)建新實例。

而@Configuration類通過CGLIB代理,確??鏎Bean方法調用時始終返回單例。”

這個區(qū)別反映了Spring的兩種不同機制:

  • 組件管理@Component/@Service):處理類實例本身
  • 配置代理@Configuration):處理方法間的調用關系

結語

理解@Configuration@Component的本質區(qū)別對于構建健壯的Spring應用至關重要。記住以下黃金法則:

  • 配置基礎設施 → 使用@Configuration
  • 聲明業(yè)務組件 → 使用@Component/@Service/@Controller
  • 跨Bean依賴 → 總是使用方法參數注入

面試總結

"在 @Configuration 類中,所有 @Bean 方法都會CGLIB 代理。當在同一個配置類中調用其他 @Bean 方法時,Spring 會確保始終返回同一個單例實例。而在 @Component 類中,直接調用 @Bean 方法會像普通 Java 方法一樣執(zhí)行,每次調用都創(chuàng)建新實例,破壞單例性。

  • @Configuration 用于創(chuàng)建需要全局唯一的基礎設施(如數據庫連接池、線程池)
  • @Component 用于聲明業(yè)務組件(如Service、Controller), 一般不在@Component中去定義@Bean"

到此這篇關于揭秘Spring核心注解@Configuration與@Component的本質區(qū)別的文章就介紹到這了,更多相關Spring注解@Configuration與@Component內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • SpringBoot集成P6Spy實現(xiàn)SQL日志的記錄詳解

    SpringBoot集成P6Spy實現(xiàn)SQL日志的記錄詳解

    P6Spy是一個框架,它可以無縫地攔截和記錄數據庫活動,而無需更改現(xiàn)有應用程序的代碼。一般我們使用的比較多的是使用p6spy打印我們最后執(zhí)行的sql語句
    2022-11-11
  • SpringBoot整合Minio的過程(支持公有及私有bucket)

    SpringBoot整合Minio的過程(支持公有及私有bucket)

    Bucket 是存儲Object的邏輯空間,每個Bucket之間的數據是相互隔離的,對用戶而言,相當于存放文件的頂層文件夾,這篇文章主要介紹了SpringBoot整合Minio的過程(支持公有及私有bucket),需要的朋友可以參考下
    2025-03-03
  • 使用session實現(xiàn)簡易購物車功能

    使用session實現(xiàn)簡易購物車功能

    這篇文章主要為大家詳細介紹了使用session實現(xiàn)簡易購物車功能,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-02-02
  • Java 通過 二三法 巧解前端數據顯示

    Java 通過 二三法 巧解前端數據顯示

    實踐來源于理論,做開發(fā)前肯定要先了解相關的規(guī)則和原理,看到標題或許你會好奇什么是二三法。本篇文章帶你深入了解,需要的朋友可以參考下
    2021-10-10
  • 新手初學Java面向對象

    新手初學Java面向對象

    這篇文章主要介紹了Java語言面向對象編程思想之類與對象實例詳解,還是十分不錯的,這里給大家分享下,需要的朋友可以參考,希望能幫到你
    2021-07-07
  • 查看JDK安裝路徑,一臺電腦安裝多個版本的JDK并切換使用方式

    查看JDK安裝路徑,一臺電腦安裝多個版本的JDK并切換使用方式

    文章介紹了如何查看JDK安裝路徑以及如何在一臺電腦上安裝和切換多個版本的JDK(JDK?8、JDK?11、JDK?17),內容涵蓋了通過命令行查看JDK路徑的方法,以及如何下載、安裝和配置多個JDK版本,并通過修改環(huán)境變量來切換JDK版本
    2025-12-12
  • 集成Spring Redis緩存的實現(xiàn)

    集成Spring Redis緩存的實現(xiàn)

    今天小編就為大家分享一篇關于集成Spring Redis緩存的實現(xiàn),小編覺得內容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2018-12-12
  • Java性能調優(yōu)概述

    Java性能調優(yōu)概述

    本文介紹了Java程序性能的主要表現(xiàn)點、衡量程序性能的主要指標、性能調優(yōu)的層次、基本調優(yōu)策略和手段等,具有很好的參考價值,下面跟著小編一起來看下吧
    2017-02-02
  • 關于SpringBoot整合redis使用Lettuce客戶端超時問題

    關于SpringBoot整合redis使用Lettuce客戶端超時問題

    使用到Lettuce連接redis,一段時間后不操作,再去操作redis,會報連接超時錯誤,在其重連后又可使用,糾結是什么原因導致的呢,下面小編給大家?guī)砹薙pringBoot整合redis使用Lettuce客戶端超時問題及解決方案,一起看看吧
    2021-08-08
  • Spring?MVC中的常用注解及用法小結

    Spring?MVC中的常用注解及用法小結

    這篇文章主要介紹了Spring?MVC中的常用注解及其用法,本文通過實例代碼給大家介紹的非常詳細,需要的朋友可以參考下
    2024-02-02

最新評論

孟连| 满洲里市| 大荔县| 天峻县| 三门县| 永德县| 辉县市| 葫芦岛市| 金湖县| 茶陵县| 会泽县| 阿克陶县| 达日县| 漳浦县| 晴隆县| 英德市| 静乐县| 玉溪市| 满城县| 施甸县| 徐汇区| 泸定县| 东阿县| 于田县| 吉安县| 精河县| 漳平市| 临漳县| 铜鼓县| 唐海县| 濮阳市| 荥经县| 舟山市| 荃湾区| 杭锦后旗| 双辽市| 疏附县| 都安| 昌图县| 友谊县| 青浦区|