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對象
都三次調用后置處理器
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源码:九大后置处理器的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 去除IE浏览器弹出窗口
- 下一篇: 【报错】paddle相关报错和处理方法