Spring-Bean的生命周期

news2024/9/26 1:25:07

目录

生命周期汇总

细分生命周期

1.实例化

2.属性赋值(依赖注入)

3.Aware接口

4.BeanPostProcessor接口

5.初始化

6.销毁

测试验证

        类结构

        业务类

        测试类


生命周期汇总

        Spring Bean 的生命周期见下图
        一定记忆好下图

        

细分生命周期

1.实例化

  当 Spring 容器加载配置文件时,会根据配置创建 Bean 的实例。这个阶段主要是进行对象实例的创建,使用无参构造方法或工厂方法。

2.属性赋值(依赖注入)

    Spring 容器会调用对象的 set 方法或使用注解来为 Bean 的属性进行赋值。这个阶段可以进行各种依赖关系的注入,比如通过构造函数、setter 方法、注解等方式。

3.Aware接口

用来让 Bean 对某些特定信息感知(aware)的接口,它们可以通过实现相应的 Aware 接口来获取容器的相关信息。在 Bean 初始化的过程中,进行一些自定义的操作,例如对 Bean 的名称、工厂、上下文等进行操作或者引用
对应接口有三个:

  1. BeanNameAware:获取自己在 Spring 容器中的名称,即 Bean 的 ID。通过调用 setBeanName() 方法传入 Bean 的名称。

  2. BeanFactoryAware:获取到所属的 BeanFactory,即 Spring 容器本身的引用。通过调用 setBeanFactory() 方法传入 BeanFactory 的引用。

  3. ApplicationContextAware:获取到所属的 Spring 应用上下文的引用。通过调用 setApplicationContext() 方法传入 ApplicationContext 的引用。

4.BeanPostProcessor接口

  1. postProcessBeforeInitialization(Object bean, String beanName):

    • 该方法在 Bean 的初始化之前被调用。
    • 返回值为 Object,表示修改或替换原始的 Bean 对象。
    • 可以用来实现一些预处理操作,例如属性赋值或依赖注入。
    • 应用举例:对bean中指定属性加解密,如下代码👇
  2. postProcessAfterInitialization(Object bean, String beanName):

    • 该方法在 Bean 的初始化之后被调用。
    • 返回值为 Object,表示修改或替换原始的 Bean 对象。
    • 可以用来实现一些后处理操作,例如添加额外的功能或修改 Bean 实例,常见应用场景如AOP
@Component
public class UserService implements BeanPostProcessor {

    private String password;

    // Getter and Setter for password

    @Override
    public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
        if (bean instanceof UserService) {
            UserService userService = (UserService) bean;
            // 在这里对 password 进行解密操作
            String decryptedPassword = decrypt(userService.getPassword());
            userService.setPassword(decryptedPassword);
        }
        return bean;
    }

    @Override
    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
        return bean;
    }

    private String decrypt(String encryptedPassword) {
        // 实现解密逻辑
        // ...
        return decryptedPassword;
    }
}

5.初始化

    在属性赋值完成后,Spring 容器会调用 Bean 的初始化方法(可以通过实现 InitializingBean 接口或自定义初始化方法(自定义的示例如下👇)来指定),进行一些初始化操作,比如连接数据库、加载数据等。

    @PostConstruct
    public void init() {
        System.out.println("自定义初始化方法");
    }

6.销毁

    当 Spring 容器关闭或移除 Bean 时,会调用 Bean 的销毁方法(可以通过实现 DisposableBean 接口或配置 destroy-method 方法来指定)。在这个阶段可以进行一些资源释放、清理操作,比如关闭数据库连接、释放文件句柄等。

测试验证

git地址:先跟着流程图记忆好生命周期,根据自己理解到的自己手写
SpringBean: SpringBean生命周期

如下是截图参考,根据自己喜好选择clone代码或者截图

        类结构

        业务类

        测试类

public class UserTest {
    public static void main(String[] args) {
        AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(SpringConfig.class);
        User user = ctx.getBean(User.class);
        System.out.println(user);
    }
}

        根据控制台打印即可看到Bean的生命周期执行过程 
        如果想掌握本篇,那就静下心 动起手 搞一遍

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

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

