阅读本文之前,你必须要了解什么是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

Spring-ConfigurationClassPostProcessor类相关推荐

  1. Spring - 同一个类中的方法互相调用,注解失效问题的分析和解决(转)

    Spring - 同一个类中的方法互相调用,注解失效问题的分析和解决(转) 参考文章: (1)Spring - 同一个类中的方法互相调用,注解失效问题的分析和解决(转) (2)https://www. ...

  2. Spring component-scan类扫描加载过程

    2019独角兽企业重金招聘Python工程师标准>>> https://github.com/javahongxi 有朋友最近问到了spring加载类的过程,尤其是基于annotat ...

  3. Spring工具类的使用

    2019独角兽企业重金招聘Python工程师标准>>> Spring-core中提供了大量的工具类,常用的有StringUtils.ObjectUtils.NumberUtils.B ...

  4. java spring注入 静态方法_java相关:spring为类的静态属性实现注入实例方法

    java相关:spring为类的静态属性实现注入实例方法 发布于 2020-3-31| 复制链接 在本篇文章里小妖给大家整理的是关于spring为类的静态属性实现注入实例方法,有需要的朋友们可以参考下 ...

  5. 浅谈Spring IOC和DI及Spring工厂类

    浅谈Spring IOC和DI及Spring的工厂类 文章目录 浅谈Spring IOC和DI及Spring的工厂类 一. IOC 1.什么是IOC 2.为什么使用IOC 传统开发模式的弊端 3. 使 ...

  6. Spring框架如何加载和定义Spring Bean类?

    本篇介绍什么是Spring Bean类,如何创建Bean类,以及如何将Bean类添加到Spring IOC容器.通过本篇的学习,可以达成如下目标. ● 认识Spring Bean类 ● 掌握Bean类 ...

  7. Spring同一个类事务处理

    Spring同一个类事务处理 同一个类不同方法事务可以传播(需要满足事务的前提) 同一个类两个不同方法调用(注解方式) 同一个类两个不同方法调用(注解方式,父方法捕捉了异常) 同一个类两个不同方法调用 ...

  8. spring同一个类中,一个方法调用另外一个注解(@Transactional)方法时,注解失效

    title: "spring同一个类中,一个方法调用另外一个注解(@Transactional)方法时,注解失效" url: "https://wsk1103.githu ...

  9. Java Spring 工厂类 BeanFactoryAware基本使用 亲测

    Java Spring 工厂类 BeanFactoryAware基本使用 1. BaseFactory.java 实现 Spring工厂接口 BeanFactoryAware 2. SearchFac ...

  10. 521我发誓读完本文,再也不会担心Spring配置类问题了

    生命太短暂,不要去做一些根本没有人想要的东西.本文已被 https://www.yourbatman.cn 收录,里面一并有Spring技术栈.MyBatis.JVM.中间件等小而美的专栏供以免费学习 ...

最新文章

  1. java连接mysql数据库(jsp显示和控制台显示)
  2. 一位年轻董事长给大学生的18条好建议
  3. Python 进阶_OOP 面向对象编程_静态方法和类方法
  4. 一行代码搞定 Scrapy 随机 User-Agent 设置
  5. linux 脚本 DIST,shell 脚本判断linux 的发行版本
  6. php同个用户同时只能登陆一个, 后登陆者踢掉前登陆者
  7. Java继承知识之基本控制语句(if、switch与穿透现象)
  8. 当画面出现问题时,如何调试!
  9. Vue.js 5 @慕课网
  10. 常见的IT自动化运维工具有哪些?推荐一款好用的?
  11. 【算法】leetcode-838 推多米诺
  12. 一致性 hash 算法 — CARP 2020/5/11 19:38
  13. 二补数(2’scomplement)乘法算法及其Verilog实现 - 固定系数h
  14. 佳能r3和佳能r5哪个好
  15. Oracle 数据库
  16. 毕业生社保、档案和户口详解 2
  17. 微信开放平台 错误码61007: api is unauthorized to component
  18. C语言编程入门新手学习精华:这样学习C语言最有效
  19. 使用echarts配置中国地图
  20. BottomNavigationView(底部导航)

热门文章

  1. Oulipo(Hash入门第一题 Hash函数学习)
  2. “sudo: apt-get:找不到命令”的解决方法
  3. JDK8新特性(十二)之并行的Stream流
  4. Python中TypeError: ‘str‘ object is not callable
  5. ic408服务器系统,威力铭408mt技术描述和配置.docx
  6. springboot获取静态图片路径_springboot为实体追加图片路径
  7. java的class文件魔数和版本对应关系
  8. java math mod_java8 Math新增方法介绍
  9. easypoi之IExcelVerifyHandler自定义校验使用
  10. git解决error: failed to push some refs to ‘xxx(远程库)‘