前言
BeanDefinition 的概念也理解了,也晓得一个 Bean 在 Spring 中定义的信息有哪些之后,持续言归正传。
源码剖析
在初始化时会学生成一个 reader,进入办法,其实是走的上面的逻辑:
其中 getOrCreateEnvironment(registry)
会返回一个 Environment
用来示意以后的运行环境之类的。
ConditionEvaluator
是用来实现对 @Conditional
这个条件注解的判断。
这块能够参考官网:Environment Abstraction 章节
Conditionally Include @Configuration Classes or @Bean Methods 章节
补充
BeanDefinitionRegistry:就是对 BeanDefinition 进行注册、移除、获取等操作的一个接口。
比方:registerBeanDefinition、removeBeanDefinition、containsBeanDefinition 看名字也能猜个大略意思。
registerAnnotationConfigProcessors
上面来看最初一行代码:
AnnotationConfigUtils.registerAnnotationConfigProcessors(this.registry);
这个代码绝对较长,还是以截图代替。
对 beanFactory 增加依赖比拟器 和 主动拆卸解析器 后开始增加各种处理器。
增加处理器时,上面膨胀的代码和惟一开展的 ConfigurationClassPostProcessor
外部逻辑雷同,都是调用 registerPostProcessor
办法,上面再介绍下这几个处理器的作用:
- ConfigurationClassPostProcessor 用于对 @Configuration 类进行疏导解决。
- AutowiredAnnotationBeanPostProcessor 解决 @Autowired @Value 和 JSR-330 的 @Inject 还有 @Lookup 注解
- CommonAnnotationBeanPostProcessor 用来解决 @PostConstruct @PreDestroy @Resource。
- PersistenceAnnotationBeanPostProcessor 当反对 JPA 时增加这个。
- EventListenerMethodProcessor 反对 @EventListener。
registerPostProcessor
registerPostProcessor 办法有两个逻辑:
- 将这几个 Processor 注册到 beanFactory;
- 处理器封装为 BeanDefinitionHolder 对象。
BeanDefinitionHolder 就是封装了下 BeanDefinition,阐明这个 BeanDefinition 的持有者 name 是谁。
大胆猜想
执行完这一行之后,在 AnnotationConfigApplicationContext 外面有了 这几个 BeanDefinition。
小心求证
Debug 走起!
额…… 只有四个,伪装是对的。还是一步一步看一看吧!原来是没有 JSR-250 和 JPA,那这个就失常了。
总结
其实简而言之,这一步就是注册了一些 Spring 本人的 PostProcessor。
相干举荐
- Spring 源码学习 05:BeanDefinition 概念及其实现
- Spring 源码学习 04:初始化容器与 DefaultListableBeanFactory
- Spring 源码学习 03:创立 IoC 容器的几种形式