ConfigurationClassPostProcessor 是一个处理@Configuration 、@ComponentScan、@ComponentScans、@Import 注解的BeanFactory后置处理类。在spring的bean中包含这些注解的时候,该类会对配置有这些注解的bean进行处理。

  如何在debug的时候命中该类的代码呢?我们需要在配置bean信息的时候,在相应的类或者接口上,加上相应的注解。然后,在读取所有实现BeanDefinitionRegistryPostProcessor接口的bean的时候,就可以读出来该类。在之后遍历currentRegistryProcessors时,就会执行ConfigurationClassPOSTProcessor类的postProcessBeanDefinitionRegistry方法。

  让我们分两部分来说一下,一是怎么Spring怎么调入该方法。二是spring调入该方法后,如何进行解析的。

  方法入口(xml配置文件为例)

  a.在abstractApplicationContext中,通过invokeBeanFactoryPostProcessors(beanFactory) 方法调用各种BeanFactory的处理器的时候进行调用。进入该方法后,在调用invokeBeanDefinitionRegistryPOSTProcess时,调用PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(beanFactory, getBeanFactoryPostProcessors())方法,该方法进入PostProcessorRegistrationDelegate对象。

  b.进入该方法后,在执行String[] postProcessorNames =beanFactory.getBeanNamesForType(BeanDefinitionRegistryPostProcessor.class, true, false);代码时会读到org.springframework.context.annotation.internalConfigurationAnnotationProcessor的字符串,通过这个名字,beanFactory.getBean(ppName, BeanDefinitionRegistryPostProcessor.class)方法就可以读到configurationClasspostprocessor的beanFactory后置处理对象。在调用该方法中的invokeBeanDefinitionRegistryPostProcessors方法时,会调用 postProcessor.postProcessBeanDefinitionRegistry(registry); 方法,该方法由configurationClassPostProcessor对象执行。

  然后执行该对象的 postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) 方法,开始进行注解的解析

  执行postprocessBeanDefinitionRegistry

  configurationClassPostProcessor的PostProcessBeanDefinitionRegistry方法,是一个从配置类读取bean definition的驱动。它可以定位、加载、解析、注册相关的注解。该方法中调用processConfigBeanDefinitions方法进行处理。

  该方法首先把beanFactory中的BeanDefinitionNames取出。获取所有已经注册的BeanDefinitionName然后遍历所有要处理的beanName,获取beanDefinition对象,判断对象是否是一个配置类,如果是,将其放入configCandidates 队列。

 

 

  如果队列不为空,创建configurationClassParser类对象parser。调用 parser.parse(candidates); 代码解析带有@Controller、@Import、@ImportResource、@ComponentScan、@ComponentScans、@Bean的BeanDefinition。该方法内部根据不同的注解,对入参的对象进行递归解析。

  解析完成后,将得到的配置对象存入 一个configClasses的set中。然后将填充好的configClasses实例转化为BeanDefinition注册入IOC容器。

  over.

 

posted on 2021-05-19 21:20  精品唯居  阅读(280)  评论(0编辑  收藏  举报