乐趣区

关于java:Spring-源码学习-06AnnotatedBeanDefinitionReader

前言

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。

相干举荐

  • Spring 源码学习 05:BeanDefinition 概念及其实现
  • Spring 源码学习 04:初始化容器与 DefaultListableBeanFactory
  • Spring 源码学习 03:创立 IoC 容器的几种形式
退出移动版