2023.11.13 Spring Bean 的生命周期

目录

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 方法进行修改
  • 上述过程,将直接引发空指针异常

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

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

相关文章

千万富翁分享:消费多少免单多少,电商运营高手实战秘籍拆解

千万富翁分享&#xff1a;消费多少免单多少&#xff0c;电商运营高手实战秘籍拆解 后疫情时代&#xff0c;国内电商圈层进程依然是在高速发展阶段&#xff0c;今年2023年双十一也彻底落下帷幕&#xff0c;但这次相较于往常却没有公布具体的成交规模数据&#xff0c;那么&#x…

程序员,你的护城河挖好了吗?

程序员的护城河 在遥远的古代&#xff0c;护城河是一种防御工事&#xff0c;通常用于保护城市或城堡免受外部攻击。它是由人工挖掘或天然形成的河流、壕沟或城墙等&#xff0c;可以作为防御屏障&#xff0c;阻止敌人的进入。 而对于程序员而言&#xff0c;“护城河”是一种比喻…

Linux线程池

文章目录&#xff1a; 线程池了解线程池模拟实现 线程池了解 线程池是一种常见的线程使用模式。线程过多会带来调度开销&#xff0c;进而影响缓存局部性和整体性能。而线程池维护着多个线程&#xff0c;等待着监督管理者分配可并发执行的任务&#xff0c;以避免在处理短时间任…

Word或者WPS批量调整文中图片大小的快捷方法

文章目录 0、前言1、编写宏代码2、在文档中调用宏实现一键批量调整3、就这么简单&#xff01; 0、前言 不知道大家是不是也和我一样&#xff0c;经常需要在编写的Word&#xff08;或者WPS&#xff09;文档里插入大量的图片&#xff0c;但是这些图片的尺寸大小一般都不一样&…

2D 3D 工业组态技术 meta2d JavaScript

本心、输入输出、结果 文章目录 2D 3D 工业组态技术 meta2d JavaScript前言2D 3D 工业组态技术 meta2d JavaScript 简介2D 3D 工业组态技术 meta2d JavaScript 特性丰富的组态能力0代码数据通信组态的应用多端适配能力强大的扩展能力追求卓越性能丰富的组件库资源广泛的应用场景…

致刘家窑中医院龚洪海医生:患者的感谢与敬意

你们好!我曾经是咱们这的一名患者&#xff0c;我叫李刚&#xff0c;今年45岁&#xff0c;不知道你们还有印象吗?我曾去过一些医院进行就诊&#xff0c;但都没有得到恰当的治疗&#xff0c;症状一直没有消失。得了这个病之后对我的生活以及工作打击都十分的大。经朋友介绍说刘家…

【Linux系统编程十七】:(基础IO4)--文件系统(inode与软硬链接)

【Linux系统编程十六】&#xff1a;文件系统&#xff08;inode与软硬链接&#xff09; 一.磁盘硬件二.文件系统(inode)三.软硬链接 一.磁盘硬件 Linux下的文件在磁盘中存储&#xff0c;文件的内容和属性是分开存储的&#xff01; 文件的内容存储在数据块。 文件的属性存储在in…

专业的软件第三方检测机构如何做性能测试?收费标准是多少?

随着软件信息技术的飞速发展&#xff0c;人们对于软件产品越来越依赖&#xff0c;从而用户对软件产品的稳定性和质量问题愈发看重。软件系统性能的好坏将严重影响该软件的质量和软件开发者的利益&#xff0c;为了更好的保障软件产品质量&#xff0c;软件企业会将性能测试交由软…

python 爬虫之urllib 库的相关模块的介绍以及应用

文章目录 urllib.request 模块打开 URL&#xff1a;发送 HTTP 请求&#xff1a;处理响应&#xff1a; 应用如何读取并显示网页内容提交网页参数使用HTTP 代理访问页面 urllib.request 模块 在 Python 中&#xff0c;urllib.request 模块是用于处理 URL 请求的标准库模块之一。…

vscode删除后重装还有原来的配置问题,彻底删除vscode,删除vscode安装过的插件和缓存

