2023.11.13 Spring Bean 的生命周期

news2024/11/25 23:14:39

目录

Spring 执行流程

Bean 的生命周期 

五个阶段

深入理解 Bean 初始化

实例理解 

总结梳理

经典面试题 


Spring 执行流程

Bean 的生命周期 

  • Spring 中 Bean 的生命周就是 Bean 在 Spring 中从创建到销毁的整个过程


五个阶段

1. 实例化 Bean

  • 为 Bean 对象分配内存空间

2. 设置属性

  • Spring 通过反射机制给 Bean 的属性赋值

3. Bean 初始化

  • 各种通知
  • 初始化前置方法
  • 初始化方法
  • 初始化后置方法

4. 使用 Bean

5. 销毁 Bean


深入理解 Bean 初始化

各种通知接口方法

  • BeanNameAware:允许 Bean 获取自己在容器中的名称
  • BeanFactoryAware:允许 Bean 获取对 Beanfactory的引用
  • ApplicationContextAware:允许 Bean 获取对 ApplicationContext 的引用

初始化前置方法

  • 该方法可以用于执行一些预处理操作,例如 设置一些默认属性或检查依赖关系

初始化方法

  • 如果使用注解方式,可以使用 @PostConstruct 注解来标记初始化方法
  • 如果使用 XML 配置方式,可以在 <bean> 标签中使用 init-method 属性来指定初始化方法的名称

初始化后置方法

  • 该方法可以用于执行一些后续操作,例如资源清理、启动定时任务等

注意:

  • 实例化和初始化是两个完全不同的过程
  • 实例化只是给Bean对象分配内存空间
  • 初始化则是将程序执行权从系统级别转到用户级别,执行用户添加的业务代码

实例理解 

  • 创建一个 BeanComponent 类

  • 在 Spring-config.xml 中使用 <bean> 标签将 BeanComponent 类的 Bean 对象注入到Spring 容器中

  •  BeanComponent 类设置 BeanNameAware 通知、两种初始化方法、销毁时执行的方法
  • sayHi 方法的创建是为了 使用 Bean 对象
import org.springframework.beans.factory.BeanNameAware;
import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;

public class BeanComponent implements BeanNameAware {
    @Override
    public void setBeanName(String s) {
        System.out.println( "BeanName ——> " + s + " 执行了通知");
    }

    /*
    * xml 方式的初始化方法
    * */
    public void myInit() {
        System.out.println("XML 方式的初始化方法");
    }

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

    public void sayHi() {
        System.out.println("执行 sayHi 方法");
    }
    
    /*
    * 销毁时执行的方法
    * 此处使用注解的方式
    * */
    @PreDestroy
    public void doPreDestroy() {
        System.out.println("销毁时的方法 已执行");
    }
}

注意:

  • 在启动类中获取 BeanComponent 类的 Bean 对象,并调用其 sayHi 方法,最后销毁容器
import com.java.demo.component.BeanComponent;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class App {
    public static void main(String[] args) {
//        因为 ApplicationContext 中没有销毁方法,所以此处使用 ClassPathXmlApplicationContext
        ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("Spring-config.xml");
        BeanComponent beanComponent = context.getBean("beanComponent",BeanComponent.class);
//        调用 sayHi 方法,即使用该 Bean 对象
        beanComponent.sayHi();
//        将容器销毁
        context.destroy();
    }
}

运行结果:

  • 我们发现该执行结果,正好与我们的预期相符合

总结梳理

  • Spring 执行流程和 Bean 的生命周期 结合理解

  • 加载配置文件:Spring 容器会先加载配置文件,例如 XML 文件或注解配置,以获取Bean 的定义和相关的配置信息
  • 创建容器:根据配置文件中的定义,Spring 容器会创建一个应用上下文,也就是容器对象,用于管理 Bean 的生命周期
  • 实例化 Bean:Spring 容器根据配置文件中的定义,实例化 Bean 对象,这是通过调用Bean 的构造函数来完成的
  • 设置 Bean 属性:一旦 Bean 实例化完成,Spring 容器会通过调用 Bean 的 setter 方法或直接访问其字段,将文件中定义的属性值注入到 Bean 中
  • 调用 Bean 的初始化方法:如果 Bean 实现了 InitializingBean 接口,Spring 容器会在属性注入完成后调用其定义的初始化方法。同时如果在配置文件中指定了自定义的初始化方法。Spring 容器也会调用该方法
  • 使用 Bean:在 Bean 的初始化完成后,Spring 容器会将其放入容器中,供其他 Bean 或应用程序使用
  • 调用 Bean 的销毁方法:当 Spring 容器关闭时,它会销毁之前先释放的 Bean 资源,如果 Bean 实现了 DisposableBean 接口,容器会在销毁前调用其定义的销毁方法。同时,如果在配置文件中指定了自定义的销毁方法,Spring 容器也会调用该方法

