zoukankan      html  css  js  c++  java
  • 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

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

    大胆猜测

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

    小心求证

    Debug 走起!

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

    总结

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

    相关推荐

    作者: 刘志航

    公众号:『 程序员小航 』

    版权声明:本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Notes

  • 相关阅读:
    【学术篇】SDOI2017 数字表格
    【学术篇】分析矿洞 杜教筛
    【学术篇】bzoj3262 陌上花开. cdq分治入门
    ubuntu搭建git服务器
    windows中操作文件和目录的函数
    php的单例模式
    linux挂载新硬盘
    改造vim
    关于在mfc中cstring转为float和ini
    windows自带的线程池
  • 原文地址:https://www.cnblogs.com/liuzhihang/p/source-spring-6.html
Copyright © 2011-2022 走看看