VSCode卸载后进行重新安装&#xff0c;发现新安装的还有原来的一些配置&#xff0c;卸载的不彻底&#xff0c;有时候也容易出问题&#xff0c;可按照如下方法卸载干净&#xff1a; 1.进入控制面板卸载VSCode&#xff0c;也可以在VSCode的安装目录下用程序自带的卸载程序 2.这…

灯光相机已就位!Cinerama LAND 销售活动开启序幕!

你准备好参加 The Sandbox 元宇宙中的重磅活动了吗&#xff1f;Cinerama LAND 拍卖即将来临&#xff0c;这是你踏入电影梦想世界的好机会。准备好构建你自己的沉浸式电影宇宙吧&#xff01;绝对不容错过&#xff01; 简要概括 &#x1f37f;活动开始日期&#xff1a;11 月 9 日…

如何在Jupyter Lab中安装不同的Kernel

❤️觉得内容不错的话&#xff0c;欢迎点赞收藏加关注&#x1f60a;&#x1f60a;&#x1f60a;&#xff0c;后续会继续输入更多优质内容❤️ &#x1f449;有问题欢迎大家加关注私戳或者评论&#xff08;包括但不限于NLP算法相关&#xff0c;linux学习相关&#xff0c;读研读博…

Django视图层()

视图层 django视图层&#xff1a;Django项目下的views.py文件&#xff0c;它的内部是一系列的函数或者是类,用来处理客户端的请求后处理并返回相应的数据 三板斧 HttpResponse # 返回字符串 render # 返回html页面&#xff0c;并且在返回浏览器之前还可以给html文件…

原生应用与hybrid app开发的流程区别

Hybrid App&#xff08;混合 App&#xff09;已经成为大家接触最为广泛的 App 形式&#xff0c;不管是我们用到的微信、支付宝还是淘宝、京东等大大小小的应用都非常热衷于Hybrid App 带来的研发效率提升和灵活性。 但我们正式进入到 hybrid App 的讨论前&#xff0c;有必要先…

自然语言处理(NLP)-spacy简介以及安装指南(语言库zh_core_web_sm)

spacy 简介 spacy 是 Python 自然语言处理软件包&#xff0c;可以对自然语言文本做词性分析、命名实体识别、依赖关系刻画&#xff0c;以及词嵌入向量的计算和可视化等。 1.安装 spacy 使用 “pip install spacy" 报错&#xff0c; 或者安装完 spacy&#xff0c;无法正…

springboot-error

Invalid bound statement (not found): com.example.demo.mapper.UserMapper.findAll 一直报错&#xff0c;找不到相应的mapper文件。 排除以下原因之后&#xff0c;还是不对&#xff1a; https://blog.csdn.net/xxpxxpoo8/article/details/127548543 最后发现是因为我的mapp…

【Transformer从零开始代码实现 pytoch版】(六)模型基本测试运行

模型基本测试及运行 &#xff08;1&#xff09;构建数据生成器 def data_generator(V, batch, num_batch):""" 用于随机生成copy任务的数据:param V: 随机生成数字的最大值1:param batch: 每次输送给模型更新一次参数的数据量:param num_batch: 输送多少次完成…

第四天课程 分布式搜索引擎1

分布式搜索引擎01 – elasticsearch基础 0.学习目标 1.初识elasticsearch 1.1.了解ES 1.1.1.elasticsearch的作用 elasticsearch是一款非常强大的开源搜索引擎&#xff0c;具备非常多强大功能&#xff0c;可以帮助我们从海量数据中快速找到需要的内容 例如&#xff1a; …

第十九章总结:Java绘图

19.1&#xff1a;Java绘图类 19.2&#xff1a;绘制图形 package nineteentn; import java.awt.*; import javax.swing.*;public class DrawCircle extends JFrame {private final int OVAL_WIDTH 80; // 圆形的宽private final int OVAL_HEIGHT 80; // 圆形的高public DrawC…

nginx-静态资源实践(压缩配置,常见静态资源配置)

Nginx 实战搭建一个静态资源web服务器 第一个阶段访问单个文件 listen 80; #监听的端口 server_name localhost; #服务名称 #配置路径映射 location /geotools/ {alias geotools/; #将geotools/ 和/geotools/路径一一对应起来 }目录关系如下&#xff1a; nginx下面建一个g…