日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

spring源码:九大后置处理器

發布時間:2024/3/13 编程问答 47 豆豆
生活随笔 收集整理的這篇文章主要介紹了 spring源码:九大后置处理器 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

目的:

spring在完成一個bean的初始化、實例化的過程中,會用到九個后置處理器;本文梳理出這九個后置處理器

九大后置處理器

spring在初始化的過程中,會在九個地方分別調用了五個后置處理的九個方法

第一次調用后置處理器org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#resolveBeforeInstantiation

InstantiationAwareBeanPostProcessor --> postProcessBeforeInstantiation方法
InstantiationAwareBeanPostProcessor的postProcessBeforeInstantiation方法可以返回任何類型,如果返回的對象不為null,就調用beanPostProcessor的postProcessAfterInitialization方法;如果返回null,就正常的執行流程;該后置處理器
在spring AOP當中,spring如果判斷當前類100%不需要進行增強,會把這個bean放到一個map中,并將value置為false,那么在后面進行增強的時候,會排除這個map中的bean

第二次調用后置處理器,該后置處理器推斷使用哪個構造函數來初始化bean對象

org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#determineConstructorsFromBeanPostProcessors
InstantiationAwareBeanPostProcessor --> determineCandidateConstructors();推斷使用哪個構造函數來初始化bean對象

在推斷使用哪一個構造函數的時候,會首先判斷當前構造函數是否有@Value和@Autowired注解,如果沒有,那就校驗當前構造方法對應的bean和傳來的beanClass是否一樣,如果是同一個,就把當前構造函數賦值給defaultConstructor在第二次調用后置處理器的時候,會返回當前可用的構造函數,由此來決定,使用哪個構造函數來創建bean

都三次調用后置處理器

org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#applyMergedBeanDefinitionPostProcessors

調用的是MergedBeanDefinitionPostProcessor --> postProcessMergedBeanDefinition 第三個后置處理器,是后面生命周期流程中的某些流程緩存一些meta信息

比如:在CommonAnnotationBeanPostProcessor和AutowiredAnnotationBeanPostProcessor的postProcessorMergedBeanDefinition的方法中,會調用finAutowiringMetadata和findResourceMetadata方法,將當前bean所依賴的bean(@Autowired和@Resource注解)存到一個map中,后面在進行屬性注入的時候,會先從這個map中找當前bean依賴的bean有哪些,如果map中為空,就再查找要注入的屬性有哪些
再比如:在CommonAnnotationBeanPostProcessor的這個方法中,將@PostConstrct和@PreDestroy注解對應的方法,緩存起來,在后面調用初始化的后置處理器的時候,先從這里存的map中找方法,找到,就直接執行即可
這些提前緩存的操作,都是在這個后置處理器完成的

第四次調用后置處理器 循環依賴

org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#getEarlyBeanReference
SmartInstantiationAwareBeanPostProcessor --> getEarlyBeanReference 第四個后置處理器(把創建的對象 放到earlySingletonObjects,解決循環依賴的),處理循環依賴問題會用到這個后置處理器
這里通過后置處理器,暴露出一個ObjectFactory(個人理解是一個bean工廠),可以完成bean的實例化等操作;這里的方法不會立即執行,只有執行到objectFactory.getObject()方法的時候,才會執行

第五次調用后置處理器 判斷是否需要進行屬性填充

org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#populateBean–InstantiationAwareBeanPostProcessor–postProcessAfterInstantiation
調用的是InstantiationAwareBeanPostProcessor --> postProcessAfterInstantiation 第五個后置處理器(判斷是否需要填充屬性)
如果我們需要在程序中自己注入屬性,可以利用這個點,在這里返回false,那么spring就不會調用下面這個后置處理器來注入屬性

第六次調用后置處理器 進行屬性注入

org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#populateBean–InstantiationAwareBeanPostProcessor–postProcessPropertyValues
調用的是InstantiationAwareBeanPostProcessor --> postProcessPropertyValues 第六個(處理類的屬性值)
主要是CommonAnnotationBeanPostProcessor(用來處理@Resource注解)和AutowiredAnnotationConigApplication(處理@Autowired和@Value注解);如果是自動注入(AutowireMode不為null),是無需通過后置處理器來進行屬性注入的

第七次調用后置處理器 執行初始化方法

org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#applyBeanPostProcessorsBeforeInitialization
調用的是BeanPostProcessor --> postProcessBeforeInitialization bean初始化方法
CommonAnnotationBeanPostProcessor 繼承了 InitDestroyAnnotationBeanPostProcessor,在該后置處理器處理的是@postconstruct注解

第八次調用后置處理器 springAop

org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#applyBeanPostProcessorsAfterInitialization
調用的是BeanPostProcessor --> postProcessAfterInitialization bean初始化之后執行的方法,典型應用:對aop進行處理,對目標類生成代理對象

第九次是在銷毀bean容器的時候調用的

在調用ac.close()方法的時候,會調用該后置處理器 org.springframework.beans.factory.annotation.InitDestroyAnnotationBeanPostProcessor#postProcessBeforeDestruction
處理 @PreDestroy注解,destroy-method和destroy()方法

總結

以上是生活随笔為你收集整理的spring源码:九大后置处理器的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。