经典面试题 

是否可以先 执行初始化 再 执行设置属性 ?

  • 不可以
  • 因为初始化方法中可能会用到设置后的属性

实例理解

@Controller
public class StudentController {
 
    //属性注入
    @Autowired
    private Student student;
 
    //初始化
    @PostConstruct
    public void init() {
        student.setName("xiaolin");
    }
 
}
  • 如果此时先执行了初始化 init 方法
  • init 方法中需要使用属性注入后得到的 student 对象
  • 此时该 student 对象还未被 Spring 容器注入便被 init 方法进行修改
  • 上述过程,将直接引发空指针异常

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

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

相关文章

如何在Photoshop 中创建橡皮图章效果

如何在 Photoshop 中制作橡皮图章。只需几个快速步骤即可将任何照片变成橡皮图章图像 1. 如何创建垃圾纸背景 步骤1 让我们开始学习如何制作自定义印章。创建一个新的850 x 550 像素 文档。当然&#xff0c;您可以为 PSD 文件使用其他尺寸&#xff0c; 但必须按比例调整本教程…

合肥中科深谷嵌入式项目实战——基于ARM语音识别的智能家居系统(二)

目录 基于ARM语音识别的智能家居系统 练习一 一、程序编译 练习二&#xff1a; 二、文件IO 三、文件IO常用API接口函数 1、打开文件 open&#xff08;&#xff09; 2、将数据内容写入文件 write&#xff08;&#xff09; 3、关闭&#xff08;保存&#xff09;文件 四、…

spring-cloud 简介

springcloud 定义 1.定义&#xff1a;springcloud为开发人员提供了在分布式系统中快速构建一些通用模式的工具&#xff08;例如配置管理、服务发现、断路器、路由、控制总线等&#xff09;2.微服务:基于单体应用&#xff0c;基于业务进行拆分&#xff0c;每个服务都是独立应用…

应用层——HTTPS协议

文章目录 一.HTTPS协议介绍二.关于加密1.什么是"加密"2.为什么要加密3.常见的加密方式4.数据摘要 && 数据指纹 三.HTTPS的工作过程探究1.方案1 —— 只使用对称加密&#xff08;明文传输不可取&#xff09;2.方案2 —— 只使用非对称加密&#xff08;仅单向安…

图文示例:Python程序的运行原理解读

文章目录 一、编译型语言&#xff08;C语言为例&#xff09;二、动态型语言三、程序是如何运行起来的&#xff1f;四、分析五、dir 函数六、def 指令七、pyc文件1.pyc文件三大作用 八、import 指令总结关于Python技术储备一、Python所有方向的学习路线二、Python基础学习视频三…

zabbix中图形可视化页面中文乱码解决

在window 电脑中的 C:\Windows\Fonts 里面是字体文件&#xff0c;里面有一个 SIMKAI.TTF &#xff08;有的是小写&#xff09; 这个是楷体 将该文件复制到虚拟机中 怎么导入应该不需要我说吧 查看zabbix的字体文件在哪个目录下 [rootlocalhost /]# find / -name fonts /boo…

【Android】画面卡顿优化列表流畅度五之下拉刷新上拉加载更多组件RefreshLayout修改

之前也写过类似组件的介绍&#xff1a; 地址&#xff1a;下拉刷新&上拉加载更多组件SmartRefreshLayout 本来打算用这个替换的&#xff0c;但在进行仔细研究发现不太合适。功能都很好&#xff0c;但嵌入不了当前的工程体系里。原因就是那啥体制懂的都懂。这样的组件需要改…

力扣 225. 用队列实现栈(C语言实现)

目录 1.解题思路2.代码实现 1.解题思路 这道题如果使用C会好写的多&#xff0c;因为可以使用C提供的队列来实现&#xff0c;但如果使用C语言则必须手写一个队列来实现&#xff0c;在这里我用了我前面文章中实现好的队列来解答&#xff0c;首先因为队列是先进先出&#xff0c;而…

揭秘视频号创作者分成计划,带你玩赚视频号流量主,保姆级教程

项目介绍 今天给大家分享一个视频号流量主的一个项目&#xff0c;也就是视频号创作者广告分成计划。这个项目在目前来说是一个蓝海赛道&#xff0c;做的人是比较少&#xff0c;作为副业来说还是非常适合个人来做的。如果大家有工作室的话&#xff0c;也可以进行批量操作&#…

