本节将对SharedMetadataReaderFactoryContextInitializer进行分析,关于该对象的基础定义代码如下:
class SharedMetadataReaderFactoryContextInitializer implements ApplicationContextInitializer<ConfigurableApplicationContext>, Ordered {}
从对象的基础定义中可以发现并未实现其他接口,下面对ApplicationContextInitializer的实现方法进行说明,详细代码如下:
public void initialize(ConfigurableApplicationContext applicationContext) { // 创建Bean工厂后置处理器 BeanFactoryPostProcessor postProcessor = new CachingMetadataReaderFactoryPostProcessor(applicationContext); // 添加Bean工厂后置处理器 applicationContext.addBeanFactoryPostProcessor(postProcessor); }
在initialize方法中主要执行目标是创建Bean工厂后置处理器,类型是CachingMetadataR-eaderFactoryPostProcessor,创建后将其加入应用上下文中。在initialize方法中最关键的对象是CachingMetadataReaderFactoryPostProcessor,接下来将对该对象进行分析。关于该对象的基础定义代码如下:
static class CachingMetadataReaderFactoryPostProcessor implements BeanDefinitionRegistryPostProcessor, PriorityOrdered {}
从上述基础定义中可以发现它实现了BeanDefinitionRegistryPostProcessor,关于该接口,对于CachingMetadataReaderFactoryPostProcessor而言,主要关注postProcessBeanDefinitionRegistry方法即可,详细代码如下:
public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException { register(registry); configureConfigurationClassPostProcessor(registry); }
在postProcessBeanDefinitionRegistry方法中进行了以下两个操作:
(1)注册Bean定义,具体注册的Bean类型是SharedMetadataReaderFactoryBean;
(2)配置类后置处理器。
关于配置类后置处理器的实际操作如下:
(1)Bean定义类型是AbstractBeanDefinition时将添加Supplier接口的实现类,具体类型是ConfigurationClassPostProcessorCustomizingSupplier;
(2)为Bean定义属性表添加metadataReaderFactory属性。