java的properties類,Spring-ConfigurationClassPostProcessor類

 2023-10-15 阅读 27 评论 0

摘要:閱讀本文之前,你必須要了解什么是ConfigurationClass,然后我們再談本文標題中的ConfigurationClassPostProcessor,該類這是一個基礎設施類,由于繼承了BeanDefinitionRegistryPostProcessor接口,所以在此處主要討論兩個接口方法,按照

閱讀本文之前,你必須要了解什么是ConfigurationClass,然后我們再談本文標題中的ConfigurationClassPostProcessor,該類這是一個基礎設施類,由于繼承了BeanDefinitionRegistryPostProcessor接口,所以在此處主要討論兩個接口方法,按照方法優先執行順序

postProcessBeanDefinitionRegistry方法

這其中又調用了下面的方法
1.processConfigBeanDefinitions方法,代碼部分有很多刪減,我只記錄我認為重要的

public void processConfigBeanDefinitions(BeanDefinitionRegistry registry) {List<BeanDefinitionHolder> configCandidates = new ArrayList<BeanDefinitionHolder>();//獲取容器中所有的bean名字String[] candidateNames = registry.getBeanDefinitionNames();//省略N多代碼,for里主要做的就是判斷是否是configuration class//如果是,則把這個bean放到configCandidates中for (String beanName : candidateNames) {if (ConfigurationClassUtils.checkConfigurationClassCandidate(beanDef, this.metadataReaderFactory)) {configCandidates.add(new BeanDefinitionHolder(beanDef, beanName));}}if (configCandidates.isEmpty()) {return;}// 根據@Over里的值進行個排序,調用Collections.sort// 此處省略排序代碼Collections.sort// 繼續解釋下面的代碼SingletonBeanRegistry sbr = null;// 如果當前的BeanDefinitionRegistry是SingletonBeanRegistryif (registry instanceof SingletonBeanRegistry) {sbr = (SingletonBeanRegistry) registry;//此處代碼未知,因為從我跟蹤源碼,沒有代碼能進入到這個if,看注釋寫的是//判斷是否有通過手動注冊的bean也叫這個名字if (!this.localBeanNameGeneratorSet && sbr.containsSingleton(CONFIGURATION_BEAN_NAME_GENERATOR)) {BeanNameGenerator generator = (BeanNameGenerator) sbr.getSingleton(CONFIGURATION_BEAN_NAME_GENERATOR);this.componentScanBeanNameGenerator = generator;this.importBeanNameGenerator = generator;}}// 接下來將每個BeanDefinitionHolder都轉換成ConfigurationClass// 首先new一個ConfigurationClassParserConfigurationClassParser parser = new ConfigurationClassParser(this.metadataReaderFactory, this.problemReporter, this.environment,this.resourceLoader, this.componentScanBeanNameGenerator, registry);Set<BeanDefinitionHolder> candidates = new LinkedHashSet<BeanDefinitionHolder>(configCandidates);Set<ConfigurationClass> alreadyParsed = new HashSet<ConfigurationClass>(configCandidates.size());do {//在此處將BeanDefinitionHolder都轉換成ConfigurationClass//并且給變量configClasses,此處省略部分代碼parser.parse(candidates);Set<ConfigurationClass> configClasses = new LinkedHashSet<ConfigurationClass>(parser.getConfigurationClasses());// 將所有的configClasses都封裝成BeanDefinition,如果此時// configClasses是與AOP相關,則創建AOP核心處理類,AnnotationAwareAspectJAutoProxyCreator,并注入到容器中// 此處省略部分代碼this.reader.loadBeanDefinitions(configClasses);alreadyParsed.addAll(configClasses);candidates.clear();// 承接上文,如果容器中多出了一個類(上文中是AnnotationAwareAspectJAutoProxyCreator),那么找到這個類,下面刪了很多代碼if (registry.getBeanDefinitionCount() > candidateNames.length) {for (String candidateName : newCandidateNames) {//省略了很多代碼,下面判斷找到的這個累如果是configurationClass,則包裝成BeanDefinitionHolderif (ConfigurationClassUtils.checkConfigurationClassCandidate(bd, this.metadataReaderFactory) &&!alreadyParsedClasses.contains(bd.getBeanClassName())) {candidates.add(new BeanDefinitionHolder(bd, candidateName));}}candidateNames = newCandidateNames;}}while (!candidates.isEmpty());// Register the ImportRegistry as a bean in order to support ImportAware @Configuration classesif (sbr != null) {// 判斷是否BeanDefinitionRegistry包含一個叫importRegistry的bean,不包含就注冊一個,目前我并不知道這個bean是做什么用的if (!sbr.containsSingleton(IMPORT_REGISTRY_BEAN_NAME)) {sbr.registerSingleton(IMPORT_REGISTRY_BEAN_NAME, parser.getImportRegistry());}}//清空緩存,目前我并不知道做什么的,沒仔細看,應該是用來做局部變量保存的,完事兒之后就清空了if (this.metadataReaderFactory instanceof CachingMetadataReaderFactory) {((CachingMetadataReaderFactory) this.metadataReaderFactory).clearCache();}}

postProcessBeanFactory

版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。

原文链接:https://hbdhgg.com/5/137067.html

发表评论:

本站为非赢利网站,部分文章来源或改编自互联网及其他公众平台,主要目的在于分享信息,版权归原作者所有,内容仅供读者参考,如有侵权请联系我们删除!

Copyright © 2022 匯編語言學習筆記 Inc. 保留所有权利。

底部版权信息