Spring执行流程Bean生命周期

news2024/12/23 11:17:14

Spring执行流程

说明:这里只是说的大概流程,不是严格按照源码上一步一步说的。

简单来说,分为下边四个步骤:

  1. 启动Spring容器
  2. 实例化Bean(分配内存空间)
  3. 将Bean注册到Spring当中(存操作)
  4. 将Bean装配到需要的类中(取操作)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Ph278Fvo-1683639755057)(F:\typora插图\image-20230508202217001.png)]

实例化和初始化的区别

实例化:在堆上开辟内存,将非静态的变量和方法放到里边。

初始化:静态成员(变量、方法、代码块)会被执行,并在一块存储空间存放静态数据。

  1. 初始化只在类加载时执行一次,可多次实例化
  2. 初始化做的是执行+开内存(静态),实例是开内存(非静态)

实例化是更加靠前的。

Bean的生命周期

Bean的生命周期就是Bean对象从出生到死亡的过程。Bean的生命周期分为五大部分:

1.实例化

2.设置属性

3.Bean初始化

4.使用Bean

5.销毁Bean

1.Bean实例化

实例化本质上就是在开辟内存空间。

实例化不等于初始化,实例化是更加靠前的。

2.设置属性

设置属性本质上是在加载依赖项。

在此过程中,会完成Bean的注入和装配。

如果当前类使用的Bean还没有,任务停止,开始去做那个Bean的实例和初始化

3.初始化Bean

  1. 执行各种通知方法
  2. 执行初始化前置方法【两种实现方式:xml方式、注解方式】
  3. 执行初始化方法
  4. 初始化后置方法

其中前置方法和后置方法用的是比较少的,但是初始化方法用的是比较多的。

4.使用Bean

5.销毁Bean

步骤2和3为什么不能颠倒

因为可能在调用方法的时候可能用到依赖的对象,必须要先进行属性注入。

代码演示:

使用xml方式初始化:

【bean属性用的不是特别多】这里只做了解

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bgLrqF1c-1683639755058)(F:\typora插图\image-20230508204954964.png)]

Component类:

说明:这里多调用了几个通知类

package com.java.demo.component;

import org.springframework.beans.BeansException;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.BeanFactoryAware;
import org.springframework.beans.factory.BeanNameAware;
import org.springframework.beans.factory.config.BeanPostProcessor;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;

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

public class BeanComponent implements BeanNameAware, BeanFactoryAware, ApplicationContextAware,BeanPostProcessor {

    //通知方法
    @Override
    public void setBeanName(String s) {
        System.out.println("执行了通知BeanName->"+s);
    }
    @Override
    public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
        System.out.println("执行了通知BeansException->"+beanFactory);
    }

    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        System.out.println("执行了通知ApplicationContext applicationContext->"+applicationContext);
    }

    //xml方式的初始化方法
    public void myInit(){
        System.out.println("XML方式初始化");
    }
    //注解的初始化方法
    @PostConstruct
    public void doPostConstruct(){
        System.out.println("注解的初始化方法");
    }

    //销毁的方法
    @PreDestroy
    public void doPreDestory(){
        System.out.println("do PreDestory()");
    }
    public void sayHi(){
        System.out.println("do BeanComponent sayHi()");
    }

}

启动类:

说明:其中这里使用ClassPathXmlApplicationContext,是因为ApplicationContext没有destrory方法,没法看效果。

public class App {
    public static void main(String[] args) {
        //Application没有销毁方法
        ClassPathXmlApplicationContext context1=new ClassPathXmlApplicationContext("spring-config.xml");
        BeanComponent beanComponent=context1.getBean("beanComponent",BeanComponent.class);
        beanComponent.sayHi();
        //销毁容器(跟着,对象也销毁了)
        context1.destroy();
    }
}

打印效果:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TzxgNHei-1683639755060)(F:\typora插图\image-20230509144449698.png)]

因为现在使用注解比较多,相应的注解的优先级也更高。

初始各方法 补充

通知方法:例如BeanNameAware、BeanFactoryAware、ApplicationContextAware 的接口方法

