前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Spring 源码学习 06:AnnotatedBeanDefinitionReader

Spring 源码学习 06:AnnotatedBeanDefinitionReader

作者头像
程序员小航
发布2020-12-15 11:29:30
4950
发布2020-12-15 11:29:30
举报
文章被收录于专栏:程序员小航
前言

BeanDefinition 的概念也了解了,也知道一个 Bean 在 Spring 中定义的信息有哪些之后,继续言归正传。

1

源码分析

在初始化时会先生成一个 reader ,进入方法,其实是走的下面的逻辑:

其中 getOrCreateEnvironment(registry) 会返回一个 Environment 用来表示当前的运行环境之类的。

ConditionEvaluator 是用来完成对 @Conditional 这个条件注解的判断。

这块可以参考官网:

  1. Environment Abstraction 章节
  2. Conditionally Include @Configuration Classes or @Bean Methods 章节

"补充 BeanDefinitionRegistry:就是对 BeanDefinition 进行注册、移除、获取等操作的一个接口。比如:registerBeanDefinition、removeBeanDefinition、containsBeanDefinition 看名字也能猜个大概意思。

registerAnnotationConfigProcessors

下面来看最后一行代码:

代码语言:javascript
复制
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

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

大胆假设

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

小心求证

Debug 走起!

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

2

总结

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

- <End /> -

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-12-05,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 程序员小航 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档