深入理解Spring框架的自動裝配原理
在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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Spring Boot 自動裝配原理Spring Boot
- SpringBoot自動裝配原理解析Spring Boot
- Spring框架使用@Autowired自動裝配引發的討論Spring框架
- Spring自動裝配BeansSpringBean
- 自動裝配【Spring autowire】Spring
- Spring 自動裝配AutoWireSpring
- Spring IOC容器-自動裝配Spring
- 深度剖析Spring Boot自動裝配機制實現原理Spring Boot
- SpringBoot 自動裝配的原理分析Spring Boot
- Spring-04 Bean的自動裝配SpringBean
- SpringBoot自動裝配原理分析Spring Boot
- SpringBoot系列--自動裝配原理Spring Boot
- 2、spring注入及自動裝配Spring
- Spring實戰:裝配bean-自動化裝配beanSpringBean
- SpringBoot系列--自動裝配原理2Spring Boot
- 深入理解 Spring 的事務原理Spring
- 【面試普通人VS高手系列】Spring Boot中自動裝配機制的原理面試Spring Boot
- Spring入門(二):自動化裝配beanSpringBean
- Spring9:Autowire(自動裝配)機制Spring
- Spring@Autowired註解與自動裝配Spring
- Spring入門(八):自動裝配的歧義性Spring
- 深入理解:Spring MVC工作原理SpringMVC
- 深入理解 Spring 事務原理Spring
- SpringBoot | 2.1 SpringBoot自動裝配原理Spring Boot
- 徹底搞明白Spring中的自動裝配和AutowiredSpring
- spring自動裝配與spring_bean之間的關係(二)SpringBean
- 深入原始碼理解Spring整合MyBatis原理原始碼SpringMyBatis
- Spring中的applicationContext.xml實現自動裝配SpringAPPContextXML
- (第四講)Spring Boot 自動化配置原理解析Spring Boot
- SpringBoot - 自動裝配Spring Boot
- 深入理解Spring AOP的動態代理Spring
- 深入理解Spring Security授權機制原理Spring
- 深入理解springboot的自動注入Spring Boot
- Spring Boot 自動配置原理Spring Boot
- springboot之自動裝配Spring Boot
- spring裝配Spring
- 深入理解Logger日誌——框架繫結原理框架
- Spring裝配Bean(五)profile註解和解決自動注入的歧義性SpringBean