PostConstruct 注释用于在依赖关系注入完成之后需要执行的方法上,以执行任何初始化。

前置和后置方法都是接口

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-R9v9Sfsm-1683639755062)(F:\typora插图\image-20230508222556972.png)]

Bean初始化过程

  1. 实现各种Aware通知方法,如BeanNameAware等接口的方法
  2. 执行BeanPosProcessor初始化前置方法
  3. 执行@PostConstruct初始化方法,依赖注入操作之后被执行
  4. 执行自己指定的init方法(如果在配置文件中指定了的话)
    83639755062)]

Bean初始化过程

  1. 实现各种Aware通知方法,如BeanNameAware等接口的方法
  2. 执行BeanPosProcessor初始化前置方法
  3. 执行@PostConstruct初始化方法,依赖注入操作之后被执行
  4. 执行自己指定的init方法(如果在配置文件中指定了的话)
  5. 执行BeanPostProcessor初始化后置方法

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/507371.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【常用 Linux 命令的基本使用】总结篇(附必要的 Ubuntu 截图)

本文目录 1. 常用 Linux 命令的基本使用1.1 学习 Linux 终端命令的原因1.2 常用 Linux 命令的基本使用1.3 自动补全 2. Linux 终端命令格式2.1 终端命令格式2.2 查阅命令帮助信息(了解) 3. 文件和目录常用命令3.1 查看目录内容3.1.1 终端实用技巧3.1.2 l…

shell数组

目录 一:数组定义方法 1、方法一 ​ 2、方法二 ​3、方法三 ​4、方法四 5、判断数组是否完整 (1)方法一 (2)方法二:通过脚本 二:获取数组值 1、获取数组长度 2、获取数组数据列表 3、…

本地部署 Stable Diffusion web UI

本地部署 ChatGLM-6B 0. 什么是 Stable Diffusion1. 什么是 Stable Diffusion web UI2. Github 地址3. 安装 Miniconda34. 创建虚拟环境5. 安装 Stable Diffusion web UI6. 启动 Stable Diffusion web UI7. 访问 Stable Diffusion web UI8. 其他 0. 什么是 Stable Diffusion S…

UE4 面试题整理

1、new与malloc的区别 new: new首先会去调用operator new函数,申请足够的内存(大多数底层用malloc实现),然后调用类型的构造函数来初始化变量,最后返回自定义类型的指针,delete先调用析构函数&…

IDEA配置使用Git

使用IDEA2018.2.8版本下操作 文章目录 一、安装Git1.GitHub与Git的关系2.Git的安装 二、在IDEA中配置Git三、创建远程仓库和本地仓库1.在gitee上创建远程仓库2.在IDEA上创建本地仓库 四、分支操作1.创建分支2.删除分支3.比较分支4.合并分支 一、安装Git 1.GitHub与Git的关系 …

位运算(算法)

