孙哥Spring源码第13集

第13集、Spring BeanDefinition 创建注册过程

【视频来源于:B站up主孙帅suns Spring源码视频】【微信号:suns45】

1、BeanDefinition有哪些非常重要的实现?有哪些区别?

1、AnnotatedBeanDefinition

2、RootBeanDefinition

3、GenericBeanDefinition

从宏观角度

AnnotatedBeanDefinition处理注解

RootBeanDefinition和GenericBeanDefinition处理XML

2、RootBeanDefinition和GenericBeanDefinition在应用和spring设计过程当中的区别

RootBeanDefinition和GenericBeanDefinition处理XML

区别
Spring目前建议废除RootBeanDefinition,废除的理由是什么呢?
GenericBeanDefinition不支持父子Bean的

3、如何将注解转化成BeanDefinition?

通过BeanDefinitionReader解决
loadBeanDefinitions加载配置信息转化成BeanDefinition,然后通过获取容器getRegistry()来进行存储,往DefaultListableBeanFactory的beanDefinitionMap中存。

4、看BeanDefinitionReader的实现类

孙哥Spring源码第13集_第1张图片

5、基于注解的配置形式是怎么处理的呢?

AnnotatedBeanDefinitionReader

6、Spring关于注解配置形式设计不合理的地方

孙哥Spring源码第13集_第2张图片

AnnotatedBeanDefinitionReader没有实现BeanDefinitionReader接口,不属于这一个BeanDefinitionReader这个继承体系。
AnnotatedBeanDefinitionReader就是一个普通的类

7、AnnotatedBeanDefinitionReader比较核心的有哪些方法?

1、AnnotatedBeanDefinitionReader的构造方法帮助我们传入了BeanDefinitionRegistry可以帮助我们注册BeanDefinition。

2、registerBean,注册是交由doRegisterBean来完成的,为什么spring大量的使用了这种结构呢比如createBean,最终完成实质性操作的是doCreateBean,因为前面不加do的话,会有大量的重载,而最终都归口于doXXX方法去执行。

3、doRegisterBean:第一件事创建了BeanDefinition,第二件事registy注册,一个方法不仅创建了对象还进行了注册。

4、总结:AnnotatedBeanDefinitionReader完成注解形式的BeanDefinition的获取

8、有几种方式获取BeanDefinition呢?XmlBeanDefintionReader和AnnotaedBeanDefintionReader获取BeanDefinition的区别

孙哥Spring源码第13集_第3张图片 孙哥Spring源码第13集_第4张图片
  • 通过AnnotaedBeanDefintionReader获取
    • AnnotaedBeanDefintion它是怎么做的呢,通过构造方法传入类型的方式进行构建new AnnotaedBeanDefintion(User.class)。
  • 通过XmlBeanDefintionReader获取
    • GemericBeanDefintion gbd = new GemericBeanDefintion()
    • gbd.set(xml->对应标签的获取)
  • 可以通过编码的方式获取BeanDefinition
    • image-20230510105449814

9、为什么要细化对AnnotaedBeanDefintionReader注册AnnotaedBeanDefintion?

可能日后需要扩展。

10、BeanDefinitionHolder和BeanDefinition的关系?以及Spring为什么要这么设计它呢?

BeanDefinitionHolder由BeanDefinition和beanName构成

为什么?

封装一层,可以操作方便,传参方便。

11、如何通过BeanDefinition去影响Spring?

  • 对这个对象的set注入和构造注入,是非常重要的扩展点。
    • 1、通过PropertyValue,GenericBeanDefinition中专门有一个PropertyValues去存储property标签的信息。
    • 2、通过构造函数pring对象创建对象之前进行影响。
  • 孙哥Spring源码第13集_第5张图片

12、BeanDefintion如何完成注册?

孙哥Spring源码第13集_第6张图片

不管是什么BeanDefintion最终还是得通过DefaultListableBeanFactory的beanDefinitionMap

13、常识总结

AnnotaedBeanDefintionReader注册bean分为两步

孙哥Spring源码第13集_第7张图片

14、Spring中注册bean有哪些方式?

  • 1、xml配置文件走reader进行解析注册。
  • 2、通过注解的方式,泛指@Configuration @Component[衍生注解],当spring的工厂遇到这些注解之后就会生成对应的BeanDefinition把对应的类生成BeanDefinition。
  • 3、Import的方式
    • 3.1、@Import
      • 孙哥Spring源码第13集_第8张图片
    • 3.2、实现ImportSelector
      • 孙哥Spring源码第13集_第9张图片
    • 3.3、实现ImportBeanDefinitionRegistrar接口
      • 孙哥Spring源码第13集_第10张图片

15、为什么不通过加注解@Component的方式而是通过ImportSelector的方式?

孙哥Spring源码第13集_第11张图片 孙哥Spring源码第13集_第12张图片

开发过程中是不常用的,往往是封装的时候用的,好处 不向最终用户暴露细节。
但是你在AppConfig中不是也需要引入吗?但是我可以自定义一个注解去@Import(这个类)。

16、ImportBeanDefinitionRegister和ImportSelector的区别

ImportBeanDefinitionRegister的灵活度比ImportSelector高
ImportBeanDefinitionRegister使用场景就是:Spring和Mybatis整合的时候用。

你可能感兴趣的:(spring,java)