如何理解 SpringBoot 的生命周期

这篇具有很好参考价值的文章主要介绍了如何理解 SpringBoot 的生命周期。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

生命周期,就是从诞生到死亡的一个过程。Spring 中 bean 也是如此。在 Spring 中的 ConfigurableApplicationContext 的 refresh 开始直到一个 bean 可以被正常使用,中间经历了一系列初始化操作;而在其 close 后又经历了一系列销毁操作,这被称之为 Spring 中 bean 的生命周期。

周期

Spring 中的 bean 经历了以下阶段:

如何理解 SpringBoot 的生命周期,SpringBoot,spring boot,java,后端,spring

其中红色的框不属于 Spring 来管理了。

实例化

实例化就是 Spring 通过反射来调用构造方法来实例化一个对象。

初始化

Spring 的初始化有两种方式,一种是实现 InitializingBean 接口,另一种是在一个方法上面加上 @PostConstruct 注解表示这是一个初始化方法。

销毁

Spring 的销毁对象的方式也有两种,一种是实现 DisposableBean,另一种是在一个方法上加 @PreDestroy 注解;和 初始化 的两种方式相对应。

顺序

具体顺序是如何,我们用一段代码就可以看到。

// NormalEntity.java 这是一个将往 Spring 中注入的类
import org.springframework.beans.factory.DisposableBean;
import org.springframework.beans.factory.InitializingBean;

import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;

public class NormalEntity implements InitializingBean, DisposableBean {

    public NormalEntity() {
        System.out.println("NormalEntity constructor...");
    }

    @PostConstruct
    public void init() {
        System.out.println("NormalEntity PostConstruct");
    }

    @PreDestroy
    public void preDestroy() {
        System.out.println("NormalEntity preDestroy");
    }

    @Override
    public void afterPropertiesSet() throws Exception {
        System.out.println("NormalEntity afterPropertiesSet");
    }

    @Override
    public void destroy() throws Exception {
        System.out.println("NormalEntity destroy");
    }
}

// MainConfig.java
import org.springframework.context.annotation.Bean;

public class MainConfig {

    @Bean
    public NormalEntity normalEntity() {
        return new NormalEntity();
    }
}
// MainTest.java 这里是启动类
import org.springframework.context.annotation.AnnotationConfigApplicationContext;

public class MainTest {

    public static void main(String[] args) {
        AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(MainConfig.class);
        NormalEntity bean = applicationContext.getBean(NormalEntity.class);
        System.out.println(bean);
        // 这里使用的是 AnnotationConfigApplicationContext,需要手动调用 close
        // 如果是 SpringBoot 项目,会自动注册 shutdown hook,里面调用了 close 方法
        applicationContext.close();
    }
}

会看到控制台打印出了结果,也展示了调用顺序:

NormalEntity constructor...
NormalEntity PostConstruct
NormalEntity afterPropertiesSet
NormalEntity preDestroy
NormalEntity destroy

代码的调用

在构造方法下一个断点,就可以根据调用栈知道调用路径了。

下面简要说明几处。

AbstractApplicationContext#finishBeanFactoryInitialization(ConfigurableListableBeanFactory)

如何理解 SpringBoot 的生命周期,SpringBoot,spring boot,java,后端,spring
AbstractApplicationContext#refresh 方法的倒数第二步调用了此方法来实例化容器中所有的非懒加载的bean(懒加载的肯定是用到的时候再实例化),这里就最终可以到AbstractBeanFactory#doGetBean(String, Class<T>, Object[], boolean)里面的getSingleton(String, ObjectFactory<?>),那最终其实就是调用参数ObjectFactory<?>提供的createBean(String, RootBeanDefinition, Object[])方法。

org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#doCreateBean(String, RootBeanDefinition, Object[])

  1. 调用createBeanInstance(String, RootBeanDefinition, Object[])方法来使用构造方法实例化对象;
  2. 在下面的applyMergedBeanDefinitionPostProcessors(RootBeanDefinition, Class<?>, String)中使用BeanPostProcessor调用有注解的初始化方法;
  3. initializeBean(String, Object, RootBeanDefinition)方法中调用了实现了InitializingBean接口的afterPropertiesSet方法

经历以上三步骤,bean的初始化完成。

同时如果想要知道Spring的bean在销毁时做了什么,可以在另外两个销毁方法下断点,就可以知道了。文章来源地址https://www.toymoban.com/news/detail-610592.html

