Spring的生命周期

文章目录

  • 第一章 对象的生命周期
    • 1.1 什么是对象的生命周期
    • 1.2 为什么要学习对象的生命周期
    • 1.3 生命周期的 3 个阶段
      • 1.3.1 创建阶段
      • 1.3.2 初始化阶段
      • 1.3.3 销毁阶段
    • 1.4 总结
  • 第二章 后置处理Bean
    • 2.1 后置处理Bean的运⾏原理分析
    • 2.2 BeanPostProcessor的开发步骤


在这里插入图片描述

第一章 对象的生命周期

1.1 什么是对象的生命周期

Spring 对象的生命周期是指从对象创建到销毁的整个过程,包含了对象的实例化、初始化、使用和销毁等阶段。Spring 对象的生命周期可以分为以下几个阶段:

  1. 实例化:当Spring容器接收到创建对象的请求时,它会创建一个对象的实例。
  2. 属性设置:对象实例化后,Spring 容器会根据配置文件或注解将相关属性设置到对象中。
  3. 初始化:对象的所有依赖关系都被设置后,Spring容器会调用对象的初始化方法,如定义的init-method。
  4. 使用:对象初始化完成后,可以被使用于业务逻辑中。
  5. 销毁:当 Spring 容器不再需要此对象实例时,会自动调用对象的销毁方法,如定义的destroy-method。

在整个Spring对象的生命周期中,开发人员可以通过编写相应的初始化和销毁方法来控制对象的行为,使其更好地满足业务需求。

1.2 为什么要学习对象的生命周期

理解对象生命周期对于开发人员来说非常重要,因为它有助于开发人员更好地掌握应用程序的状态和行为。

具体来说,了解对象生命周期可以帮助开发人员:

  1. 确定何时初始化对象并设置其属性,在正确的时间点执行必要的操作。
  2. 理解Spring框架如何管理bean,并掌握使用缓存技术以提高性能。
  3. 诊断问题和调试代码。例如,当对象未按预期进行实例化或销毁时,开发人员可以通过追踪Spring容器中的对象生命周期来找到问题所在。
  4. 技术评估和优化。了解对象生命周期可以帮助开发人员优化并设计我们的应用程序,有效减少内存、CPU和磁盘I/O的使用。
  5. 避免可能出现的资源泄漏等问题。在很多情况下,如果一个对象的生命周期不被合理地管理,将会导致内存泄漏等问题。

1.3 生命周期的 3 个阶段

1.3.1 创建阶段

Spring⼯⼚何时创建对象?

  • scope="singleton"

    单例模式下,Spring ⼯⼚创建的同时,就创建对象

    注意:设置scope=singleton 时,不想在工厂创建的同时去创建,而是在获取对象的同时才创建对象加如下配置就行(懒加载)

    <bean lazy-init="true"/>
    
  • scope="prototype"

    多例模式下, Spring ⼯⼚在获取对象(java ctx.getBean("") )的时候,才创建对象


    注解的方式

    @scope =" singleton / prototype " 来控制单例/多例(默认是单例)


1.3.2 初始化阶段

Spring⼯⼚在创建完对象后,调⽤对象的初始化⽅法,完成对应的初始化操作

初始化⽅法提供程序员根据需求,提供初始化⽅法,最终完成初始化操作

初始化⽅法调⽤Spring⼯⼚进⾏调⽤

提供初始化方法有两种方式:

  • 方式1:实现 InitializingBean 接⼝,并实现如下方法

    // 程序员根据需求,实现该⽅法,完成初始化操作

在这里插入图片描述

  • 方式2:对象中提供⼀个普通的⽅法, 然后采取下面两种方式之一告知容器

    • 配置方式

      publicvoidmyInit(){
          
      }
      
      <beanid="product" class="xxx.Product" init-method="myInit"/>
      
    • 注解方式

    在这里插入图片描述

  • 细节分析

    (1)

    问题:如果⼀个对象即实现 InitializingBean 同时⼜提供的 普通的初始化⽅法顺序

    答案:实现 InitializingBean 接口方式 优先于 普通初始化⽅法

    (2)注⼊⼀定发⽣在初始化操作的前⾯

1.3.3 销毁阶段

Spring销毁对象前,会调⽤对象的销毁⽅法,完成销毁操作

销毁时机:工厂关闭的时候

销毁方法:程序员定义(有2种方式),Spring调用

方式1 :实现 DisposableBean 接口,并实现其 destroy() 方法。

public void destroy()throws Exception{
 
}

方式2:定义⼀个普通的⽅法, 然后采取下面两种方式之一告知容器

public void myDestroy()throws Exception{
}
  • 配置方式

    <bean id="" class="" init-method="" destroy-method="myDestroy"/>
    
  • 注解方式

    @PreDestroy
    public void myDestroy()throws Exception{
    }
    

细节分析

销毁⽅法的操作只适⽤于 scope="singleton"

适用场景:对于一些资源的销毁


1.4 总结

在这里插入图片描述



第二章 后置处理Bean

BeanPostProcessor 作⽤:对Spring⼯⼚所创建的对象,进⾏再加⼯。

