BeanDefinition 的概念也了解了,也知道一个 Bean 在 Spring 中定义的信息有哪些之后,继续言归正传。
1
源码分析
在初始化时会先生成一个 reader ,进入方法,其实是走的下面的逻辑:
其中 getOrCreateEnvironment(registry)
会返回一个 Environment
用来表示当前的运行环境之类的。
ConditionEvaluator
是用来完成对 @Conditional
这个条件注解的判断。
这块可以参考官网:
"补充 BeanDefinitionRegistry:就是对 BeanDefinition 进行注册、移除、获取等操作的一个接口。比如:registerBeanDefinition、removeBeanDefinition、containsBeanDefinition 看名字也能猜个大概意思。
registerAnnotationConfigProcessors
下面来看最后一行代码:
AnnotationConfigUtils.registerAnnotationConfigProcessors(this.registry);
这个代码相对较长,还是以截图代替。
对 beanFactory 添加依赖比较器 和 自动装配解析器 后开始添加各种处理器。
添加处理器时,下面收缩的代码和唯一展开的 ConfigurationClassPostProcessor
内部逻辑相同,都是调用 registerPostProcessor
方法,下面再介绍下这几个处理器的作用:
registerPostProcessor
registerPostProcessor 方法有两个逻辑:
BeanDefinitionHolder
BeanDefinitionHolder 就是封装了下 BeanDefinition ,说明这个 BeanDefinition 的持有者 name 是谁。
大胆假设
执行完这一行之后,在 AnnotationConfigApplicationContext 里面有了 这几个 BeanDefinition。
小心求证
Debug 走起!
额…… 只有四个,假装是对的。还是一步一步看一看吧!原来是没有 JSR-250 和 JPA,那这个就正常了。
2
总结
其实简而言之,这一步就是注册了一些 Spring 自己的 PostProcessor。
- <End /> -