SpringBean的生命周期

SpringBean的生命周期。小编来告诉你更多相关信息。Spring文章摘要:Spring方面的介绍,具体详情如下:既然聊到SpringBean的生命周期,首先,我们要知道的是JavaB...

SpringBean的生命周期。小编来告诉你更多相关信息。

Spring

文章摘要:Spring方面的介绍,具体详情如下:

既然聊到Spring Bean的生命周期,首先,我们要知道的是Java Bean和Spring Bean实例化过程是有一些区别的。

Java Bean创建的步骤

简要的说一下普通环境下创建Java Bean简要的几个步骤:

  • 首先Java源码会被编译为class文件。
  • 接着类被初始化(比如new对象、反射获取对象等操作)。
  • 然后class文件会被虚拟机通过类加载器加载到JVM。
  • 最后会初始化对象供我们使用。

简单来说可以理解为Class文件作为【模板】进而创建出具体的实例。面试这么简单聊一下从而引出Spring对象的生命周期,显得你更加从容。

步入正题 :

Spring Bean的生命周期

而Spring所管理的Bean与Java不同的是,除了Class对象之外,还会使用BeanDefinition的实例来描述对象的信息。比如说:

  • 我们可以在Spring所管理的Bean中有一系列的描述,常见的有:@Scope、@Lazy、@DependsOn等等 。

可以理解为:Class只描述了类的信息,而BeanDefinition描述了对象的信息。也就是Spring有BeanDefinition来存储我们日常给Spring Bean定义的元数据(@Scope、@Lazy、@DependsOn)。

流程

  • 首先Spring在启动的时候需要扫描在XML/注解/JavaConfig中需要被Spring管理的Bean信息
  • 随后,会将这些信息封装成BeanDefinition,最后会把这些信息放到一个BeanDefinitionMap中
    • BeanDefinitionMap中的key是beanName,value是BeanDefinition对象
    • 到这里其实是把定义的元数据加载起来,目前真实的对象还没有进行实例化
  • 接着会遍历这个BeanDefinitionMap,执行BeanFactoryPostProcessor这个Bean工厂后置处理的逻辑
    • 比如说:我们平时定义的占位符信息,就是通过BeanFactoryPostProcessor的子类PropertyPlaceholderConfigurer进行注入进去的。
    • 当然这里我们也可以通过自定义BeanFactoryPostProcessor来对我们定义好的Bean元数据进行获取或者修改。只是我们一般不会这么做的,实际的应用场景也很少。
  • BeanFactoryPostProcessor后置处理器执行完之后,就到了实例化对象了,在Spring里边是通过反射来实现的,一般情况下会通过反射选择合适的构造器来把对象实例化。注意,这里把对象实例化,只是将对象创建出来,而对象的属性还没有注入的。
    • 比如:有一个对象UserService依赖着SendService对象,这时SendService还是null的。
  • 实例化完成后,紧接着就是把对象的相关属性给注入。
  • 属性注入完成之后,就是初始化的动作了。
  • Bean的初始化首先会判断该Bean时候实现了Aware相关的接口,如果存在了则会填充相关资源。

      SpringBean的生命周期。小编来告诉你更多相关信息。

      Spring

    • 比如:我在系统中系统通过代码程序的方式获得指定的Spring Bean。我就会抽取一个工具类,去实现ApplicationContextAware接口,来获取ApplicationContext对象从而获取Spring Bean。
  • Aware相关的接口处理完之后,就回到BeanPostProcessor后置处理器了,BeanPostProcessor后置处理器有两个方法,一个是before,一个是after。
    • 这个Bean Post Processor后置处理器是AOP实现的关键。关键子类AnnotationAwareAspectJAutoProxyCreator
    • 所以,执行完Aware相关的接口就会执行BeanPostProcessor相关子类的Before方法
  • BeanPostProcessor相关子类的before方法执行完成之后,则会执行init相关的方法。
    • 比如:@PostConstruct 、以及实现了InitizlizingBean接口、定义的init-method方法
    • 它们的执行顺序为:@PostConstruct 、实现了InitizlizingBean的接口、定义的init-method方法
    • 实际场景中@PostConstruct经常用在对象实例化后,我们要初始化爱你公关工作或者启动个线程去MQ拉取数据
  • 等到int方法执行完成之后,就会执行BeanPostProcessor的after方法。
  • 基本的重要流程就已经走完了,此后我们便可以获取对象去使用了。
  • 最后销毁的时候就看有没有配置相关的destroy方法,执行就完事了。

上述整体流程大致如图所示:

SpringBean的生命周期-图1

至此:Spring Bean的一整套生命周期也就完事了。

以上网介绍的Spring 及其 Bean的生命周期的详细讲解,小编希望本文能给你带来生活上的帮助!

阅读前请先查看【免责声明】本文内容由互联网用户自发贡献,该文观点仅代表作者本人,本站仅供展示。如发现本站有涉嫌抄袭侵权/违法违规的内容,请发送邮件至 1217266901@qq.com 举报,一经查实,本站将立刻删除。 转载请注明出处:https://www.jingfakeji.com/tech/56743.html

上一篇 2024年01月10日 18:38
下一篇 2024年01月10日 18:39

相关推荐

  • 实际工作中哪里用到了自定义注解的方法

    实际工作中哪里用到了自定义注解的方法。小编来告诉你更多相关信息。实际工作中哪里用到了自定义注解的方法小编为大家解答实际工作中哪里用到了自定义注解的方法的相关知识,下面小编为您详细解答自定义注解可以标...

    2024年02月05日
    4
  • 一键部署SpringBoot到远程Docker容器

    一键部署SpringBoot到远程Docker容器。小编来告诉你更多相关信息。一键部署Spring网小编为你介绍一键部署Spring的相关介绍,接下来小编就来介绍。在当今软件开发领域,应用程序的容器化部署已经成为...

    2024年02月05日
    9
  • SpringAOP/IOC实现原理

    SpringAOP/IOC实现原理。小编来告诉你更多相关信息。Spring正文核心介绍:Spring的内容,一起跟随小编看看吧!AOP什么是AOP通俗的讲就是当你想要实现对象增强,就可以使用AOP...

    2024年01月10日
    9
  • JVM、JDK、JRE的区别

    JVM、JDK、JRE的区别。小编来告诉你更多相关信息。JVM、JDK、JRE的区别今日重点为您介绍JVM、JDK、JRE的区别方面的介绍,接下来带大家一起了解。它们之间的区别如下:JVM是...

    2024年01月10日
    10
  • JVM解释和编译指南

    JVM解释和编译指南。小编来告诉你更多相关信息。JVM解释和编译指南为关注网的网友们详解JVM解释和编译指南的相关介绍,接下来分享详细内容。Java是一种跨平台的编程语言。程序源代...

    2023年11月11日
    7
  • 简述对RPC、RMI的理解

    简述对RPC、RMI的理解。小编来告诉你更多相关信息。简述对RPC、RMI的理解本文为你介绍简述对RPC、RMI的理解的内容,具体详情如下:RPC:在本地调用远程的函数,远程过程调用,可以...

    2023年11月06日
    8

联系我们

在线咨询: QQ交谈

邮箱:1217266901@qq.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信