一文讀懂Spring框架中依賴注入流程


想讀懂Spring的依賴注入流程,我們先簡單了解一下Ioc和DI是什么?

IoC和DI

  • Ioc—Inversion of Control,即“控制反轉”,不是什么技術,而是一種設計思想
  • Ioc就是將你設計好的對象交給容器來進行管理
  • DI—Dependency Injection,即“依賴注入”:組件之間依賴關系由容器在運行期決定
  • DI就是由容器動態的將某個依賴關系注入到組件之中
  • 簡單來說就是不通過new()的方式在類內部創建依賴對象,而是將依賴的類對象在外部創建好通過構造方法,函數參數等方式傳遞給類使用
  • 依賴注入的方式有3種:
  • 接口注入(調用和實現分離):不常用
  • setter注入 (使用set方法為屬性賦值)
  • 構造器注入(通過構造方法賦值)(不能解決循環依賴的問題)

依賴注入流程圖:

 

根據依賴注入流程圖簡單解釋:

1.依賴注入的步驟在Bean實例化之后就進行依賴注入了:可以根據Bean的生命周期流程圖可知:

2.依賴注入入口:AbstractAutowireCapableBeanFactory的docreateBean()方法中的populateBean(beanName, mbd, instanceWrapper);

protected Object doCreateBean(final String beanName, final RootBeanDefinition mbd, final @Nullable Object[] args)
            throws BeanCreationException {
// Initialize the bean instance.
        Object exposedObject = bean;
        try {
        // bean初始化第二步:填充屬性(DI依賴注入發生在此步驟)
            // 調用反射和內省去進行屬性設置
            // 屬性值需要進行類型轉換,判斷屬性注入是否需要
            populateBean(beanName, mbd, instanceWrapper);
            // bean初始化第三步:調用初始化方法,完成bean的初始化操作(AOP發生在此步驟)
            exposedObject = initializeBean(beanName, exposedObject, mbd);
        }
}

3.先進行一個bean的屬性值的類型的轉換(就是配置文件->依賴注入的類型) 轉換之前存儲的是 MutablePropertyValue(List<PropertyValue>) 

 3.1.然后中間經過BeanDefinitionValueResolve來進行轉換:

3.2.然后繼續存入 MutablePropertyValue(List<PropertyValue>)中:

4.Bean的屬性注入(BeanWrapperImp) 先從PropertyAccessor(屬性訪問器)獲取屬性名稱 然后獲取指定的屬性訪問器去操作屬性的注入:

 AbstractNestablePropertyAccessor的getPropertyAccessorForPropertyPath()的內部處理來獲取屬性訪問器:

流程是先通過AbstractNestablePropertyAccessor的setpropertyValue()方法:

PropertyTokenHolder是什么?

  • 用於解析嵌套屬性名稱,標識唯一的屬性
  • 解析后將 [] 之間的 ' 和 " 去除后保存在 canonicalName 中,attrs 保存在 actualName 中,["key", "0"] 保存在 keys 中

 再判斷PropertyTokenHolder的keys()為不為空是進行其他屬性注入還是普通屬性注入:

 最后屬性注入的核心邏輯是通過AbstractNestablePropertyAccessor的setPropertyValue()來進行注入邏輯的:

 不要白嫖點個贊 謝謝了!!!!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM