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;
    }
    @Override
    public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
        System.out.println("    ③ Aware接口");
    }

    @Override
    public void afterPropertiesSet() throws Exception {
        System.out.println("    ⑤ InitializingBean接口");
    }

    void myInit(){
        System.out.println("7. 初始化方法");
    }

    public String getName() {
        System.out.println("8. 使用bean");
        return name;
    }
    @Override
    public void destroy() throws Exception {
        System.out.println("    ⑨ DisposableBean接口");
    }
    void myDestroy(){
        System.out.println("10. 销毁方法");
    }
}
class MyProcessor implements BeanPostProcessor {
    @Override
    public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
        if("user".equals(beanName))
            System.out.println("  4) bean后置处理器的前置方法执行...");
        return bean;
    }

    @Override
    public 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/beans
              http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
             http://www.springframework.org/schema/context
             http://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>

✨ 运行结果

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

janus源码分析(1)--代码结构整理

基础说明 janus官网 https://janus.conf.meetecho.com/index.html janus源码地址 https://github.com/meetecho/janus-gateway 编译及部署参考 https://pro-hnb.blog.csdn.net/article/details/137730389?spm1001.2014.3001.5502 https://pro-hnb.blog.csdn.net/article/deta…

Online RL + IL : TGRL: An Algorithm for Teacher Guided Reinforcement Learning

ICML 2023 Poster paper Intro 文章设定一个专家策略&#xff0c;给出两种优化目标。一个是基于专家策略正则的累计回报&#xff0c;一个是原始累计回报。通过比较二者动态的衡量专家策略对智能体在线学习的影响程度&#xff0c;进而实现在线引导过程。 Method 原始的RL目标…

MyBatis常见报错:org.apache.ibatis.binding.BindingException

哈喽&#xff0c;大家好&#xff0c;我是木头左&#xff01; 异常现象描述 当开发者在使用MyBatis进行数据库操作时&#xff0c;可能会遇到org.apache.ibatis.binding.BindingException: Parameter appId not found这样的错误提示。这个错误通常会让程序无法正常运行&#xff…

DeepSort / Sort 区别

推荐两篇博文,详细介绍了deepsort的流程及代码大致讲解: https://blog.csdn.net/qq_48764574/article/details/138816891 https://zhuanlan.zhihu.com/p/196622890 DeepSort与Sort区别: 1、Sort 算法利用卡尔曼滤波算法预测检测框在下一帧的状态,将该状态与下一帧的检测结…

TongWeb8 脚本录制功能

应用场景 在TongWeb8的命令行使用过程中&#xff0c;为简化从手册查找命令行参数的过程&#xff0c;增加了脚本录功能。录制您在控制台上所进行的操作过程&#xff0c;并可在一个新的环境回放这些操作&#xff0c;以提高业务系统的部署效率。录制的脚本文件类型包括 commandsto…

webapi路由寻址机制

路由匹配的原则 1、启动 Application_Start 文件夹中有个WebApiConfig 会把路由规则写入一个容器 2、客户端请求时&#xff1a; 请求会去容器匹配&#xff0c;先找到控制器&#xff08;找到满足的&#xff0c;就转下一步了&#xff09;&#xff0c;然后找Action&#xff0c;we…

高级DBA手把手教你达梦8国产数据库级联更新语句用MergeInto合并代替方法(达梦官方手册无此内容)

高级DBA手把手教你达梦8国产数据库级联更新语句用MergeInto合并代替方法&#xff08;达梦官方手册无此内容&#xff09; 一、传统级联更新语句例子 举例&#xff1a; 表 1&#xff1a;T1 字段名类型A时间类型B字符类型C字符类型D字符类型E字符类型 表 2&#xff1a;T2 字…

IDEA找不到database图标的解决方法

首先右边侧边栏和左边的侧边栏都看一下&#xff0c;确认没有数据库图标以后再参考下面方法。 第一步&#xff0c;打开设置&#xff0c;在插件里搜索database 第二步 安装好&#xff0c;点击确定 返回主页面&#xff0c;左边的侧边栏会出现database图标&#xff0c;点击号就可以…

C++自定义日期类的精彩之旅(详解)

在学习了C的6个默认成员函数后&#xff0c;我们现在动手实现一个完整的日期类&#xff0c;来加强对这6个默认成员函数的认识。 这是日期类中所包含的成员函数和成员变量&#xff1a; 构造函数 // 函数&#xff1a;获取某年某月的天数 inline int GetMonthDay(int yea…

2024精美UI小程序打印系统源码 PHP后端 附搭建教程+功能脑图