AOP 底层有用到这个

2.1 后置处理Bean的运⾏原理分析

在这里插入图片描述

程序员实现BeanPostProcessor规定接⼝中的⽅法:

Object  postProcessBeforeInitiallization(Object bean, String beanName) {}

作⽤:Spring创建完对象,并进⾏注⼊后,可以运⾏Before⽅法进⾏加⼯

获得Spring创建好的对象 :通过⽅法的参数

最终通过返回值交给Spring框架

Object  postProcessAfterInitiallization(Object bean, String beanName) {}

作⽤:Spring执⾏完对象的初始化操作后,可以运⾏After⽅法进⾏加⼯

获得Spring创建好的对象 :通过⽅法的参数

最终通过返回值交给Spring框架

实战中:

很少处理Spring的初始化操作:没有必要区分Before After。只需要实现其中的⼀个After ⽅法即可

注意: postProcessBeforeInitiallization return bean对象

2.2 BeanPostProcessor的开发步骤

  1. 自定义类 实现 BeanPostProcessor接⼝
public class MyBeanPostProcessor implements BeanPostProcessor {
    @Override
    public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
        return bean;
    }
    @Override
    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
        Categroy categroy = (Categroy) bean;
        categroy.setName("露娜");
        return categroy;
    }
}
  1. 相关配置

    • 配置方式1:

      <bean id="myBeanPostProcessor" class="xxx.MyBeanPostProcessor"/>
      
    • 配置方式2 注解:

      在配置类中:

      @Configuration
      public class AppConfig{
          @Bean
          public MyBeanPostProcessor myBeanPostProcessor() {
              return new MyBeanPostProcessor();
          }
          
          // ... other beans
      }
      
  2. BeanPostProcessor 细节

    BeanPostProcessor 会对 Spring ⼯⼚中所有创建的对象进⾏加⼯ 。



在这里插入图片描述



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

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

相关文章

哪个牌子的电视盒子好用?2024超强电视盒子排名

最近很多朋友问我电视盒子的相关问题&#xff0c;就目前来说&#xff0c;电视盒子的地位依然是不可取代的。我近来要发布的测评内容是哪个牌子的电视盒子好用&#xff0c;耗时两周进行对比后整理了电视盒子排名&#xff0c;看看哪些电视盒子是最值得入手的吧。 NO.1——泰捷新品…

有效涨点,增强型 YOLOV8 与多尺度注意力特征融合,附代码,详细步骤

目录 摘要 结构图 原理 代码实现 添加ymal文件 实验结果 可接论文指导----------> v jiabei-545 完整代码&#xff08;失效 -----------&#x1f446; &#xff09; 执行程序流程 摘要 在本实验中&#xff0c;我们通过将双层路由注意&#xff08;BRA&#xff09;…

[云原生] 二进制安装K8S(上)搭建单机matser、etcd集群和node节点

一、单机matser预部署设计 目前Kubernetes最新版本是v1.25&#xff0c;但大部分公司一般不会使用最新版本。 目前公司使用比较多的&#xff1a;老版本是v1.15&#xff0c;因为v1.16改变了很多API接口版本&#xff0c;国内目前使用比较多的是v1.18、v1.20。 组件部署&#xff…

Stable Diffusion 绘画入门教程(webui)-ControlNet(Inpaint)

上篇文章介绍了语义分割Tile/Blur&#xff0c;这篇文章介绍下Inpaint&#xff08;重绘&#xff09; Inpaint类似于图生图的局部重绘&#xff0c;但是Inpain效果要更好一点&#xff0c;和原图融合会更加融洽&#xff0c;下面是案例&#xff0c;可以看下效果&#xff08;左侧原图…

“美元是吸血鬼”!“这资产”成为最强避风港,兑14个国家货币创下历史新高!

随着比特币站稳5万美元大关&#xff0c;比特币兑土耳其、阿根廷、埃及、巴基斯坦、尼日利亚、日本和黎巴嫩等14个国家货币已创下历史新高。在价格尚未达到峰值69000美元前&#xff0c;多国货币的贬值造就了这一盛况&#xff0c;比特币正成为强大的避风港。 这种情况突显了14个国…

解决若依的分页失效问题

解决若依的分页失效问题 我的迷茫和胆怯也一直都在&#xff0c;但我告诉自己&#xff0c;就算是万丈深渊&#xff0c;走下去&#xff0c;也是前程万里。——木心《素履之往》 首先&#xff0c;我们根据若依的文档来清楚几个问题&#xff1a; 前端采用基于bootstrap的轻量级表格…

OpenAI视频生成Sora技术简析

基本介绍 Sora是春节期间OpenAI发布的产品&#xff0c;主要是通过文字描述生成视频&#xff0c;通过大规模视频数据训练而成的生成模型&#xff0c;当前还没开放试用。官方发布的技术报告&#xff1a;https://openai.com/research/video-generation-models-as-world-simulators…

【Simulink系列】——动态系统仿真 之 混合系统