到了这里,关于如何理解 SpringBoot 的生命周期的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 深入理解 Java Bean 的生命周期及各个阶段解析

    Java Bean是Java编程中经常使用的重要概念,它是可重用、可移植、可序列化的组件。在Java开发中,我们常常会遇到Bean对象,但是对于Bean的生命周期和各个阶段可能并不完全了解。本文将深入探讨Java Bean的生命周期,逐步解析Bean对象从创建到销毁的各个重要阶段。 Java Bean是一

    2024年02月14日
    浏览(35)
  • 【多线程系列-03】深入理解java中线程的生命周期,任务调度

    多线程系列整体栏目 内容 链接地址 【一】深入理解进程、线程和CPU之间的关系 https://blog.csdn.net/zhenghuishengq/article/details/131714191 【二】java创建线程的方式到底有几种?(详解) https://blog.csdn.net/zhenghuishengq/article/details/127968166 【三】深入理解java中线程的生命周期,任务调度 ht

    2024年02月17日
    浏览(41)
  • Spring Bean 的生命周期,如何被管理的

    实例化一个Bean,也就是我们通常说的new 按照Spring上下文对实例化的Bean进行配置,也就是IOC注入 如果这个Bean实现了BeanNameAware接口,会调用它实现的setBeanName(String beanId)方法,此处传递的是Spring配置文件中Bean的ID 如果这个Bean实现了BeanFactoryAware接口,会调用它实现的setBeanFac

    2024年02月10日
    浏览(27)
  • JVM包含哪几部分?JVM内存模型?线程的生命周期? 对Spring AOP的理解?布隆过滤器

    JVM由三部分组成:类加载子系统、执行引擎、运行时数据区。 类加载子系统:可以根据指定的全限定名来载入类或接口。 执行引擎:负责执行那些包含在被载入类的方法中的指令。 运行时数据区:当程序运行时,JVM需要内存来存储许多内容,例如:字节码、对象、参数、返

    2024年02月16日
    浏览(36)
  • 如何控制Spring工厂创建对象的次数?详解Spring对象的生命周期!

    😉😉 学习交流群: ✅✅1:这是孙哥suns给大家的福利! ✨✨2:我们 免费分享 Netty、Dubbo、k8s、Mybatis、Spring...应用和源码级别的视频资料 🥭🥭3:QQ群:583783824   📚📚  工作微信:BigTreeJava 拉你进微信群,免费领取! 🍎🍎4:本文章内容出自上述:Spring应用课程!💞💞

    2024年02月05日
    浏览(25)
  • Vue与后端交互、生命周期

    1.简介 ① Axios 是一个基于 promise 的 HTTP 库,可以用在浏览器和 node.js 中 ② axios官网:axios中文网|axios API 中文文档 | axios 2.实例 json文件:film.json(这里只是一部分,原代码太多了...) 后端:main.py 前端:index.html 计算属性是基于它们的依赖进行缓存的 计算属性只有在它的相关

    2024年01月24日
    浏览(30)
  • Android生命周期:理解与应用

    摘要:Android生命周期是开发Android应用程序时至关重要的概念。本文将介绍Android生命周期的概念、生命周期方法的执行顺序以及如何在应用程序中正确地管理生命周期。我们还将讨论生命周期对于应用程序的重要性,并提供一些实际应用中的最佳实践和注意事项。 引言(10

    2024年02月05日
    浏览(30)
  • 10分钟理解React生命周期

    学习React,生命周期很重要,我们了解完生命周期的各个组件,对写高性能组件会有很大的帮助. React  /riˈækt /   组件的生命周期指的是 组件 从 创建 到 销毁 过程中所经历的一系列方法调用。这些方法可以让我们在不同的时刻执行特定的代码,以满足组件的需求。 React 的生

    2023年04月16日
    浏览(23)
  • 理解移动语义(二)--延长变量的生命周期

    目录 代码1,无右值引用,生命周期立刻结束 代码2,有右值引用,生命周期延长到引用的生命周期结束时 以上结论只适用于纯右值,不适用将亡值 右值引用的一个作用是延长纯右值的生命周期。对比如下的代码: 结果:   可见,析构发生在i.a = 打印之前。 结果:  可见,

    2023年04月08日
    浏览(24)
  • SpringBoot + Vue前后端分离项目实战 || 三:Spring Boot后端与Vue前端连接

    系列文章: SpringBoot + Vue前后端分离项目实战 || 一:Vue前端设计 SpringBoot + Vue前后端分离项目实战 || 二:Spring Boot后端与数据库连接 SpringBoot + Vue前后端分离项目实战 || 三:Spring Boot后端与Vue前端连接 SpringBoot + Vue前后端分离项目实战 || 四:用户管理功能实现 SpringBoot + Vue前后

    2024年02月12日
    浏览(55)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包