相关文章

java Graphics 图片叠放在另一张图片上,生成文字图片(可设置多图一起放到底图上)

直接上代码: public static void createGTImage(GtInfo resultObj) {String backPath resultObj.getBackPath();String enterpriseName resultObj.getEnterpriseName();String gtResultPath resultObj.getGtResultPath();int gtResultPathX resultObj.getGtResu…

具身智能:人工智能的下一个浪潮

原创 | 文 BFT机器人 特斯拉 2023 年股东会上,马斯克强调了人形机器人对特斯拉未来的重要性,并预测其将成为公司的主要长期价值来源。他进一步表示:“如果人形机器人和人的比例大致为2比1,那么人们对机器人的需求可能达到100亿乃…

用二进制来输出一个数

用二进制来输出一个数 1&#xff0c;一个数 #include <stdio.h> #include <stdlib.h> #include <stdint.h>int main() {uint32_t m 0x00C00000;printf("m%o,m%d,m0x%x\n",m,m,m);binary(m);return 0; }2&#xff0c;方法 void binary(uint32_t…

Springboot 实践(7)springboot添加html页面,实现数据库数据的访问

前文讲解&#xff0c;项目已经实现了数据库Dao数据接口&#xff0c;并通过spring security数据实现了对系统资源的保护。本文重点讲解Dao数据接口页面的实现&#xff0c;其中涉及页面导航栏、菜单栏及页面信息栏3各部分。 1、创建html页面 前文讲解中&#xff0c;资源目录已经…

应届生如何快速通过软件测试面试?

应届生&#xff0c;没有实际项目经验怎么破&#xff1f; 面试的过程并不为为了显示面试官技术有多牛&#xff0c;也不是为了体现他们公司有多么难进而是考察你的能力和招聘需求是否相匹配&#xff0c;进而评估你能否满足工作需求&#xff0c;甚至实现更多的岗位期待。 弄清楚…

【【典型电路设计之片内存储器的设计之RAM的Verilog HDL描述一】】

典型电路设计之片内存储器的设计之RAM的Verilog HDL描述一 RAM是随机存储器&#xff0c;存储单元的内容可按需随意取出或存入。这种存储器在断电后将丢失所有数据&#xff0c;一般用来存储一些短时间内使用的程序和数据。 其内部结构如下图所示&#xff1a; 例&#xff1a;用…

C语言如何实现DES加密与解密

C语言实现DES加密解密 #include "des.h" //移位表 static Table_size const shiftTable[NumberOfKeys] {1, 1, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 1}; //E扩展表 static Table_size const eTable[des_key_pc2_standard]{32, 1, 2, 3, 4, 5, 4, 5, 6, …

学校提升教学质量,这个方法很炸裂!

当今教育领域日益强调教学质量的提升和教师专业发展。为了实现这一目标&#xff0c;许多学校开始采用在线巡课系统来监控、评估和改进教学过程。 在线巡课系统作为一种创新的教学管理工具&#xff0c;不仅有助于教育管理者更好地了解教师的教学实践&#xff0c;还能够为教师提供…

如何发布自己的小程序

小程序的基础内容组件 text&#xff1a; 文本支持长按选中的效果 <text selectable>151535313511</text> rich-text: 把HTML字符串渲染为对应的UI <rich-text nodes"<h1 stylecolor:red;>123</h1>"></rich-text> 小程序的…

国标GB28181视频平台EasyGBS国标平台针对数据库删除级联数据后的无效数据进行优化的具体操作步骤

EasyGBS国标视频云服务可支持通过国标GB28181协议将设备接入&#xff0c;实现视频的实时监控直播、录像、语音对讲、云存储、告警、级联等功能&#xff0c;同时也支持将接入的视频流进行全终端、全平台分发&#xff0c;分发的视频流包括RTSP、RTMP、FLV、HLS、WebRTC等格式。同…

spring核心技术(下)--面向切面aop的特点加案例论证

目录 一.spring的aop的特点 1.1 aop的简介 1.2 举例 二.spring的aop的专业术语 三.论证模拟 3.1.前置通知 3.2.后置通知 3.3.环绕通知 3.4.异常通知 3.5.过滤通知 今天就分享到这啦&#xff01;&#xff01; 一.spring的aop的特点 Spring就是一个轻量级的控制反转(IOC)和面向…

go es实例

go es实例 1、下载第三方库 go get github.com/olivere/elastic下载过程中出现如下报错&#xff1a; 解决方案&#xff1a; 2、示例 import package mainimport ("context""encoding/json""fmt""reflect""time""…

电脑文件删除了可以找回吗?3种文件恢复办法!

在日常工作中&#xff0c;我们经常会需要处理很多的工作文件&#xff0c;但有时候会不小心误删电脑中的文件。 那么&#xff0c;电脑上面的文件被删除了可以找回吗&#xff1f;答案是肯定的&#xff01;下面就来分享三种比较好用的方法&#xff0c;一起来看下吧。 方法一&…

C++初阶——构造函数的初始化列表

前言&#xff1a;C中&#xff0c;初始化列表是构造函数中极为重要的一部分,是每个成员变量定义的地方。 目录 一.什么是初始化列表二.何时用初始化列表声明处赋值——缺省值 三.注意点 一.什么是初始化列表 初始化列表是每个成员变量定义的地方。不管我们有没有写&#xff0c;成…

带你了解—使用内网穿透,公网远程访问本地硬盘文件

文章目录 前言1. 下载cpolar和Everything软件3. 设定http服务器端口4. 进入cpolar的设置5. 生成公网连到本地内网穿透数据隧道 总结 前言 随着云概念的流行&#xff0c;不少企业采用云存储技术来保存办公文件&#xff0c;同时&#xff0c;很多个人用户也感受到云存储带来的便利…

测试右移,也就是生产环境下的QA

一、一个生产环境 Bug 的解决办法 先来跟大家分享一个生产环境下的 Bug&#xff1a; 一个在线订购葡萄酒的系统&#xff0c;订购流程相对复杂&#xff0c;下单过程中后台会有随机的失败&#xff0c;系统采取的措施是重试&#xff0c;就是说顾客下单后&#xff0c;后台如果有错…

中期国际:MT4数据挖掘与分析方法:以数据为导向,制定有效的交易策略

在金融市场中&#xff0c;制定有效的交易策略是成功交易的关键。而要制定一份可靠的交易策略&#xff0c;数据挖掘与分析方法是不可或缺的工具。本文将介绍如何以数据为导向&#xff0c;利用MT4进行数据挖掘与分析&#xff0c;从而制定有效的交易策略。 首先&#xff0c;我们需…

易服客工作室:Uncode主题 - 创意和WooCommerce WordPress主题

Uncode主题是一款像素完美的创意 WordPress 主题&#xff0c;适用于任何类型的网站&#xff08;作品集、代理机构、自由职业者、博客&#xff09;&#xff0c;也是适用于商店&#xff08;电子商务、在线商店、企业&#xff09;的顶级 WooCommerce 主题。Uncode 的设计非常注重细…

C linux struct sigaction

在linux中定义struct sigaction结构体时, 在已经包含signal.h头文件的情况下, 仍旧提示找不到这个结构体. 需要在代码中定义 _POSIX_C_SOURCE 宏&#xff0c;并将其设为大于等于 199309L 的值。这样可以确保相关的函数和结构体在编译时可用。 这将告诉编译器以符合 POSIX 标准要…

vue项目打包成exe

目标&#xff1a;vue的项目打包成为exe可执行文件 工具&#xff1a;需要使用到Electron框架 首先&#xff0c;我们了解一下什么是Electron&#xff1b; Electron 是由 GitHub 开发而成的。它是使用 JavaScript&#xff0c;HTML 和 CSS 构建跨平台的桌面应用程序的框架&#…