BeanDefinition的原理是什么

技术BeanDefinition的原理是什么这期内容当中小编将会给大家带来有关BeanDefinition的原理是什么,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。一、BeanDefi

本期,边肖将为大家带来《豆定义》的原理。文章内容丰富,从专业角度进行分析和描述。希望你看完这篇文章能有所收获。

一、BeanDefinition浅析

10-1010首先,我来问一个问题:java对象和Spring Bean有什么区别?

这是一个经典的面试问题。什么是java对象?一切都是一个物体。Java中的所有类在创建后都可以被称为对象。SpringBean也是一个java对象,但是SpringBean与JAVA对象是分开的。为什么这么说?因为一个类只能通过new来调用一个对象,但是一个类需要经过一系列的生命周期才能成为Spring Bean。什么生命周期?我以后再说吧!

至少从上面我们可以知道,Spring Bean是一个特殊的Java对象,所以它一定和JAVA对象不一样!

JAVA中的类对象可以描述一个JAVA对象,但是因为SpringBean是一个特殊的Java对象,类对象不能完全描述一个Spring Bean,所以Spring正式开发了一个名为BeanDefinition的类来描述一个Spring Bean!

1. 基本概念了解

BeanDefinition描述了很多事情,大致如下:

BeanDefinition的原理是什么

Image-20200907164143213它存储了Spring在创建bean过程中需要的所有原材料!

2. 大致结构

提升效率:之春通过反思创造阶级。创建类时,需要一些创建信息,比如类,比如注释信息等。它是预先缓存的,可以在创建bean时直接从缓存中获取,从而提高创建效率。方便修改:当Spring创建一个对象时,所有创建的信息都是由存储在BeanDefinition中的信息创建的,所以我们可以通过修改BeanDefinition中的特定值来改变创建对象的结果!方便扩展:我们可以通过一些特定的接口获取一个类的所有BeanDefinition信息,从而完成一些特定功能的实现!00-1010通过上面的介绍,那么你对BeanDefinition有了一个大概的了解,所以当我们理解整个Spring声明周期的时候,我们需要知道两个概念,BeanFactoryPostProcessor和BeanPostProcessor。当然,这只是为了普及概念,让读者对Spring的申报周期有更深入的了解!

3. 他是干嘛的(Spring构建它的优势)?

我们现在通过上面的理解知道了一件事,那就是Spring会在创建对象之前把类转换成一个BeanDefinition。这时,Spring为我们提供了一个扩展点。在读取了所有的类并将其转换为bean定义后,所有实现BeanFactoryPostProcessor接口的实现类都被回调并传递到工厂对象中,这样用户就可以修改工厂对象内部的属性,例如修改BeanDefinition中的信息,从而操纵最终实例化的bean!

说白了,他在扫描完项目,把Class转换成BeanDefinition之后,就会有进步。

行实例化之前进行接口的回调!

     

2. 什么是BeanPostProcessor?

这个类和上面那个类十分的相似,他有两个方法,两个方法的调用时机也不相同,他会在实例化之后,调用初始化方法之前进行第一次方法回调(postProcessBeforeInitialization),在执行完初始化方法之后又会进行一次回调(postProcessAfterInitialization),每次回调该类都会将当前创建好的bean传递到方法内部,从而让开发者能够自定义的修改当前bean的一些定义!

     

3. Spring生命周期浅析

那么此时,我们了解了BeanDefinitionBeanPostProcessorBeanFactoryPostProcessor这三个概念之后,我们可以尝试着学习一下Spring的生命周期,学习Spring声明周期对掌握Spring源码具有举足轻重的地位!只有了解Spring的声明周期,才能够对后续Spring系列的技术进行一个详尽的源码掌握!

整个Spring的生命周期,以文字描述大概分为以下几个阶段:

  1. 初始化bean容器,以方便后续的所有的读取的信息的存储!
  2. 初始化内置的class文件转换为bd
  3. 初始化bean工厂,设置一些默认值!
  4. 向BeanFactory内部注册一些自己本身内置的Bean后置处理器
  5. 执行项目内置的
            BeanFactoryPostProcessor扫描项目将所有的
            @Bean、@Component....或者
            xml配置等符合Spring读取对应的类解析成
            BeanDefinition,存储在容器里面!
  6. 执行我们自定义的
            BeanFactoryPostProcessor
  7. 注册所有的
            BeanPostProcessor到容器内部!
  8. 初始化国际化资源
  9. 初始化事件资源
  10. 实例化class
  11. 按照规则进行属性填充(自动注入)
  12. 回调
            BeanPostProcessors.postProcessBeforeInitialization方法
  13. 调用bean的初始化方法
  14. 回调
            BeanPostProcessors.postProcessAfterInitialization方法
