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

Spring創(chuàng)建Bean的多種方式對比與最佳實踐

 更新時間:2025年10月18日 09:43:37   作者:渣哥  
本文詳細(xì)梳理了Spring項目中Bean的六種常見創(chuàng)建方式(@Component、@Bean、FactoryBean、@Import、XML、運(yùn)行時注冊),對每種適用場景、優(yōu)缺點與最佳實踐進(jìn)行了總結(jié),并給出了選擇方法的決策清單與常見誤區(qū)規(guī)避建議,需要的朋友可以參考下

第一次接手老項目,我最懵的一件事是:同一個項目里,創(chuàng)建 Bean 的姿勢能有五六種——@Component、@Bean、FactoryBean、@Import、XML、甚至運(yùn)行時注冊。到底選誰?標(biāo)準(zhǔn)究竟是什么?

下面把常見方式逐一拆開,順手給你一張“怎么選”的腦圖。

一、有哪些主流方式?

1) 組件掃描:@Component 家族(含 @Service/@Repository/@Controller)

怎么用

@Component
public class OrderService { }

特點

  • 簡單、直觀、與分層語義強(qiáng)綁定(@Service 等)。
  • 適合常規(guī)業(yè)務(wù)類;依賴通過構(gòu)造器注入最佳。
  • 與 AOP、校驗、事務(wù)天然契合。

何時選:90% 的業(yè)務(wù)類、無外部構(gòu)造復(fù)雜度的 Bean。

2) Java 配置:@Configuration + @Bean

怎么用

@Configuration
public class AppConfig {
  @Bean
  public IdGenerator idGenerator() { return new SnowflakeIdGenerator(...); }
}

特點

  • 顯式聲明生命周期、構(gòu)造參數(shù)、工廠方法。
  • 可精細(xì)控制作用域、init/destroy、@Conditional@Profile 等。
  • 注意@Configuration 默認(rèn) proxyBeanMethods = true(Full 模式,會 CGLIB 代理確保單例跨 @Bean 調(diào)用);在不需要跨方法引用保障的場景可設(shè) false(Lite 模式)提升啟動性能。

何時選

  • 需要精細(xì)構(gòu)造/第三方庫對象(DataSource、ObjectMapper、ThreadPool、KafkaClient…)。
  • 需要搭配條件裝配/環(huán)境隔離時。

3) FactoryBean<T>:自定義工廠

怎么用

@Component
public class ClientFactoryBean implements FactoryBean<Client> {
  public Client getObject() { return new Client(config()); }
  public Class<?> getObjectType() { return Client.class; }
}

特點

  • Bean 的“生產(chǎn)邏輯”可編程化,適合復(fù)雜/延遲/池化創(chuàng)建。
  • 獲取“工廠本身”用:&clientFactoryBean。
  • 便于封裝復(fù)雜 SDK 實例化、動態(tài)代理實例、框架級 Bean。

何時選:構(gòu)造過程復(fù)雜、需要“拿結(jié)果不是拿工廠”的場景。

4) @Import 家族:裝配拼裝器

怎么用

  • 直接導(dǎo)入配置類:@Import(AppConfig.class)
  • 選擇器:ImportSelector(按條件返回類名集合)
  • 低層注冊:ImportBeanDefinitionRegistrar(手動注冊 BeanDefinition

特點

  • 適合模塊化配置/Starter:把一組 Bean 一鍵裝配。
  • @Conditional 組合,實現(xiàn)“自動裝配”的開/關(guān)。

何時選框架/組件開發(fā)、Starter、按類路徑/環(huán)境動態(tài)裝配。

5) XML(<bean/>)

特點

  • 歷史包袱/遺留系統(tǒng)常見;與 JavaConfig 可并存。
  • 在強(qiáng)合規(guī)/模板化平臺仍有價值。

何時選:遺留項目、平臺強(qiáng)約束、需運(yùn)行時熱替換 XML 的場景。

6) 運(yùn)行時注冊:BeanDefinitionRegistry / GenericApplicationContext#registerBean

怎么用

context.registerBean("userRepo", UserRepo.class, () -> new UserRepo(ds));

特點

  • 最靈活:可在運(yùn)行中按條件裝配/卸載。
  • 常用于框架擴(kuò)展、動態(tài)多租戶/插件化。

何時選框架層、插件/腳手架、動態(tài)場景。

