在Spring容器中找出实现了BeanDefinitionRegistryPostProcessor以及BeanFactoryPostProcessor接口的processor并执行。Spring容器会委托给PostProcessorRegistrationDelegate的invokeBeanFactoryProcessors方法执行。1
PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(beanFactory, getBeanFactoryPostProcessors());
其中getBeanFactoryPostProcessors()
函数返回了AbstractApplicationContext
中保存的beanFactoryPostProcessors
:
1 | public List<BeanFactoryPostProcessor> getBeanFactoryPostProcessors() { |
invokeBeanFactoryPostProcessors代码如下:
1 | public static void invokeBeanFactoryPostProcessors(ConfigurableListableBeanFactory beanFactory, List<BeanFactoryPostProcessor> beanFactoryPostProcessors) { |
从容器中获取某个类的beanName
从容器中获取某个类(比如,BeanDefinitionRegistryPostProcessor)的beanName,由DefaultListableBeanFactory.getBeanNamesForType
来完成,进一步调用同一个类下的doGetBeanNamesForType
。
doGetBeanNamesForType
分别在beanDefinitionNames和manualSingletonNames中寻找匹配类型的beanName。
判断是否匹配类型使用isTypeMatch,调用typeToMatch.isAssignableFrom(beanType)
判断typeToMatch
是否可以由beanType
转换过来,最终调用ClassUtils.isAssignable(Class<?> lhsType, Class<?> rhsType)
来判断rhsType
是否可以赋值给lhsType
。
调用BeanDefinitionRegistryPostProcessor
1 | private static void invokeBeanDefinitionRegistryPostProcessors( |
可以看到,这里分别调用了每个BeanDefinitionRegistryPostProcessor
的postProcessBeanDefinitionRegistry
方法。
调用BeanFactoryPostProcessor
1 | private static void invokeBeanFactoryPostProcessors( |
可以看到,这里分别调用了每个BeanFactoryPostProcessor
的postProcessBeanFactory
方法。