BeanDefinition的原理是什么
     
123

     

三、BeanDefinition详解

     

1. AbstractBeanDefinition

尽管我们可以通过实现BeanDefinition接口创建一个自定义的BeanDefinition,但是你是否发现,自己实现这个接口,想要创建一个BeanDefinition极其复杂里面几十个属性都需要你自己去设置;

Spring官方为了简化这一步骤,提供了一个抽象AbstractBeanDefinition,这个抽象类内部默认实现了BeanDefinition的绝大部分方法,对一些属性进行了默认值的赋值,极大地简化了用户自己实现一个BeanDefinition的难度!

     

I.  GenericBeanDefinition

他是AbstractBeanDefinition的子类,我们通过注解配置的bean以及我们的配置类(除@Bean)外的BeanDefiniton类型都是GenericBeanDefinition类型的!

     

II.  RootBeanDefinition

Spring在启动时会实例化几个初始化的BeanDefinition,这几个BeanDefinition的类型都为RootBeanDefinition,这个包括后续Spring的BeanDefinition会进行一个合并(这都是后话)都是RootBeanDefinition类型的!

我们通过 @Bean创建的BeanDefinition也是RootBeanDefinition类型,当然是属于他的子类(后面会介绍)的!

     

2. AnnotatedBeanDefinition

这个接口直接继承了BeanDefinition,他在原来的基础上扩展了两个方法:

BeanDefinition的原理是什么
     
image-20200907180423084

这两个方法是专门对注解读取的方法!所有注解标识的bean都是这个类型的bean!

     

I.  AnnotatedGenericBeanDefinition
BeanDefinition的原理是什么
     
image-20200907180954450

第一种情况是配置类也就是标注了@Configuration注解的类会被解析成 AnnotatedGenericBeanDefinition

第二种情况是通过@Import导入的类会被解析成AnnotatedGenericBeanDefinition

     

II. ConfigurationClassBeanDefinition
BeanDefinition的原理是什么
     
image-20200907182021917

通过@Bean注解导入的类会被解析为ConfigurationClassBeanDefinition

     

III. ScannedGenericBeanDefinition
BeanDefinition的原理是什么
     
image-20200907182139696

通过@Service、@Compent等方式创建的bean 会以ScannedGenericBeanDefinition的形式存在!

上述就是小编为大家分享的BeanDefinition的原理是什么了,如果刚好有类似的疑惑,不妨参照上述分析进行理解。如果想知道更多相关知识,欢迎关注行业资讯频道。

内容来源网络,如有侵权,联系删除,本文地址:https://www.230890.com/zhan/133183.html

(0)

相关推荐

  • 如何进行数据库三大范式的分析

    技术如何进行数据库三大范式的分析这篇文章将为大家详细讲解有关如何进行数据库三大范式的分析,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。一: 引言 作为一个数据

    攻略 2021年12月2日
  • 正气宝的功效与作用,麻黄的功效是什么,有什么禁忌

    技术正气宝的功效与作用,麻黄的功效是什么,有什么禁忌麻黄为麻黄科植物草麻黄正气宝的功效与作用、中麻黄或木贼麻黄的干燥草质茎,属于发散风寒药。麻黄主要含麻黄碱、伪麻黄碱、去甲基麻黄碱、去甲基伪麻黄碱、甲基麻黄碱、甲基伪麻黄

    生活 2021年10月27日
  • ES6新特性常用的知识点有哪些

    技术ES6新特性常用的知识点有哪些这篇文章主要介绍了ES6新特性常用的知识点有哪些,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。1.关键字Let 关键字

    攻略 2021年11月13日
  • 怎么使用Docsify和GitHub Pages创建一个文档网站

    技术怎么使用Docsify和GitHub Pages创建一个文档网站这篇文章主要介绍怎么使用Docsify和GitHub Pages创建一个文档网站,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!使

    攻略 2021年10月26日
  • java怎么判断是否为数组参数(java分位数算法)

    技术Java分位点计算方法是什么本篇内容介绍了“Java分位点计算方法是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成

    攻略 2021年12月16日
  • 怎么掌握SQL聚合、分组和排序

    技术怎么掌握SQL聚合、分组和排序这篇文章主要介绍“怎么掌握SQL聚合、分组和排序”,在日常操作中,相信很多人在怎么掌握SQL聚合、分组和排序问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”

    攻略 2021年11月10日