二、怎么選?——一張可落地的決策清單

  1. 普通業(yè)務(wù)類@Component(或語義化的 @Service/@Repository),配合構(gòu)造器注入
  2. 第三方對象/需要精細(xì)控制(連接池、客戶端、線程池)→ @Configuration + @Bean。
  3. 創(chuàng)建邏輯復(fù)雜/需要返回“產(chǎn)品而非工廠”FactoryBean。
  4. 模塊化/Starter/按條件成批裝配@ImportImportSelector/Registrar)+ @Conditional。
  5. 遺留或平臺要求 → XML。
  6. 動態(tài)注冊/插件化 → 運(yùn)行時注冊 API。

高頻口訣:“業(yè)組件、庫配 Bean、難用工廠、批量用 Import、老活交 XML、動態(tài)上 Registry。”

三、組合拳:把方式與“條件/環(huán)境/范圍/生命周期”拼起來

條件裝配@Conditional / @Profile

  • 例:僅在 prod 激活某個 @Bean;當(dāng)類路徑存在某依賴再裝配。

作用域@Scope("singleton"|"prototype"|"request"|"session")

  • 單例配 @Bean/@Component;原型慎用(生命周期管理在你)。

懶加載@Lazy

  • 對重量級 Bean 延遲創(chuàng)建,縮短冷啟動。

優(yōu)先/歧義@Primary / @Qualifier("xxx")

  • 多實現(xiàn)注入時避免“多候選”異常。

生命周期initMethod/destroyMethod@PostConstruct/@PreDestroy

  • 池/連接類務(wù)必正確清理。

配置類性能@Configuration(proxyBeanMethods = false)

  • @Bean 之間不相互調(diào)用,設(shè) false 提升啟動性能。

四、常見踩坑與規(guī)避

  1. 同名/同類型沖突
  • 現(xiàn)象:NoUniqueBeanDefinitionException
  • 解法:約定 Bean 命名;@Qualifier 精確注入;需要默認(rèn)實現(xiàn)時加 @Primary
  1. 原型 Bean 生命周期失控
  • 容器只負(fù)責(zé)創(chuàng)建,不托管銷毀;注入到單例里極易內(nèi)存/狀態(tài)泄漏。
  • 方案:ObjectProvider/Provider 延遲獲取,或改成無狀態(tài)。
  1. @Configuration 誤用導(dǎo)致“重復(fù)實例化”
  • 在 Full 模式下通過代理保證同一 @Bean 單例復(fù)用;
  • 設(shè) proxyBeanMethods=false 時跨方法互調(diào)會各自新建,需謹(jǐn)慎。
  1. FactoryBean 取到的是“產(chǎn)品不是工廠”
  • 想拿工廠本身要用 &beanName。這點面試???。
  1. 條件/環(huán)境不生效
  • 激活 profile 寫錯;@ConditionalOnClass 等判斷失敗。
  • 啟動參數(shù)/環(huán)境變量要對齊:spring.profiles.active=prod。
  1. AOP/事務(wù)不起效
  • Bean 未交給容器管理、或在 @Bean 方法里手動 new(繞過代理)。
  • 規(guī)則:所有需要切面的對象都由容器生產(chǎn)

五、最佳實踐清單(可直接落地)

  • 優(yōu)先用構(gòu)造器注入,配合 final 字段保證不可變與可測試性。
  • 業(yè)務(wù)類用 @Component 家族,第三方對象用 @Bean,職責(zé)清晰。
  • Starter/框架層用 @Import + Conditional,形成模塊化裝配。
  • 對重量 Bean 加 @Lazy,對多實現(xiàn)用 @Qualifier,給默認(rèn)實現(xiàn)標(biāo) @Primary。
  • 配置類若無跨 @Bean 互調(diào),開啟 @Configuration(proxyBeanMethods = false) 提升啟動性能。
  • 需要復(fù)雜構(gòu)造/代理產(chǎn)物,優(yōu)先考慮 FactoryBean 封裝。
  • 原型 Bean 慎用,確需動態(tài)實例用 ObjectProvider 拉取。
  • 生命周期要閉環(huán):連接/線程池顯式 destroyMethod,或?qū)崿F(xiàn) DisposableBean。

寫在最后

把“誰創(chuàng)建、何時創(chuàng)建、在哪創(chuàng)建、如何銷毀”說清楚,就是 Bean 策略的全部。 業(yè)務(wù)常態(tài)化用 @Component;第三方與精細(xì)控制用 @Bean;復(fù)雜構(gòu)造上 FactoryBean;模塊化上 @Import;其余按場景增量選擇。 選對方式,系統(tǒng)啟動快、結(jié)構(gòu)清晰、擴(kuò)展成本更低。

