整体结构
按照该类中方法的调用顺序进行介绍
configurationClassPostProcessor实现了BeanDefinitionRegistryPostProcessor接口。在invokeBeanFactoryPostProcessor中第一个调用到
也就是我们第一个获取容器中beanDefinitionRegistryPostProcessor的bean名称时得到该类,并执行实现的postProcessBeanDefinitionRegistry方法
public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) {
int registryId = System.identityHashCode(registry);
if (this.registriesPostProcessed.contains(registryId)) {
throw new IllegalStateException(
"postProcessBeanDefinitionRegistry already called on this post-processor against " + registry);
}
if (this.factoriesPostProcessed.contains(registryId)) {
throw new IllegalStateException(
"postProcessBeanFactory already called on this post-processor against " + registry);
}
this.registriesPostProcessed.add(registryId);
//真正的解析我们的bean定义
processConfigBeanDefinitions(registry);invokeBeanFactoryPostProcessors
}
这里主要完成的是解析所有扫描到的bean定义,包括@bean,@Import,内部类中包含这些注解等等所有的情况。总之,会将所有能够扫描到的bean进行注册
这里穿插一下,在invokeBeanFactoryPostProcessors执行的整体过程中,正常情况下,在我们未对spring进行扩展时,上述这个方法执行完毕后。还会再去容器中获取一次beanDefinitionRegistryPostProcessor的实现类。这里想要处理的情况就是,在注册完所有bean定义之后,出现我们自己对该接口的实现类。所以需要在此处去执行
@Service
public class MyBeanDefinitionRegister implements BeanDefinitionRegistryPostProcessor {
@Override
public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException {
System.out.println("beanDefinition.....");
}
@Override
public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
}
}
随后就是进入到while循环中, 再去处理剩余未被执行的beanDefinitionRegistryPostProcessor实现类。原因也同刚刚讲述的类似
循环退出后,也就是我们的beanDefinitionRegistryPostProcessor实现类已经全部执行完毕了
将会去调用beanDefinitionRegistryPostProcessor实现类中的postProcessBeanFactory方法。
这里会调用到configurationClassPostProcessor中的postProcessBeanFactory方法
@Override
public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) {
int factoryId = System.identityHashCode(beanFactory);
if (this.factoriesPostProcessed.contains(factoryId)) {
throw new IllegalStateException(
"postProcessBeanFactory already called on this post-processor against " + beanFactory);
}
this.factoriesPostProcessed.add(factoryId);
if (!this.registriesPostProcessed.contains(factoryId)) {
// BeanDefinitionRegistryPostProcessor hook apparently not supported...
// Simply call processConfigurationClasses lazily at this point then.
processConfigBeanDefinitions((BeanDefinitionRegistry) beanFactory);
}
//使用cglib对配置类进行动态代理,因为@Bean方法到时候要进行Bean的实例化创建
enhanceConfigurationClasses(beanFactory);
beanFactory.addBeanPostProcessor(new ImportAwareBeanPostProcessor(beanFactory));
}
前面的过程中,configurationClassPostProcessor已经执行了registry和postProcessBeanFactory的实现方法了
整个invokeBeanFactoryPostProcessor中关于这个类的执行也都执行完了