内容目录 一、详细介绍二、效果展示1.部分代码2.效果图展示 三、学习资料下载 一、详细介绍 后端安装说明&#xff1a; 测试环境&#xff1a;NginxPHP7.4MySQL5.6 PHP安装扩展&#xff1a;sg11 网站运行目录设置为&#xff1a;/public 网站伪静态规则设置为&#xff1a;think…

C++基础语法之数组

一、一维数组 在C中&#xff0c;一维数组是一系列具有相同数据类型的元素的集合。它们在内存中是连续存储的&#xff0c;可以通过索引访问每个元素。 一维数组的声明形式如下&#xff1a; 数据类型 数组名[常量表达式] 例如&#xff1a; // 声明一个能存储10个整数的数组 in…

33三个启动菜单的区别辨析与本质探索

三个启动菜单的区别辨析与本质探索 你是否傻傻分不清以下三种启动菜单的本质到底是什么&#xff1f; 有一个看起来非常古老生硬&#xff0c;蓝色大背景&#xff0c;字母丑陋&#xff1b; 还有一个看起来老气横秋&#xff0c;黑底白字&#xff0c;像极了远古时期的电脑报废的样…

CSS2(一):CSS选择器

文章目录 1、CSS基础1.1 CSS简介1.2 CSS编写位置1.2.1 行内样式1.2.2 内部样式1.2.3 外部样式1.2.4 样式优先级 1.2.5 CSS代码风格 2、CSS选择器2.1、基本选择器2.1.1 通配选择器2.1.2 元素选择器2.1.3 类选择器2.1.4 ID选择器2.1.5 总结 2.2、CSS复合选择器2.2.1 交集选择器2.…

TailwindCSS在vite项目中的安装与使用

一、Tailwind CSS工作原理 Tailwind CSS 的工作原理是扫描所有 HTML 文件、JavaScript 组件和任何其他类名称模板&#xff0c;生成相应的样式&#xff0c;然后将它们写入静态 CSS 文件。它快速、灵活且可靠 — 具有零运行时间。 二、安装必要依赖 Vite创建的项目默认集成了Post…

【从零开始学习Redis | 第十一篇】快速介绍Redis持久化策略

前言&#xff1a; Redis 作为一种快速、高效的内存数据库&#xff0c;被广泛应用于缓存、消息队列、会话存储等场景。然而&#xff0c;由于其特性是基于内存的&#xff0c;一旦服务器进程退出&#xff0c;内存中的数据就会丢失。为了解决这一问题&#xff0c;Redis 提供了持久…

二叉树——初解

二叉树 树树的概念树的性质 二叉树二叉树的概念二叉树的性质二叉树的实现方式数组构建左孩子右兄弟法构建指针构建 树 树的概念 在计算机科学中&#xff0c;树&#xff08;Tree&#xff09;是一种重要的非线性数据结构&#xff0c;它由若干节点&#xff08;Node&#xff09;组…

揿针在医保上叫什么?

点击文末领取揿针的视频教程跟直播讲解 创新型皮内针&#xff08;揿针&#xff09;——医保甲类产品 皮内针&#xff08;揿针&#xff09;技术属于重点推广的中医适宜技术&#xff0c;是将特制的小型针具固定于腧穴部位的皮内或皮下做较长时间留针的一种方法&#xff0c;称“…

商家利器!手机智能无人直播实时场景,轻松解决获客难、成本高难题

​​随着互联网的飞速发展&#xff0c;直播行业正在成为一种新型的商业模式。然而&#xff0c;许多商家在进行直播带货时面临着获客困难和高成本的挑战。为了解决这些问题&#xff0c;本文将介绍一种名为"自动直播"的功能&#xff0c;并详述如何利用手机实现实时场景…

2025考研专业课、英语、数学、政治视频大全,整理全了!

考研季又到了&#xff0c;备考的小伙伴们&#xff0c;你们准备好了吗&#xff1f; 时间管理 考研是一场与时间的赛跑&#xff0c;合理安排时间&#xff0c;让复习更高效&#xff01; - 制定详细的学习计划&#xff0c;每天、每周、每月都有明确目标 - ‍♂️ 保持一定的学习…

AI日报:OpenAI全能模型GPT-4o发布;阿里推自动化视频剪辑神器;AI作品会侵权吗?调研结果...;零一万物开源Yi-1.5模型

欢迎来到【AI日报】栏目!这里是你每天探索人工智能世界的指南&#xff0c;每天我们为你呈现AI领域的热点内容&#xff0c;聚焦开发者&#xff0c;助你洞悉技术趋势、了解创新AI产品应用。 新鲜AI产品点击了解&#xff1a;https://top.aibase.com/ 1、干翻所有语音助手&#x…