2021年06月 Scratch(一级)真题解析#中国电子学会#全国青少年软件编程等级考试

一、单选题(共25题,每题2分,共50分) 第1题 小猫位置在舞台中心,点击一次小猫后能前进10步的程序为? A: B: C: D: 答案:B 第2题 快速切换到下一个背景图片应该使用哪个积木? A: B:

MySQL库的操作『增删改查 ‖ 编码问题 ‖ 备份与恢复』

✨个人主页&#xff1a; 北 海 &#x1f389;所属专栏&#xff1a; MySQL 学习 &#x1f383;操作环境&#xff1a; CentOS 7.6 阿里云远程服务器 &#x1f381;软件版本&#xff1a; MySQL 5.7.44 文章目录 1.创建数据库2.数据库中的编码问题2.1.字符集与校验集2.3.支持的字符…

环保气膜建筑的运维成本在哪几个方面

作为一种环保建筑&#xff0c;气膜结构在工业和文体领域得到了广泛认可。尽管气膜建筑在经济上具有明显的优势&#xff0c;但对于不了解它的人来说&#xff0c;他们可能会下意识地认为在运营和维护过程中会产生大量费用。今天&#xff0c;让我们一起了解一下气膜建筑在运营维护…

【蓝桥杯选拔赛真题68】Scratch打地鼠游戏 少儿编程scratch图形化编程 蓝桥杯创意编程选拔赛真题解析

目录 scratch打地鼠游戏 一、题目要求 编程实现 二、案例分析 1、角色分析

未来之路:大模型技术在自动驾驶的应用与影响

本文深入分析了大模型技术在自动驾驶领域的应用和影响&#xff0c;万字长文&#xff0c;慢慢观看~ 文中首先概述了大模型技术的发展历程&#xff0c;自动驾驶模型的迭代路径&#xff0c;以及大模型在自动驾驶行业中的作用。接着&#xff0c;详细介绍了大模型的基本定义、基础功…

【论文阅读】(CTGAN)Modeling Tabular data using Conditional GAN

论文地址&#xff1a;[1907.00503] Modeling Tabular data using Conditional GAN (arxiv.org) 摘要 对表格数据中行的概率分布进行建模并生成真实的合成数据是一项非常重要的任务&#xff0c;有着许多挑战。本文设计了CTGAN&#xff0c;使用条件生成器解决挑战。为了帮助进行公…

数据同步到Redis消息队列,并实现消息发布/订阅

一、假设需求&#xff1a; 某系统在MySQL某表中操作了一条数据在其他系统中&#xff0c;实时获取最新被操作数据的数据库名、数据表名、操作类型、数据内容 应用场景&#xff1a; 按最近项目的一个需求来说&#xff1a; 1.当某子系统向报警表中新增了一条报警数据&#xff1b;…

外包能做多久?这才是掩藏在虚假繁荣后的真实

讲一下我的故事和想法&#xff0c;你们自己寻思一下 我25岁&#xff0c;中级测试&#xff0c;外包&#xff0c;薪资13.5k&#xff0c;人在上海。 内卷什么的就不说了&#xff0c;而且人在外包那些高级精英年薪大几十的咱也接触不到&#xff0c;就说说外包吧。 假设以我为界限…

2023年亚太杯数学建模思路 - 案例:ID3-决策树分类算法

文章目录 0 赛题思路1 算法介绍2 FP树表示法3 构建FP树4 实现代码 建模资料 0 赛题思路 &#xff08;赛题出来以后第一时间在CSDN分享&#xff09; https://blog.csdn.net/dc_sinor?typeblog 1 算法介绍 FP-Tree算法全称是FrequentPattern Tree算法&#xff0c;就是频繁模…

GB28181/GB35114国标平台LiveGBS适配国产信创环境,使用国产数据库达梦数据库、高斯数据库、瀚高数据库的配置方法...

1、如何配置切换信创达梦数据库&#xff1f; livecms.ini -> [db]下面添加配置如&#xff1a; ... [db] dialectdm url dm://SYSDBA:Aa12345678localhost:5236/livegbs 2、如何配置切换高斯数据库&#xff1f; livecms.ini -> [db]下面添加配置如&#xff1a; ... [db] d…

【论文阅读】CTAB-GAN: Effective Table Data Synthesizing

论文地址&#xff1a;[2102.08369] CTAB-GAN: Effective Table Data Synthesizing (arxiv.org) 介绍 虽然数据共享对于知识发展至关重要&#xff0c;但遗憾的是&#xff0c;隐私问题和严格的监管&#xff08;例如欧洲通用数据保护条例 GDPR&#xff09;限制了其充分发挥作用。…