想讀懂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()來進行注入邏輯的:
不要白嫖點個贊 謝謝了!!!!