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)

相关推荐

  • python怎么制作自己的一个图形(python图形绘制的代码)

    技术Python 图形绘制详细代码怎么写这篇文章给大家介绍Python 图形绘制详细代码怎么写,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。1、条形图下面介绍条形图的画法。1.1 代码import

    攻略 2021年12月23日
  • ASP.NET如何关闭页面服务端及对话层清空

    技术ASP.NET如何关闭页面服务端及对话层清空这篇文章给大家介绍ASP.NET如何关闭页面服务端及对话层清空,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。要清掉Session必须回到服务端,在客户

    攻略 2021年11月26日
  • Python是怎么命名的

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

    攻略 2021年12月1日
  • sketch主要是做什么的(sketch 主要是做什么)

    技术sketch的优势是什么今天就跟大家聊聊有关sketch的优势是什么,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。现在UI设计师不仅仅需要掌握基础的设计软件P

    攻略 2021年12月24日
  • Python文本预处理的方法是什么

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

    攻略 2021年10月25日
  • 分析PostgreSQL DBA的pgAdmin情况

    技术分析PostgreSQL DBA的pgAdmin情况本篇内容介绍了“分析PostgreSQL DBA的pgAdmin情况”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如

    攻略 2021年11月5日