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

Java中@Autowired注解用法及說明

 更新時(shí)間:2025年11月10日 09:53:20   作者:Yashar?Qian  
@Autowired是Spring框架中的一個(gè)核心注解,用于實(shí)現(xiàn)依賴注入,它允許Spring容器自動(dòng)裝配依賴,從而解耦代碼、提高可測試性和可維護(hù)性,該注解可以用于字段、構(gòu)造器和Setter方法上,并且可以結(jié)合@Qualifier注解解決依賴沖突,理解@Autowired`的使用對于掌握Spring開發(fā)至關(guān)重要

1. 核心概念:它是什么?

@AutowiredSpring 框架 提供的一個(gè)核心注解,用于實(shí)現(xiàn) 依賴注入。

它的核心思想是:你不負(fù)責(zé)創(chuàng)建(new)你所需要的對象,而是由 Spring 容器(IoC 容器)自動(dòng)“裝配”給你。

簡單來說,就是“我要什么,你(Spring)就給我什么”。

2. 為什么要用它?(依賴注入的優(yōu)勢)

在沒有依賴注入的時(shí)代,對象A如果需要使用對象B,它需要自己 new B()。這帶來了緊耦合的問題:

public class OrderService {
    // OrderService 自己創(chuàng)建了 PaymentProcessor,緊耦合
    private PaymentProcessor processor = new PaymentProcessor();

    public void processOrder() {
        processor.charge();
    }
}

使用 @Autowired 后,代碼變?yōu)椋?/p>

public class OrderService {
    // OrderService 聲明它需要一個(gè) PaymentProcessor,由 Spring 提供
    @Autowired
    private PaymentProcessor processor;

    public void processOrder() {
        processor.charge();
    }
}

這樣做的好處:

  • 解耦OrderService 不再關(guān)心 PaymentProcessor 是如何創(chuàng)建的。
  • 易于測試:在測試時(shí),你可以輕松地注入一個(gè)模擬的 PaymentProcessor,而不是真實(shí)的那個(gè)。
  • 可維護(hù)性:如果你想更換 PaymentProcessor 的實(shí)現(xiàn),只需要修改 Spring 的配置(如 @Component 注解),而不需要修改 OrderService 的代碼。
  • 單一職責(zé):每個(gè)類專注于自己的業(yè)務(wù)邏輯,而不是對象的創(chuàng)建和查找。

3. 如何使用它?

@Autowired 可以用在以下幾個(gè)地方:

a. 用在字段上(最常見)

這是最簡潔的方式,直接注入到字段,不需要 setter 方法。

@Service
public class OrderService {

    @Autowired
    private PaymentProcessor paymentProcessor;
    @Autowired
    private EmailService emailService;

    // ... 業(yè)務(wù)方法
}

b. 用在構(gòu)造器上(推薦方式)

Spring 官方推薦的方式。它明確地聲明了創(chuàng)建對象所必需的依賴,并且可以保證這些依賴在對象初始化時(shí)就被設(shè)置好,避免了 NullPointerException

@Service
public class OrderService {

    private final PaymentProcessor paymentProcessor;
    private final EmailService emailService;

    // 構(gòu)造器注入
    @Autowired
    public OrderService(PaymentProcessor paymentProcessor, EmailService emailService) {
        this.paymentProcessor = paymentProcessor;
        this.emailService = emailService;
    }

    // ... 業(yè)務(wù)方法
}

注意:在 Spring 4.3 及以后,如果類中只有一個(gè)構(gòu)造器,那么 @Autowired 注解可以省略。

c. 用在 Setter 方法上

類似于字段注入,但提供了在注入后執(zhí)行一些額外邏輯的機(jī)會(huì)。

@Service
public class OrderService {

    private PaymentProcessor paymentProcessor;

    // Setter 注入
    @Autowired
    public void setPaymentProcessor(PaymentProcessor paymentProcessor) {
        this.paymentProcessor = paymentProcessor;
        // 可以在這里加入一些初始化邏輯
    }
}

4. 裝配機(jī)制(Spring 如何找到要注入的 Bean?)

Spring 會(huì)按照以下優(yōu)先級在它的 IoC 容器 中查找匹配的 Bean:

  1. 按類型(ByType):這是首選方式。Spring 會(huì)尋找與字段/方法參數(shù)類型完全匹配的 Bean。

    • 例如:@Autowired private PaymentProcessor processor; Spring 會(huì)尋找類型為 PaymentProcessor 的 Bean。
  2. 按名稱(ByName)(如果按類型有歧義):

    • 如果容器中有多個(gè)相同類型的 Bean(例如,PaymentProcessor 有兩個(gè)實(shí)現(xiàn)類:CreditCardProcessorPayPalProcessor),按類型注入就會(huì)失敗。
    • 此時(shí),Spring 會(huì)退而求其次,嘗試使用字段名或參數(shù)名作為 Bean 的 ID 來查找。
    • 例如:@Autowired private PaymentProcessor creditCardProcessor; Spring 會(huì)尋找 ID 為 creditCardProcessor 的 Bean。
  3. 使用 @Qualifier 注解(解決歧義的終極武器):

    • 當(dāng)按名稱也無法滿足,或者你想明確指定時(shí),可以配合 @Qualifier 使用。
    • 你在實(shí)現(xiàn)類上使用 @Qualifier 給它起一個(gè)“限定符”名字。
    @Component
    @Qualifier("creditCard")
    public class CreditCardProcessor implements PaymentProcessor { ... }
    
    @Component
    @Qualifier("paypal")
    public class PayPalProcessor implements PaymentProcessor { ... }
    
    • 在注入點(diǎn)時(shí),使用 @Qualifier 指定要注入哪一個(gè)。
    @Autowired
    @Qualifier("creditCard") // 明確指定要注入標(biāo)有 "creditCard" 的 Bean
    private PaymentProcessor processor;
    

5. 可能遇到的問題及解決方案

a. 找不到 Bean(NoSuchBeanDefinitionException)

原因:Spring 容器中沒有與你 @Autowired 字段/參數(shù)類型匹配的 Bean。

解決

  • 確保目標(biāo)類(如 PaymentProcessor 的實(shí)現(xiàn)類)已經(jīng)被 Spring 管理(即標(biāo)注了 @Component, @Service, @Repository 等注解)。
  • 確保組件掃描(@ComponentScan)的路徑正確,能夠掃描到這些類。

b. 找到多個(gè) Bean(NoUniqueBeanDefinitionException)

原因:有多個(gè)相同類型的 Bean 存在于容器中。
 

解決

使用 @Qualifier 注解明確指定一個(gè)(如上文所示)。

將其中一個(gè)候選 Bean 標(biāo)記為 @Primary,這樣當(dāng)有多個(gè)同類型 Bean 時(shí),會(huì)優(yōu)先選擇它。

@Component
@Primary // 優(yōu)先選擇這個(gè)
public class CreditCardProcessor implements PaymentProcessor { ... }

c. 非必須的依賴(required=false)

默認(rèn)情況下,@Autowired 要求依賴是必須的。如果找不到,應(yīng)用會(huì)啟動(dòng)失敗。

你可以將其設(shè)置為 false,這樣即使找不到,Spring 也會(huì)繼續(xù)啟動(dòng),但該字段可能為 null。

@Autowired(required = false)
private OptionalDependency optionalDependency; // 可能為 null,使用時(shí)要小心

注意

更現(xiàn)代和安全的做法是使用 Java 8 的 Optional構(gòu)造器注入 來明確處理可為空的依賴。

總結(jié)

特性說明
目的實(shí)現(xiàn)依賴注入,解耦代碼
來源Spring 框架
原理Spring IoC 容器自動(dòng)裝配 Bean
使用位置字段、構(gòu)造器、Setter 方法
裝配方式默認(rèn)按類型,歧義時(shí)按名稱或使用 @Qualifier
推薦方式構(gòu)造器注入,因?yàn)樗豢勺兦颐鞔_

@Autowired 是 Spring 生態(tài)的基石之一,理解它對于掌握 Spring 開發(fā)至關(guān)重要。

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • stream中使用peek一些陷阱避免及解決方法

    stream中使用peek一些陷阱避免及解決方法

    這篇文章主要為大家介紹了stream中使用peek一些陷阱避免及解決方法詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-03-03
  • java遍歷Map的幾種方法分析

    java遍歷Map的幾種方法分析

    這篇文章主要介紹了java遍歷Map的幾種方法,結(jié)合實(shí)例形式分析了使用循環(huán)與迭代等方法操作Map遍歷的相關(guān)技巧,需要的朋友可以參考下
    2016-08-08
  • SpringBoot引入模板引擎實(shí)現(xiàn)視圖解析

    SpringBoot引入模板引擎實(shí)現(xiàn)視圖解析

    這篇文章主要介紹了SpringBoot引入模板引擎實(shí)現(xiàn)視圖解析方法流程,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧
    2022-10-10
  • spring boot微服務(wù)自定義starter原理詳解

    spring boot微服務(wù)自定義starter原理詳解

    這篇文章主要介紹了spring boot微服務(wù)自定義starter原理詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-12-12
  • Java線程的生命周期和狀態(tài)控制_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理

    Java線程的生命周期和狀態(tài)控制_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理

    這篇文章主要介紹了Java線程的生命周期和狀態(tài)控制,需要的朋友可以參考下
    2017-05-05
  • 通過案例了解靜態(tài)修飾符static使用場景

    通過案例了解靜態(tài)修飾符static使用場景

    這篇文章主要介紹了通過案例了解靜態(tài)修飾符static使用場景,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-10-10
  • Java中double精度丟失問題原因及解決辦法

    Java中double精度丟失問題原因及解決辦法

    使用Java double進(jìn)行運(yùn)算時(shí),經(jīng)常出現(xiàn)精度丟失的問題,總是在一個(gè)正確的結(jié)果左右偏0.0000**1,這篇文章主要給大家介紹了關(guān)于Java中double精度丟失問題原因及解決辦法,需要的朋友可以參考下
    2024-01-01
  • Java中System.currentTimeMillis()計(jì)算方式與時(shí)間單位轉(zhuǎn)換講解

    Java中System.currentTimeMillis()計(jì)算方式與時(shí)間單位轉(zhuǎn)換講解

    本文詳細(xì)講解了Java中System.currentTimeMillis()計(jì)算方式與時(shí)間單位轉(zhuǎn)換,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-12-12
  • Maven中optional標(biāo)簽用法詳解

    Maven中optional標(biāo)簽用法詳解

    這篇文章主要介紹了Maven中optional標(biāo)簽,文章中有詳細(xì)的代碼示例供大家參考,對大家的學(xué)習(xí)或工作有一定的參考價(jià)值,感興趣的小伙伴可以借鑒一下
    2023-05-05
  • 全面理解Java類和對象

    全面理解Java類和對象

    下面小編就為大家?guī)硪黄胬斫釰ava類和對象。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2016-06-06

最新評論

彰化市| 陕西省| 五常市| 潢川县| 林西县| 清河县| 长葛市| 任丘市| 定安县| 加查县| 赤峰市| 正宁县| 夹江县| 房产| 易门县| 尖扎县| 上林县| 黄大仙区| 六枝特区| 阜城县| 虹口区| 南充市| 清远市| 忻州市| 莆田市| 玉龙| 绥江县| 华宁县| 中牟县| 璧山县| 巴青县| 永仁县| 沅陵县| 三门峡市| 洪江市| 涞源县| 武鸣县| 任丘市| 铅山县| 柞水县| 襄樊市|