configurationClassPostProcessor

整体结构

在这里插入图片描述

按照该类中方法的调用顺序进行介绍

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中关于这个类的执行也都执行完了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值