Spring源码解析 – @Configuration配置类及注解Bean的解析

 在分析Spring 容器创建过程时,我们知道容器默认会加载一些后置处理器PostPRocessor,以AnnotationConfigApplicationContext为例,在构造函数中初始化reader时,加载默认后置处理器。其中 ConfigurationClassPostProcessor这个后置处理器专门处理带有@Configuration注解的类,ConfigurationClassPostProcessor后置处理实现了BeanDefinitionRegistryPostProcessor接口和PriorityOrdered接口,所以会在容器初始化refres()方法中执行后置处理器时优先执行,主要负责解析所有@Configuration标签类,并将Bean定义注册到容器中。

BeanDefinitionRegistryPostProcessor解析配置类过程:

复制代码
 1 public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) {  2 //生成唯一标识,用于重复处理验证 3    int registryId = System.identityHashCode(registry);  4    if (this.registriesPostProcessed.contains(registryId)) {  5       throw new IllegalStateException(  6             "postProcessBeanDefinitionRegistry already called on this post-processor against " + registry);  7    }  8    if (this.factoriesPostProcessed.contains(registryId)) {  9       throw new IllegalStateException( 10             "postProcessBeanFactory already called on this post-processor against " + registry); 11    } 12    this.registriesPostProcessed.add(registryId); 13    //解析Java类配置bean14    processConfigBeanDefinitions(registry); 15 }
复制代码
processConfigBeanDefinitions(registry)处理逻辑:
复制代码
  1 public void processConfigBeanDefinitions(BeanDefinitionRegistry registry) {   2    List<BeanDefinitionHolder> configCandidates = new ArrayList<>();   3   //所有已经注册的bean   4    String[] candidateNames = registry.getBeanDefinitionNames();   5    //遍历bean定义信息  6    for (String beanName : candidateNames) {   7       BeanDefinition beanDef = registry.getBeanDefinition(beanName);   8       if (ConfigurationClassUtils.isFullConfigurationClass(beanDef) ||  9             ConfigurationClassUtils.isLiteConfigurationClass(beanDef)) {  10          if (logger.isDebugEnabled()) {  11             logger.debug("Bean definition has already been processed as a configuration class: " + beanDef);  12          }  13       }  14   //如果当前的bean是Javabean配置类(含有@Configuration注解的类),则加入到集合configCandidates中, 15       else if (ConfigurationClassUtils.checkConfigurationClassCandidate(beanDef, this.metadataReaderFactory)) {  16          configCandidates.add(new BeanDefinitionHolder(beanDef, beanName));  17       }  18    }  19  20    // Return immediately if no @Configuration cla
                    
50000+
5万行代码练就真实本领
17年
创办于2008年老牌培训机构
1000+
合作企业
98%
就业率

联系我们

电话咨询

0532-85025005

扫码添加微信