Spring Bean的生命周期 五步 七步 十步 循序渐进

👨‍🏫 参考视频地址

在这里插入图片描述
在这里插入图片描述

💖 五步版

  1. 实例化 bean(构造方法)
  2. 属性注入(set() 方法)
  3. 初始化方法(自定义)
  4. 使用bean
  5. 销毁方法(自定义)

💖 七步版

  1. 实例化 bean(构造方法)
  2. 属性注入(set() 方法)
  3. bean后置处理器的前置方法执行…postProcessBeforeInitialization()
  4. 初始化方法(自定义)
  5. bean后置处理器的后置方法执行…postProcessAfterInitialization()
  6. 使用bean
  7. 销毁方法(自定义)

💖 十步版

  1. 实例化 bean(构造方法)

    • AbstractAutowireCapableBeanFactory类中的createBeanInstance方法中实现
  2. 属性注入(set() 方法)

    • AbstractAutowireCapableBeanFactorypopulateBean方法中处理
  3. Aware接口

    • AbstractAutowireCapableBeanFactoryinitializeBean方法中调用
  4. bean后置处理器的前置方法执行…(postProcessBeforeInitialization()

    • AbstractAutowireCapableBeanFactoryapplyBeanPostProcessorsBeforeInitialization方法执行。
  5. InitializingBean接口afterPropertiesSet()

    • 提供一个机会,在所有Bean属性设置完成后进行初始化操作
    • AbstractAutowireCapableBeanFactoryinvokeInitMethods方法中调用。
  6. 初始化方法(自定义)

    • AbstractAutowireCapableBeanFactoryinvokeInitMethods方法中调用。
  7. bean后置处理器的后置方法执行…(postProcessAfterInitialization()

    • 注册Destruction回调:如果Bean实现了DisposableBean接口或在Bean定义中指定了自定义的销毁方法,Spring容器会为这些Bean注册一个销毁回调,确保在容器关闭时能够正确地清理资源。
    • AbstractAutowireCapableBeanFactoryapplyBeanPostProcessorsAfterInitialization方法执行
  8. 使用bean

  9. DisposableBean接口(销毁前调用方法 destroy()

    • 当容器关闭时,如果Bean实现了DisposableBean接口,destroy方法会被调用。
    • DisposableBeanAdapterdestroy方法中实现
  10. 销毁方法(自定义)

    • DisposableBeanAdapterdestroy方法中实现

整个 Bean 的创建过程都依赖于 AbstractAutowireCapatableBeanFactory 这个类,而销毁Bean主要依赖 DisposableBeanAdapter 这个类。


🌟 测试代码

在这里插入图片描述

⭐ User

import org.springframework.beans.BeansException;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.BeanFactoryAware;
import org.springframework.beans.factory.DisposableBean;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.beans.factory.config.BeanPostProcessor;/*** @author : lighting*/
public class User implements BeanFactoryAware, InitializingBean, DisposableBean {String name;public User() {System.out.println("1. 实例化 bean");}public User(String name) {this.name = name;}public void setName(String name) {System.out.println("2. 属性注入");this.name = name;}@Overridepublic void setBeanFactory(BeanFactory beanFactory) throws BeansException {System.out.println("    ③ Aware接口");}@Overridepublic void afterPropertiesSet() throws Exception {System.out.println("    ⑤ InitializingBean接口");}void myInit(){System.out.println("7. 初始化方法");}public String getName() {System.out.println("8. 使用bean");return name;}@Overridepublic void destroy() throws Exception {System.out.println("    ⑨ DisposableBean接口");}void myDestroy(){System.out.println("10. 销毁方法");}
}
class MyProcessor implements BeanPostProcessor {@Overridepublic Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {if("user".equals(beanName))System.out.println("  4) bean后置处理器的前置方法执行...");return bean;}@Overridepublic Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {if("user".equals(beanName))System.out.println("  6) bean后置处理器的后置方法执行...");return bean;}
}

⭐ spring.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:context="http://www.springframework.org/schema/context"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans-4.0.xsdhttp://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context-4.0.xsd"><bean id="user" class="com.lighting.bean.User" init-method="myInit" destroy-method="myDestroy"><property name="name" value="李白"></property></bean><bean id="processor" class="com.lighting.bean.MyProcessor"></bean>
</beans>

✨ 运行结果

在这里插入图片描述

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

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

相关文章

电子招标软件:招标提案请求(RFP)流程的步骤

招标提案请求&#xff08;RFP&#xff09; &#xff0c;可能不是评估专业能力和复杂解决方案的最佳方法&#xff0c;但仍然是产品或服务招标时的首选方法。 如果管理得当&#xff0c;招标采购过程将会是透明、客观和公正的。一份精心制作的 RFP 文件可以确定提交材料的质量、基…

linux的 /usr/sbin/nologin /sbin/nologin /bin/false /etc/nologin 的作用与区别

/usr/sbin/nologin /sbin/nologin /bin/false /etc/nologin 的作用与区别 /usr/sbin/nologin /sbin/nologin /bin/false 这三者的作用几乎一样&#xff0c;都是禁止用户登录。 /usr/sbin/nologin /sbin/nologin 是同一个文件&#xff0c;通过软连接指向。 当把用户的bash设置…

生态系统类型分布数据、土地利用数据、植被类型分布、自然保护区分布数据

引言 全国自然保护区生态系统类型分布信息产品是指基于Landsat TM数字影像&#xff08;以地形图纠正&#xff09;&#xff0c;采用全数字化人机交互遥感快速提取方法&#xff0c;建立全国自然保护区生态系统结构数据集&#xff0c;同时做成多种尺度的栅格数据&#xff0c;其中包…

JVM面试题:85道JVM虚拟机面试题及答案

面试题 1 .简述Java堆的结构&#xff1f;什么是堆中的永久代(Perm Gen space)? JVM整体结构及内存模型 试题回答参考思路&#xff1a; 1、堆结构 JVM的堆是运行时数据区&#xff0c;所有类的实例和数组都是在堆上分配内存。它在JVM启动的时候被创建。对象所占的堆内存是由自…

Spring Boot测试优化:理解并利用@SpringBootTest(webEnvironment = NONE)提升测试性能

目录 一、SpringBootTest 注解解析二、webEnvironment 参数详解三、webEnvironment NONE 的优势四、 区别总结五、应用场景总结 在进行Spring Boot项目开发时&#xff0c;集成测试是确保各层组件正确协同工作的重要手段。本文我们将深入探讨如何通过SpringBootTest(webEnviron…

美国站群服务器如何提高企业网站的负载均衡能力?

美国站群服务器如何提高企业网站的负载均衡能力? 美国站群服务器是企业提高网站负载均衡能力的重要工具之一。随着网络流量的增加和用户需求的多样化&#xff0c;如何有效地管理和分配流量成为了企业面临的挑战。通过采用美国站群服务器&#xff0c;企业可以实现流量的智能分…

排序(一)----冒泡排序,插入排序

前言 今天讲一些简单的排序,冒泡排序和插入排序,但是这两个排序时间复杂度较大,只是起到一定的学习作用,只需要了解并会使用就行,本文章是以升序为例子来介绍的 一冒泡排序 思路 冒泡排序是一种简单的排序算法&#xff0c;它重复地遍历要排序的序列&#xff0c;每次比较相邻…

RocketMQ:broker配置说明

RocketMQ broker配置项的简要说明&#xff1a;serverSelectorThreads: 服务器选择器线程数&#xff0c;用于处理网络请求。brokerRole: 指定Broker的角色&#xff0c;如ASYNC_MASTER表示异步主节点。serverSocketRcvBufSize: 服务器套接字接收缓冲区大小。osPageCacheBusyTimeO…

C++面试问题精选 0513

1、有一个类包含static成员变量,并且这个类的构造函数中包含一个死循环,可以删除 main 函数吗? 在C++中,如果你有一个类包含static成员变量,并且这个类的构造函数中包含一个死循环(即无限循环),那么这通常不是一个好的设计选择,因为这会导致任何尝试创建该类实例的操…

Dato for Mac v5.2.11激活版:掌握时间,掌控生活

在忙碌的生活中&#xff0c;您是否常常觉得时间不够用&#xff1f;Dato for Mac&#xff0c;您的时间管理专家&#xff0c;助您轻松掌控每一天。清晰的日历视图、个性化的提醒功能&#xff0c;让您的日程安排井井有条。无论是工作还是生活&#xff0c;Dato for Mac都能成为您的…

linux命令行启动一个php进程, 如何监控 ,崩溃报警通知?

在Linux环境中&#xff0c;监控PHP进程并在其崩溃时发送通知可以通过多种方式实现&#xff0c;包括使用shell脚本结合监控工具和通知服务。下面我将提供一个简单的方案&#xff0c;使用systemd服务来管理PHP进程&#xff0c;并通过邮件发送崩溃通知。 第1步&#xff1a;创建一…

IT行业的人才培养与教育

你眼中的IT行业现状与未来趋势 随着技术的不断进步&#xff0c;IT行业已成为推动全球经济和社会发展的关键力量。从云计算、大数据、人工智能到物联网、5G通信和区块链&#xff0c;这些技术正在重塑我们的生活和工作方式。你眼中IT行业的现状及未来发展趋势是怎么样的&#xf…

AI图像生成-调整

一、两张图画风不相似 2、在两张图的共同输出口新添加一个空白正面提示词板块和条件合并板块 二、预处理插件&#xff08;提取人物姿态&#xff09; 1、新建节点-》ControlNet预处理器-》面部与姿态-》Openpose姿态预处理器 2、添加上传图片板块与预览图片板块 3、提取姿态 右…

vue下载文件,获取header头文件名乱码,下载文件名有下划线的解决

后台以数据流将文件返回&#xff0c;将文件名放在header头里&#xff0c;是中文名&#xff0c;有乱码&#xff0c;如图 访问网络使用的是axios&#xff0c;在 // 响应拦截器 service.interceptors.response.use((res) > {........ if (res.config.responseType blob) {//文…

【Linux取经路】进程通信之匿名管道

文章目录 一、进程间通信介绍1.1 进程间通信是什么&#xff1f;1.2 进程间通信的目的1.3 进程通信该如何实现 二、管道2.1 匿名管道2.1.1 站在文件描述符角度深入理解管道2.1.2 接口使用2.1.3 PIPE_BUFFER 和 Pipe capacity2.1.4 管道中的四种情况2.1.5 管道特征总结 2.2 匿名管…

只用了三天就入门了Vue3?

"真的我学Vue3&#xff0c;只是为了完成JAVA课设" 环境配置 使用Vue3要去先下载Node.js。 就像用Python离不开pip包管理器一样。 Node.js — Run JavaScript Everywhere (nodejs.org) 下完Node.js去学习怎么使用npm包管理器&#xff0c;放心你只需要学一些基础的…

【MARIE】嵌入式系统设计半期报告:MARIE模拟器的使用

1.模拟器介绍 1.1 体系结构 MARIE &#xff08;Machine Architecture that is Really Intuitive and Easy&#xff09; 是一种机器架构和汇编语言。发布者还为机器提供了一组用 Java 编写的模拟器程序。MARIE.js 是 MARIE 的 JavaScript 版本实现。它旨在尽可能忠实于原始 Ja…

Spring-Cloud-OpenFeign源码解析-03-FeignClientFactoryBean

在Spring-Cloud-OpenFeign源码解析-02-OpenFeign自动装配分析到OpenFeign 接口代理对象的创建是通过构建成一个 FeignClientFactoryBean 对象&#xff0c;并最后注入到容器中的&#xff0c;那么这个FeignClientFactoryBean是如何实现代理对象创建的呢&#xff1f; FactoryBean…

基于EKF扩展卡尔曼滤波的一阶环形倒立摆控制系统simulink建模与仿真

目录 1.课题概述 2.系统仿真结果 3.核心程序与模型 4.系统原理简介 5.完整工程文件 1.课题概述 基于EKF扩展卡尔曼滤波的一阶环形倒立摆控制系统simulink建模与仿真。基于扩展卡尔曼滤波&#xff08;Extended Kalman Filter, EKF&#xff09;的一阶环形倒立摆控制系统&…

docker学习和常用命令

参考视频&#xff1a;05.Docker基础-常见命令_哔哩哔哩_bilibili 镜像仓库datahub docker命令官方文档&#xff1a;docker exec | Docker Docs systemtrl docker 启动docker systemtrl start docker停止docker systemtrl stop docker重启docker systemtrl restart docker设…