深入理解Spring框架的自動裝配原理

大星說爬蟲發表於2023-12-29

在Java開發領域,Spring框架因其強大的依賴注入(DI)和自動裝配能力而廣受歡迎。自動裝配是Spring實現控制反轉(IoC)的關鍵技術之一,它簡化了物件之間依賴的管理。本文將基於我的Java開發經驗,結合Spring原始碼,深入探討Spring自動裝配的工作原理。


什麼是自動裝配?

自動裝配(Autowiring)是Spring框架中的一個特性,它允許開發者不必顯式地在配置檔案中定義每個bean之間的關係,而是透過Spring的容器自動發現並連線相關的bean。


自動裝配的型別

Spring提供了多種自動裝配策略:


no:預設情況,不進行自動裝配,需要使用顯式的bean引用。

byName:透過屬性名自動裝配。

byType:透過屬性型別自動裝配。

constructor:透過建構函式自動裝配。

自動裝配的實現

註解驅動的自動裝配

在Spring 2.5之後,註解驅動的自動裝配變得非常流行。@Autowired註解是這其中最常用的一個。它可以用於建構函式、欄位、setter方法和普通方法。


@Component

public class UserService {


    private UserRepository userRepository;


    @Autowired

    public UserService(UserRepository userRepository) {

        this.userRepository = userRepository;

    }

}

1.

2.

3.

4.

5.

6.

7.

8.

9.

10.

在上面的程式碼中,UserService需要一個UserRepository型別的依賴。當Spring建立UserService的例項時,它會在容器中查詢型別為UserRepository的bean,並將其注入。


自動裝配的底層工作原理

當容器啟動時,它會進行bean定義的載入和註冊。這一過程中,Spring會解析類上的註解,並根據這些註解建立bean定義(BeanDefinition)。自動裝配的實現細節大致如下:


Bean定義解析:Spring使用BeanDefinitionReader解析bean定義。對於基於註解的配置,AnnotatedBeanDefinitionReader是關鍵的實現類。

Autowired註解處理:AutowiredAnnotationBeanPostProcessor是一個bean後置處理器,它會在bean例項化後解析@Autowired註解。這個處理器會掃描所有的欄位、方法,找到所有帶有@Autowired註解的地方。

依賴解析:一旦確定了需要自動裝配的依賴,Spring就會嘗試解析這些依賴。這個過程由DefaultListableBeanFactory的resolveDependency方法完成。

候選bean的查詢:Spring使用BeanFactory中的findAutowireCandidates方法來查詢所有可能的候選bean。這個過程考慮了bean的型別、限定符(@Qualifier註解)和其他因素。

佳候選的確定:如果有多個候選bean,Spring將使用一系列的規則來確定佳候選。這可能包括@Primary註解、泛型匹配等。

依賴注入:最後,一旦確定了佳候選,Spring容器就會將選定的bean例項注入到目標物件中。

原始碼解析

讓我們看一下AutowiredAnnotationBeanPostProcessor中處理自動裝配邏輯的關鍵部分:


// AutowiredAnnotationBeanPostProcessor.java


public void postProcessPropertyValues(

        PropertyValues pvs, PropertyDescriptor[] pds, Object bean, String beanName) throws BeanCreationException {


    InjectionMetadata metadata = findAutowiringMetadata(beanName, bean.getClass(), pvs);

    try {

        metadata.inject(bean, beanName, pvs);

    }

    catch (BeanCreationException ex) {

        throw ex;

    }

    catch (Throwable ex) {

        throw new BeanCreationException(beanName, "Injection of autowired dependencies failed", ex);

    }

}

1.

2.

3.

4.

5.

6.

7.

8.

9.

10.

11.

12.

13.

14.

15.

16.

在這個方法中,InjectionMetadata是一個用來儲存有關類中需要自動裝配的後設資料的物件。這包括了哪些欄位或方法需要注入,以及它們應該如何注入。


總結

Spring的自動裝配機制是基於容器的能力,可以自動解析和注入物件之間的依賴。這一機制極大地簡化了Spring應用的配置。透過BeanPostProcessor和BeanFactory的協作,Spring可以確保每個bean都被正確地構造和配置,最終提供一個執行時的可工作的應用程式。


希望這篇文章能夠幫助你更好地理解Spring框架中自動裝配的工作原理,並在實際的開發工作中更加得心應手。



來自 “ ITPUB部落格 ” ,連結:https://blog.itpub.net/70030722/viewspace-3002112/,如需轉載,請註明出處,否則將追究法律責任。

相關文章