目录 一、位运算的知识点二、位运算的应用1. x & 1一个数补码表示中的第k位数字求补码中含有1的个数偶数位与奇数位分开输出 2. x & (-x)返回x的最后一位1及之后的数字判断一个数是否是2的n次方求补码中含有1的个数 3. x & (x - 1)求补码中含有1的个数(…

Transformer模型各模块详解及代码实现

Transformer 前言1、Transformer模型整体架构2、Embeeding2.1 词向量2.1.1 独热编码2.1.2 Word Embedding2.1.3 总结 2.2 代码实现 3、Positional Encoding3.1 位置编码简介3.2 代码讲解 4、Multi-Head Attention5、Layer Norm6、Positionwise Feed Forward7、Encoder and Deco…

Qt Creator 的使用技巧

1、Qt Creator 的快捷键 在 Qt Creator 里,假若自己不知道某些功能按钮的快捷键是什么,可以将鼠标移至该按钮 上面就可以知道它的快捷键了。如下图,想知道运行的快捷键是什么,那么我们将鼠标移至 Qt Creator 的左下角的运行…

日常开发中代码技巧(个人使用)

日常开发中代码技巧 String,StringBuffer判断非空 String判断非空 参考:https://blog.csdn.net/Echo_width/article/details/79653704 首先,区分空串和null串 1 空串""是长度为0的字符串,它有自己的串长度(…

Python每日一练:小艺读书醉酒的狱卒非降序数组(详解快排)

文章目录 前言一、小艺读书二、醉酒的狱卒三、非降序数组总结 前言 今天这个非降序数组,阅读解理小学水平,说起来都是泪啊。我折腾了一天都没搞定,从冒泡写到快速排序。换了几种都还不行,我又给快排加上插入排序。结果还是不能全…

MySQL--复合查询--0422

注:为了方便查看 mysql语句会有突然的换行,书写时请勿模仿。 目录 1.单表查询回顾 显示工资最高的员工的名字和工作岗位 显示工资高于平均工资的员工信息 2.多表查询 比如需要查询雇员名字和所在部门编号及部门名字。 显示部门号为10的部门名&…

“智慧赋能 强链塑链”——精细化工行业仓储物流数字化转型探讨

精细化工行业作为衡量国家化学工业水平高低的重要标志,为国民经济提供重要的终端产品支持,相比较大化工产品,精细化工产品需要高度专业技能和工艺,其生产过程需要复杂的化学反应,以及严格的控制条件,产出的…

基于 TiDB + Flink 实现的滑动窗口实时累计指标算法

作者:李文杰 前言 在不少的支付分析场景里,大部分累计值指标可以通过 Tn 的方式计算得到 。随着行业大环境由增量市场转为存量市场,产品的运营要求更加精细化、更快速反应,这对各项数据指标的实时性要求已经越来越高。产品如果能…

UDS-19服务的状态掩码字节解析

19服务读DTC信息有01、02、04、06、0A等子服务,使用诊断仪读取DUT数据一般只需发送4字节有效数据,其他无效字节用00或者CC填充,如03 19 02 09 00 00 00 00, 数据分解: 03:表示报文类型未单帧,长…

考研计算机组成原理总结(8)

一.计算机工作过程 计算机工作的过程,即一条条指令工作的过程: 取指令: 1.(PC)—>MAR,把PC存放的指令存储地址传送给MAR3.M(MAR)—>MDR,主存根据地址取出指令存放到MDR中4.(MDR)—>IR,指令从MD…

[golang gin框架] 28.Gin 发送短信,DES加密解,Cookie加密,解密操作

一.发送短信 1.简介 在用户注册的时候,需要发送短信来校验用户以及手机号,达到用户注册的目的,一般有很多短信接口来达到发送短信的操作,比如:云片短信服务,阿里云短信服务, 腾讯云短信服务等等,这里以腾讯云短信服务来发送短信: 腾讯云短信服务相关网址: 短信介绍 发送短信AP…

【计算机视觉 | 目标检测】Grounding DINO:开集目标检测论文解读

介绍一篇较新的目标检测工作: Grounding DINO: Marrying DINO with Grounded Pre-Training for Open-Set Object Detection论文地址为: https://arxiv.org/pdf/2303.05499.pdfgithub 地址为: https://github.com/IDEA-Research/GroundingD…

flask框架之----Flask-Mail邮件

介绍: Web应用程序经常需要向用户、客户端、管理员、运维人员等相关人员发送邮件。在Flask框架中提供了Flask-Mail邮件库来管理电子邮件的收发。 安装:flask-mail: pip3 install flask-mail配置: 服务器信息: Flask-Mail &…

ESP32学习笔记 -- ESP32-S3使用NVS存储数据

什么是NVS? 非易失性存储(Non-Volatile Storage)简称NVS,是用来保存一些设备断电后不能丢失的数据,乐鑫的ESP32-S3芯片使用了一套NVS库函数对外置的SPI FLASH进行读、写、擦除等操作。 ESP-IDF通过分区表的方式,在外部SPI FLASH里面开辟一段存储空间(也称作NVS分区),…

Vue3 基础语法

文章目录 1.创建Vue项目1.1创建项目1.2 初始项目 2.vue3 语法2.1 复杂写法2.2 简易写法2.3 reactive(对象类型)2.4 ref(简单类型)2.5 computed(计算属性)2.6 watch(监听) 3.vue3 生命周期4.vue3 组件通信4.…