以上就是Spring創(chuàng)建Bean的多種方式對比與最佳實踐的詳細(xì)內(nèi)容,更多關(guān)于Spring創(chuàng)建Bean方式的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • SWT(JFace) 簡易瀏覽器 制作實現(xiàn)代碼

    SWT(JFace) 簡易瀏覽器 制作實現(xiàn)代碼

    SWT(JFace) 簡易瀏覽器 制作實現(xiàn)代碼
    2009-06-06
  • Mybatis(ParameterType)傳遞多個不同類型的參數(shù)方式

    Mybatis(ParameterType)傳遞多個不同類型的參數(shù)方式

    這篇文章主要介紹了Mybatis(ParameterType)傳遞多個不同類型的參數(shù)方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-04-04
  • Spring?Cloud?Ribbon的使用原理解析

    Spring?Cloud?Ribbon的使用原理解析

    現(xiàn)在Java非常流行微服務(wù),也就是所謂的面向服務(wù)開發(fā),將一個項目拆分成了多個項目,其優(yōu)點有很多,其中一個優(yōu)點就是:將服務(wù)拆分成一個一個微服務(wù)后,我們很容易的來針對性的進(jìn)行集群部署,這篇文章主要介紹了Spring?Cloud?Ribbon的使用詳解,需要的朋友可以參考下
    2022-07-07
  • Java實現(xiàn)利用圖片或視頻生成GIF并發(fā)送微信

    Java實現(xiàn)利用圖片或視頻生成GIF并發(fā)送微信

    這篇文章主要為大家詳細(xì)介紹了Java語言如何利用圖片或視頻實現(xiàn)生成GIF并發(fā)送微信的功能,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以嘗試一下
    2022-11-11
  • Mybatis入門教程之新增、更新、刪除功能

    Mybatis入門教程之新增、更新、刪除功能

    這篇文章給大家介紹了Mybatis進(jìn)行基本的增刪改操作,非常不錯,具有參考借鑒價值,需要的的朋友參考下
    2017-02-02
  • 詳談spring中bean注入無效和new創(chuàng)建對象的區(qū)別

    詳談spring中bean注入無效和new創(chuàng)建對象的區(qū)別

    這篇文章主要介紹了spring中bean注入無效和new創(chuàng)建對象的區(qū)別,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-02-02
  • Java遞歸實現(xiàn)JSON全路徑自動化探測工具

    Java遞歸實現(xiàn)JSON全路徑自動化探測工具

    在日常開發(fā)中,面對嵌套十幾層、成百上千行的復(fù)雜 JSON,開發(fā)者常面臨以下困境:路徑定位難,AI 幻覺問題,文檔缺失等問題,本文分享一個輕量級的 Java 工具類,利用遞歸算法一鍵拉平 JSON,輸出所有葉子節(jié)點的完整路徑,需要的朋友可以參考下
    2026-02-02
  • 使用BufferedReader讀取TXT文件中數(shù)值,并輸出最大值

    使用BufferedReader讀取TXT文件中數(shù)值,并輸出最大值

    這篇文章主要介紹了使用BufferedReader讀取TXT文件中數(shù)值,并輸出最大值,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-12-12
  • Java中synchronized正確使用方法解析

    Java中synchronized正確使用方法解析

    這篇文章主要介紹了Java中syncronized正確使用方法解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2019-09-09
  • mybatis插件pageHelper實現(xiàn)分頁效果

    mybatis插件pageHelper實現(xiàn)分頁效果

    這篇文章主要為大家詳細(xì)介紹了mybatis插件pageHelper實現(xiàn)分頁效果,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-12-12

最新評論

栾城县| 勃利县| 淮阳县| 兴和县| 呼玛县| 三门峡市| 武川县| 南漳县| 亳州市| 米泉市| 沁阳市| 渑池县| 奉贤区| 枣阳市| 塔河县| 天津市| 包头市| 榆中县| 宜春市| 宜宾县| 观塘区| 山东| 福州市| 公安县| 平原县| 永泰县| 濉溪县| 正安县| 长丰县| 容城县| 迁安市| 青田县| 工布江达县| 滨海县| 上栗县| 芒康县| 京山县| 简阳市| 利川市| 成安县| 亳州市|