声明&#xff1a;本系列博客参考有关专业书籍&#xff0c;截图均为自己实操&#xff0c;仅供交流学习&#xff01; 一、混合系统概述 由不同类型系统共同构成的系统称为混合系统&#xff01;仿真时必须考虑连续信号和离散信号的采样匹配问题&#xff0c;一般使用变步长连续求…

Sora 提示词每日分享 | 中英文对照

每日分享一个 sora 创意视频提示词之《冲浪者在历史大厅的巨浪中展现技艺》 sora提示词视频 prompt: In an ornate, historical hall, a massive tidal wave peaks and begins to crash. Two surfers, seizing the moment, skillfully navigate the face of the wave. 提示词…

成都直播产业园进行时!发挥直播电商优势 赋能优势产业发展

在当今数字化的时代&#xff0c;直播电商已经成为一种新型的商业模式&#xff0c;为优势产业的发展带来了巨大的机遇。通过直播电商&#xff0c;优势产业能够更好地展示自身特色和优势&#xff0c;扩大渠道&#xff0c;提升品牌影响力&#xff0c;从而实现产业的升级和转型。天…

JAVA工程师面试专题-《Redis》篇

目录 一、基础 1、Redis 是什么 2、说一下你对redis的理解 3、Redis 为什么这么快&#xff1f; 4、项目中如何使用缓存&#xff1f; 5、为什么使用缓存&#xff1f; 6、Redis key 和value 可以存储最大值分别多是多少&#xff1f; 7、Redis和memcache有什么区别&#xf…

数字电路设计得力助手——《Design Compiler User Guide》

在当今数字化时代&#xff0c;电子设备和芯片的需求日益增长&#xff0c;这使得数字电路设计变得愈发重要。在数字电路设计过程中&#xff0c;使用先进的工具和技术是至关重要的。Synopsys公司的Design Compiler就是这样一款备受推崇的设计编译器软件&#xff0c;而其详尽的用户…

python(ch2)

可变长编码和不可变长编码 可变长编码是指不同字符使用不同数量的字节进行编码。例如&#xff0c;UTF-8 编码中&#xff0c;ASCII 字符使用 1 个字节编码&#xff0c;而其他语言的字符使用 2 个或更多字节编码。 不可变长编码是指所有字符都使用相同数量的字节进行编码。例如…

代码随想录01 移除元素

移除元素 1.暴力解法2.双指针法 1.暴力解法 暴力解法就是嵌套两次for循环,第一层for循环来寻找数组中的值等于val的, 第二层for循环是往前覆盖,将值等于val的删除. 2.双指针法 双指针法,分为快指针和慢指针 快指针的意义是新的数组中含有的值 慢指针的意义是新的数组中值所在的…

SAP MD81创建客户独立需求简介

正常我们用的最多的计划独立需求都是使用的是MD61 ,今天我们说下SAP的另外的一个标准功能客户独立需求MD81。虽然SAP给这个TCODE的描述是客户独立需求,但是实际是没有地方去关联对应的客户信息的。或者可以理解为是一个关联销售订单的一个计划独立需求。 1、MD81在SAP中的路…

Pyglet综合应用|推箱子游戏之关卡图片载入内存

目录 读取图片 分割图片 综合应用 本篇为之前写的博客《怎样使用Pyglet库给推箱子游戏画关卡地图》的续篇&#xff0c;内容上有相关性&#xff0c;需要阅读的请见链接&#xff1a; https://hannyang.blog.csdn.net/article/details/136209138 「推箱子」是一款风靡全球的益…

Python及Pydev调试程序传递参数方法的实践

在Python中&#xff0c;可以使用sys.argv来获取命令行参数。下面是一个示例的Python脚本&#xff0c;展示了如何通过命令行传递参数并打印输出&#xff1a; import sys# 判断是否有传入参数 if len(sys.argv) > 1:# 获取第二个参数&#xff08;索引为1&#xff09;param s…

spring面试题

文章目录 前言一、面试题1、springIOC是什么&#xff1f;2、springIOC产生的原因&#xff1a;背景3、spring 中Bean的生命周期&#xff1a;4、springAOP&#xff1a;5、Spring框架中的设计模式-太多了1、单例模式&#xff08;Singleton Pattern&#xff09;&#xff1a;2、工厂…

如何在三维地球上快速拉白模以辅助建筑规划设计?

通过以下方法可以在三维地球上快速拉白模以辅助建筑规划设计。 方法/步骤 下载三维地图浏览器 http://www.geosaas.com/download/map3dbrowser.exe&#xff0c;安装完成后桌面上出现”三维地图浏览器“图标。 2、双击桌面图标打开”三维地图浏览器“ 3、点击“要素标绘”菜…

算法打卡day3|链表篇|Leetcode 203.移除链表元素、 707.设计链表 、 206.反转链表

链表基本概念 定义 链表是一种通过指针串联在一起的线性结构&#xff0c;每一个节点由两部分组成&#xff0c;一个是数据域一个是指针域&#xff08;存放指向下一个节点的指针&#xff09;&#xff0c;最后一个节点的指针域指向null&#xff08;空指针的意思&#xff09;。其…