返回顶部
首页 > 资讯 > 精选 >Spring的Bean初始化过程和生命周期是什么
  • 187
分享到

Spring的Bean初始化过程和生命周期是什么

2023-07-05 19:07:33 187人浏览 独家记忆
摘要

本篇内容介绍了“spring的Bean初始化过程和生命周期是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!一、Spring创建bean的

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

    一、Spring创建bean的流程图

    Spring的Bean初始化过程和生命周期是什么

    Spring的Bean初始化过程和生命周期是什么

    二、Spring创建bean的详细流程

    上面的流程图其实已经可以很清晰的看到bean的创建过程了,这里结合图片我们一起来详细说下这个过程,这里不贴源码,贴了源码只会让观看的人比较迷糊,若是想跟源码的可以对照上面的流程图完全能做到源码复现,bean创建的这个过程大致可以分为五步:加载bean信息,实例化bean,bean属性填充,初始化bean,后置操作,那我们就基于这五大步来看看Spring是如何创建bean的。

    1.加载bean信息

    ioc注解修饰的类,或者通过xml配置的类,首先在容器启动时一refresh方法为入口,会将这些类扫描进来形成BeanDefinition信息,BeanDefinition就是包含了我们配置的一些bean的属性,比如是否单例,是否有bean依赖(DependOn),bean的名称,bean所属class的全路径等,这里存储的相当于bean的元信息,然后通过 BeanDefinitionReGIStry将这些BeanDefinition加载进来后面我们就可以利用该信息了,且在Spring创建Bean的全程都需要BeanDefinition的参与,所以他很重要。

    2.实例化bean

    通过上面的图可以清晰看到在实例化阶段之前其实还有很多小的操作:容器会先去尝试getBean–>doGetBean–>getSingleton等操作在这些操作都拿不到对象以后才会开始着手创建对象,需要说的是getSingleton会尝试从三级缓存中依次去获取Bean,当所有缓存都获取不到时就可以确认当前bean没有被创建,然后就可以启动创建的相关动作

    • 利用BeanDefinition检查是否有依赖的bean(配置了@DependOn注解)如有,需要先加载依赖bean

    • 利用BeanDefinition检查是否单例bean,是走单例bean的创建流程,不是再判断是否是原型bean,是走原型bean创建,否则都是另一套路径创建

    • 开始实例化,调用getSingleton,此时传入的是对象工厂(ObjectFactory)的实现类,因为对象工厂是函数式接口,这里传入的其实就是createBean‘的lamda表达式

    • 将当前bean加入到正在创建bean的一个set

    • 调用对象工厂的getObject方法,因为我们再上面已经传入了对象工厂(通过lamda表达式传入)这里相当于调用刚刚的lamda表达式,调用里面的createBean方法

    • createBean去调了doCreateBean又调了createBeanInstance,在这里底层通过反射技术获取构造参数将对象创建了出来,此时的对象只是通过空参构造创建出来的对象,他并没有任何的属性。

    • 调用addSingletonFactory将实例化完成的bean加入到三级缓存,到这里实例化就算是结束了

    3.bean属性填充

    属性填充其实就为自身属性进行赋值的过程,根据我们的DI注解这里会先从三个缓存中获取bean,若是获取不到,则会尝试进行bean的创建,若是走到了bean的创建,则会重新走一边bean创建的整个流程,这里是递归逻辑。

    • populateBean 该方法是填充属性的入口,传入beanName和BeanDefinition

    • 从BeanDefinition中获取属性注入相关信息然后判断是名称注入还是类型注入

    • 调用getSingleton从容器中获取所需对象,若是获取不到则会重走对象创建的整个流程,拿到完整对象后将其给到当前bean的属性,到这里属性填充就结束了

    4.初始化bean

    属性填充完毕后并没有立即结束这个过程,还有一些其他的操作需要spring进行处理,比如aware接口的处理,postprocessor接口的处理,初始化的处理等操作其实这里主要就是处理这三个动作的

    • 判断有无实现aware接口,如有则去执行他的实现类的实现方法,所有aware接口可以参考上图中所列的三个aware接口,在spring初始化时会对他们进行是否实现的判断

    • 获取容器中所有postprocessor接口,然后开始执行他的前置方法

    • 判断有无实现初始化接口InitializingBean如有则去执行初始化方法afterPropertiesSet

    • 执行postprocessor的后置方法,通过前置和后置方法我们可以实现自定义的一些逻辑,不过需要注意的是这些前置和后置方法会作用到所有bean

    5.后置操作

    这里的后置操作,主要是完成一些清扫工作和适配工作,比如删除二级、三级缓存中无用的bean引用等,下面是具体操作。

    • 将bean从创建中的集合中删除

    • 将bean加入到单例池中将其从二级三级缓存中删除

    • 对对象进行一些适配操作,到这里完成了初始化的所有操作,后面就是一步步返回调用的地方了

    看了这五步,不知道是不是对bean的创建过程有了清晰的认识,如果还是不够清晰可以根据第一部分的流程图走下代码,代码走两遍其实就会比较清晰了。

    三、bean的生命周期

    bean的生命周期其实就是从创建到销毁,上面创建已经说完了,其实只差销毁这一步了。bean销毁发生在容器关闭时对单例bean进行清除操作。在Spring中我们通常有三种方式定义bean销毁时的逻辑

    通过PreDestroy注解修饰方法

    Bean销毁时会检查有无该注解修饰的方法,如有,会对该注解修饰的方法进行执行

    通过指定destroy-method方法

    在使用xml对bean进行注入时,我们可以指定init-method方法,也可以指定destroy-method方法,同样的使用Bean注解时也是支持这两个属性的,Spring容器关闭时会寻找当前bean有无指定destroy-method,如有则会进行执行

    实现DisposableBean接口

    实现该接口重写他的destroy方法,同样的Spring容器关闭时也会检查有无实现该接口,如有实现也会执行这里的销毁方法

    下面是对于三种销毁方式的测试代码

    第一端是自定义Spring容器,给容器注册钩子,这样当我们关闭Spring容器时会自动调用我们的销毁方法

    public class AppStartClass {    public static void main(String[] args) {        AnnotationConfigApplicationContext annotationConfigApplicationContext = new AnnotationConfigApplicationContext(yuCloseSpring.class);        annotationConfigApplicationContext.start();        annotationConfigApplicationContext.registerShutdownHook();    }

    这一段是测试代码了,分别使用三种方式写了销毁方法

    public class MyDisposableBean  implements DisposableBean{    @Override    public void destroy() throws Exception {        System.out.println("执行DisposableBean的销毁方法");    }    public void test(){        System.out.println("执行destroy-method销毁方法");    }    @PreDestroy    public void testPreDestroy(){        System.out.println("执行PreDestroy注解修饰的销毁方法");    }}@Configurationclass yuCloseSpring{    @Bean(destroyMethod = "test")    public MyDisposableBean getMyDisposableBean(){        return  new MyDisposableBean();    }}

    下面是启动main方法后的执行截图,可以清晰的看到三种销毁方法都是正常执行的,且他们执行顺序是固定的,即:PreDestroy–>DisposableBean–>destroy-method。

    Spring的Bean初始化过程和生命周期是什么

    到这里其实bean整个生命周期就算是彻底结束了。

    “Spring的Bean初始化过程和生命周期是什么”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注编程网网站,小编将为大家输出更多高质量的实用文章!

    --结束END--

    本文标题: Spring的Bean初始化过程和生命周期是什么

    本文链接: https://lsjlt.com/news/354584.html(转载时请注明来源链接)

    有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

    猜你喜欢
    • Spring的Bean初始化过程和生命周期是什么
      本篇内容介绍了“Spring的Bean初始化过程和生命周期是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!一、Spring创建bean的...
      99+
      2023-07-05
    • Spring Bean的生命周期是什么
      这篇“Spring Bean的生命周期是什么”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Spring ...
      99+
      2023-07-05
    • Spring bean的生命周期是什么
      Spring bean的生命周期包括以下阶段:1. 实例化(Instantiation):在容器启动时,Spring根据配置信息或注...
      99+
      2023-08-24
      Spring bean
    • spring初始化bean的过程是什么
      Spring初始化Bean的过程如下: 定义Bean:通过在配置文件或者注解中定义Bean的信息,包括Bean的名称、类别、属性...
      99+
      2024-02-29
      spring
    • spring中bean的生命周期是什么
      在Spring中,Bean的生命周期包括以下几个阶段:1. 实例化:当Spring容器接收到请求时,根据配置文件或注解等方式,在内存...
      99+
      2023-09-27
      spring bean
    • spring Bean的初始化过程解析
      AbstractAutowireCapableBeanFactory#applyMergedBeanDefinitionPostProcessors 使用BeanPostProce...
      99+
      2024-04-02
    • Spring中Bean的作用域与生命周期是什么
      这篇文章主要讲解了“Spring中Bean的作用域与生命周期是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Spring中Bean的作用域与生命周期是什么”吧!一、Bean的作用域通过S...
      99+
      2023-06-22
    • spring中bean的初始化方法是什么
      在Spring中,bean的初始化可以通过两种方式来完成:使用@Bean注解的initMethod属性或者实现Initializin...
      99+
      2023-09-21
      spring
    • Spring IOC容器Bean的作用域及生命周期是什么
      本篇内容介绍了“Spring IOC容器Bean的作用域及生命周期是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!bean作用域bean...
      99+
      2023-06-30
    • Spring中Bean初始化和销毁的方法是什么
      今天小编给大家分享一下Spring中Bean初始化和销毁的方法是什么的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。Sprin...
      99+
      2023-07-06
    • SpringBoot源码之Bean的生命周期是什么
      本文小编为大家详细介绍“SpringBoot源码之Bean的生命周期是什么”,内容详细,步骤清晰,细节处理妥当,希望这篇“SpringBoot源码之Bean的生命周期是什么”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知...
      99+
      2023-07-06
    • 怎么深入了解Spring的Bean生命周期
      本篇文章为大家展示了怎么深入了解Spring的Bean生命周期,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。什么是 Spring Bean 的生命周期对于普通的 Java 对象,当 new 的时候创...
      99+
      2023-06-26
    • spring加载过程和初始化方法是什么
      Spring加载过程分为以下几个阶段: 资源定位:Spring框架会根据配置文件或注解扫描的方式,定位到配置文件或类文件的位置。 ...
      99+
      2023-10-26
      spring
    • Springboot事件和bean生命周期执行机制是什么
      今天小编给大家分享一下Springboot事件和bean生命周期执行机制是什么的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。...
      99+
      2023-07-05
    • Spring Bean中的作用域和生命周期实例分析
      这篇文章主要介绍“Spring Bean中的作用域和生命周期实例分析”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Spring Bean中的作用域和生命周期实例分析”文章能帮助大...
      99+
      2023-07-02
    • Vue的生命周期是什么
      本篇内容主要讲解“Vue的生命周期是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Vue的生命周期是什么”吧!生命周期生命周期的简单介绍生命周期又叫做:生命周期回调函数、生命周期函数、生命周...
      99+
      2023-06-29
    • Springbean的生命周期是什么
      Spring Bean的生命周期可以分为以下几个阶段: 实例化(Instantiation):在容器启动时,Spring根据配置...
      99+
      2023-10-24
      Springbean
    • Flutter的生命周期是什么
      今天小编给大家分享一下Flutter的生命周期是什么的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。一 这里看一下Statef...
      99+
      2023-07-06
    • Vue生命周期中的组件化是什么
      这篇文章主要介绍了Vue生命周期中的组件化是什么,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。引出生命周期此时调用change,定时器回调修改opacity,数据修改,模板重...
      99+
      2023-06-29
    • javabean的生命周期和特点是什么
      JavaBean是一种符合JavaBeans规范的特殊Java类,它具有一定的生命周期和特点。1. 生命周期:- 创建阶段:Java...
      99+
      2023-08-26
      javabean
    软考高级职称资格查询
    编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
    • 官方手机版

    • 微信公众号

    • 商务合作