Spring扩展点的调用顺序
2020-11-16 09:39:20 8 举报
spring启动过程中各个扩展点的执行时机
作者其他创作
大纲/内容
MergedBeanDefinitionPostProcessor#postProcessMergedBeanDefinition
InstantiationAwareBeanPostProcessor(BeanPostProcessor)#postProcessAfterInitialization
.ImportBeanDefinitionRegistrar#registerBeanDefinitions
BeanFactoryPostProcessor
InstantiationAwareBeanPostProcessor#postProcessProperties
BeanDefinitionRegistryPostProcessor(普通的)#postProcessBeanFactory
容器内部扩展用的。进行外部扩展的时候不建议使用这些,因为涉及到的逻辑太复杂了。
容器级别扩展点的类层次
BeanDefinitionRegistryPostProcessor(实现PriorityOrdered的)#postProcessBeanFactory
InstantiationAwareBeanPostProcessor.实例化扩展点。spring中源码中有几处对此处进行特殊判断。使用postProcessBeforeInstantiation实例化的bean,不会进行bean的后置处理器。通常用于抑制特定目标bean的默认实例化,例如,创建具有特殊TargetSources(池目标,延迟初始化目标等),或实现额外的注入策略如现场注入。此接口是一个专用接口,主要用于框架内的内部使用。建议实现BeanPostProcessor接口,或从InstantiationWareBeanPostProcessorAdapter以便屏蔽从这个接口的扩展。
SmartInstantiationAwareBeanPostProcessor#getEarlyBeanReference
BeanDefinitionRegistryPostProcessor
InstantiationAwareBeanPostProcessor#postProcessAfterInstantiation
只有bean不是synthetic,即这个bean是application内部的,才最遍历这个进行执行,并且这个方法返回false的话,设置属性的方法不会继续往下走
beanFactory的后置处理器
来自org.springframework.beans.factory.support.AbstractBeanFactory#getBean(java.lang.String)
InstantiationAwareBeanPostProcessor#postProcessBeforeInstantiation
调用MergedBeanDefinitionPostProcessor,这个主要是对bean作一些依赖性的解析。比较典型的实现是AutowiredAnnotationBeanPostProcessor,用于做Autowired和value的解析功能,解析成为InjectionMetadata,最终吧这个bean涉及到的Member放入beanDefinition中。这个是比较重要的一个过程。
只有在上一个处理器返回bean!=null的情况下才会执行这个
BeanDefinitionRegistryPostProcessor(实现PriorityOrdered的)#postProcessBeanDefinitionRegistry
BeanDefinitionRegistryPostProcessor(实现Ordered的)#postProcessBeanDefinitionRegistry
代码来自org.springframework.context.support.AbstractApplicationContext#refresh
BeanDefinitionRegistryPostProcessor#postProcessBeanFactory
BeanDefinitionRegistryPostProcessor(实现Ordered的)#postProcessBeanFactory
InstantiationAwareBeanPostProcessor#postProcessPropertyValues
BeanPostProcessor#postProcessBeforeInitialization
会调用三次BeanDefinitionRegistryPostProcessor。其中注意的是最后一次调用的时候是采用while循环的方式进行调用的,这样在BeanDefinitionRegistryPostProcesso中注册的BeanDefinitionRegistryPostProcessor也会被调用。
这里如果是Annotation驱动的话,会在ConfigurationClassPostProcessor#processConfigBeanDefinitions的方法中调用ImportBeanDefinitionRegistrar这个处理器。
BeanDefinitionRegistryPostProcessor(普通的)#postProcessBeanDefinitionRegistry
只有上一步没有返回PropertyValues才会执行这个。如果这个扩展点返回了null,设置属性的方法会返回。
核心的扩展方法,我们如果需要扩展spring或者使用spring继承自己的框架,主要就是用这两个
如果当前的bean存在循环依赖的情况下,才会执行这个扩展点。这个扩展点的主要目的就是解决循环依赖的问题。具体需要看getBean的流程
BeanPostProcessor的类层次
调用工厂后置处理器
调用注册器
BeanPostProcessor#postProcessAfterInitialization
bean级别的扩展点
收藏
0 条评论
下一页