写点什么

Spring 源码学习 06:AnnotatedBeanDefinitionReader

发布于: 2020 年 12 月 05 日
Spring 源码学习 06:AnnotatedBeanDefinitionReader

前言


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 方法有两个逻辑:


  1. 将这几个 Processor 注册到 beanFactory;

  2. 处理器封装为 BeanDefinitionHolder 对象。



BeanDefinitionHolder 就是封装了下 BeanDefinition ,说明这个 BeanDefinition 的持有者 name 是谁。


大胆猜测


执行完这一行之后,在 AnnotationConfigApplicationContext 里面有了 这几个 BeanDefinition。


小心求证


Debug 走起!



额…… 只有四个,假装是对的。还是一步一步看一看吧!原来是没有 JSR-250 和 JPA,那这个就正常了。


总结



其实简而言之,这一步就是注册了一些 Spring 自己的 PostProcessor。


相关推荐



发布于: 2020 年 12 月 05 日阅读数: 44
用户头像

个人公众号:『 程序员小航 』 2020.07.30 加入

某不知名互联网公司 Java 程序员一枚。记录工作学习中的技术、开发及源码笔记;分享生活中的见闻感悟。

评论

发布
暂无评论
Spring 源码学习 06:AnnotatedBeanDefinitionReader