如何控制Spring工厂创建对象的次数?详解Spring对象的声明周期!

😉😉 学习交流群:
✅✅1:这是孙哥suns给大家的福利!
✨✨2:我们免费分享Netty、Dubbo、k8s、Mybatis、Spring...应用和源码级别的视频资料
🥭🥭3:QQ群:583783824 📚📚 工作微信:BigTreeJava 拉你进微信群,免费领取!
🍎🍎4:本文章内容出自上述:Spring应用课程!💞💞
💞💞5:以上内容,进群免费领取呦~ 💞💞💞💞
一:如何控制Spring工厂创建对象的次数
1:控制简单对象的创建次数
<!--控制这个类的创建的次数,这个参数默认是SingleTon--><bean id="account" class = "com.pactera.spring.scope.Account" scope="singleton"/>
/** @Description:测试spring只创建一个对象。* @Author: DaShu* @Date: 2021/5/31 14:31*/@Testpublic void test18(){ApplicationContext ctx = new ClassPathXmlApplicationContext("/applicationContext.xml");Account account = (Account)ctx.getBean("account");Account account1 = (Account) ctx.getBean("account");System.out.println(account == account1);//当是singleton的时候,spring只会创建一次这个对象。//当是prototype的时候,获取一次创建一次。//spring当中不写这个属性的时候,默认就是singleton。}
2:控制复杂对象的创建次数
FactoryBean接口当中的isSingleTon()重写的时候,return true即可。
实例工厂和静态工厂,还是以scope属性的方式进行控制。
3:为什么控制创建对象的次数
有些对象是可以大家公用的,可以公用的这些对象就创建一次就可以了,有些对象是不能公用的,不能公用的就一人创建一次,这样做就是节省内存的空间,节省不必要的内存浪费
4:什么样的对象只创建一次就行了
SqlSessionFactory这个mybatis工厂对象是一个重量级的对象,重量级的对象只创建一次就好了,Dao,的对象,Service只创建一次被大家公用就可以了
5:什么样的对象每次都创建新的呢
1:connection对象,设计到事务.
2:sqlSession对象,封装了连接对象。
3:Session对象。 Struct2当中Controller当中的actrion
总结:线程安全,可以公用,才只创建一次
二:对象的生命周期
1:什么是对象的生命周期
对象的生命周期指的是一个对象创建到销毁的完整的过程。
2:研究对象生命周期的意义
User user = new User();我们通过new的方式在java虚拟机当中创建了一个对象,只要有引用指向这个对象,对象就会一直存在于jvm内存当中,当虚拟机内存满了,或者整个进程结束了,那么这个对象就消亡了。
对象交由Spring进行创建和管理之后,对象的创建、存活(保存)、销毁都交由Spring进行管理,我们需要了解其中的原理,并且合理的进行利用。
3:声明周期三阶段
对象交由Spring创建之后,生命周期的三个阶段
(一):创建阶段
Spring工厂创建对象,当对象的创建是scope = singleton的时候,spring工厂创建的同时,对象也就被创建了,当对象的创建是scope = prototype的时候,spring会在获取对象的同时创建对象。获取对象就是getBean()方法执行的时候
如果scope是 singleton但是我们就想在getBean()的时候获取对象,实现一种懒加载的情况,那么我们应该怎么做?添加一个lazy-init= true属性
总结:singleton情况默认是在工厂对象创建的时候就创建了,如果这个singleton类型想要做到懒加载的话,bean标签当中添加一个属性就好了,单例默认都不是懒加载,多例默认都是懒加载,如果想改变这个规则,可以添加一个属性。
(二):初始化阶段
初始化阶段:Spring工厂创建完对象之后会调用对象的初始化方法完成对应的初始化操作。
初始化方法是谁提供:是由程序员根据需求,提供初始化方法,完成初始化操作。
初始化方法调用:Spring的工厂来调用初始化方法
初始化方法的定义:Spring为我们提供了两种定义对象初始化方法的途径,第一种是类实现InitializingBean这个接口,在这个接口当中为我们定义了一个方法,afterPropertiesSet()方法。可以把我们对象的初始化代码写到这里边,当Spring识别类实现了这个接口之后,就会调用这个方法(这个接口耦合了Spring的接口,造成了一定的侵入)。第二种方式不需要我们实现任何接口,在对象中提供一个普通的方法,这个方法 public void myInit(){} 方法名可以任意取,spring识别这个方法通过配置文件来告诉他应该调用哪个。这两种方法可以同时使用,回调会最先执行,初始化方法第二执行
<bean id = "product" class = "com.pactera.spring.life.Product" init-method ="myInit"/>
/** @Description:测试--afterPropertiesSet方法执行了 spring的初始化方法* @Author: DaShu* @Date: 2021/5/31 14:31* result:*/@Testpublic void test20(){ApplicationContext ctx = new ClassPathXmlApplicationContext("/applicationContext.xml");System.out.println("-----------------------工厂对象已经加载完毕------------------------");Product product = (Product) ctx.getBean("product");//Product.Product//afterPropertiesSet方法执行了。//myInit方法执行了。}
如果一个对象上上述两种方式都采用了,那么会怎么样?
先执行实现接口执行回调的方法,在执行普通的初始化方法。
Spring创建完对象之后会进行DI注入和初始化那么spring是先进行注入还是先进行初始化呢
Spring创建对象之后会先进行注入,注入完成之后在进行初始化。也就是先为成员边变量赋值,在进行初始化,所以,初始化方法叫做afterpropertyset,初始化方法经常用作资源的加载或者资源的初始化。
//Product.Product --构造方法创建对象//Product.setName --set方法进行注入//afterPropertiesSet方法执行了。--接口方法进行初始话//myInit方法执行了。--普通方法进行初始化。
什么叫做初始化操作?
对于数据的初始化: 数据库-- IO---网络。所谓的初始化操作大多是资源的初始化,大部分情况下都是为了系统资源的初始化,这些操作会耗费时间占用内存资源,所以我们一般在系统启动的时候进行操作。
(三):销毁阶段
什么叫做销毁阶段?
Spring销毁对象前会调用spring的销毁方法完成销毁操作
Spring什么时候销毁他所创建的对象呢
Spring 销毁他创建的对象,是在工厂关闭的时候,在工厂关闭之前也就是调用close方法的时候,spring工厂会销毁他所创建的对象
销毁方法是谁定义的
销毁方法是程序员定义的,程序员是根据需求完成销毁操作
销毁方法谁来调用呢
Spring来调用,Spring工厂来完成调用
如何定义销毁方法
定义销毁方法也有两种方式,第一种方法是实现spring的DisposableBean接口,通过实现其中方法进行销毁
另外一种就是通过标签的方式指定方法的名称。自定义一个普通的销毁方法。所谓的销毁操作就是资源释放的操作
/** @Description:测试--destroy()方法* @Author: DaShu* @Date: 2021/5/31 14:31* result:*/@Testpublic void test21(){ApplicationContext ctx = new ClassPathXmlApplicationContext("/applicationContext.xml");Product product = ctx.getBean("product", Product.class);((ClassPathXmlApplicationContext)ctx).close();//Product.Product//Product.setName//afterPropertiesSet方法执行了。//myInit方法执行了。//2021-06-02 15:11:03 DEBUG ClassPathXmlApplicationContext:987 - Closing org.springframework.context.support.ClassPathXmlApplicationContext@5e4c8041, started on Wed Jun 02 15:11:02 CST 2021//Product.destroy//Product.MyDestroy}
<!----><bean id = "product" class = "com.pactera.spring.life.Product" init-method ="myInit" destroy-method="MyDestroy"><property name="name" value="shit"/></bean>
销毁细节分析
销毁细节操作只适用于scope为singleton的作用,对于另外一种没有任何作用
什么叫做销毁操作
所谓的销毁操作值得一些资源的释放,比方说:io流的关闭,链接的关闭。这种销毁操作用的很少。

😉😉 学习交流群:
✅✅1:这是孙哥suns给大家的福利!
✨✨2:我们免费分享Netty、Dubbo、k8s、Mybatis、Spring...应用和源码级别的视频资料
🥭🥭3:QQ群:583783824 📚📚 工作微信:BigTreeJava 拉你进微信群,免费领取!
🍎🍎4:本文章内容出自上述:Spring应用课程!💞💞
💞💞5:以上内容,进群免费领取呦~ 💞💞💞💞
相关文章:
如何控制Spring工厂创建对象的次数?详解Spring对象的声明周期!
😉😉 学习交流群: ✅✅1:这是孙哥suns给大家的福利! ✨✨2:我们免费分享Netty、Dubbo、k8s、Mybatis、Spring...应用和源码级别的视频资料 🥭🥭3:QQ群:583783…...
计算机杂谈系列精讲100篇-【计算机应用】PyTorch部署及分布式训练
目录 C平台PyTorch模型部署流程 1.模型转换 1. 不支持的操作 2. 指定数据类型 2.保存序列化模型 3.C load训练好的模型 4. 执行Script Module PyTorch分布式训练 分布式并行训练概述 Pytorch分布式数据并行 手把手渐进式实战 A. 单机单卡 B. 单机多卡DP C. 多机多卡DDP D. L…...
Opencv-C++笔记 (19) : 分水岭图像分割
文章目录 一、基于距离变换与分水岭的图像分割1、图像分割2、距离和变换与分水岭距离变换常见算法有两种分水岭变换常见的算法 3、距离变换API函数接口4、watershed 分水岭函数API接口步骤 5、代码 一、基于距离变换与分水岭的图像分割 1、图像分割 图像分割(Image Segmentat…...
Linux以nohup方式运行jar包
1、在需要运行的jar包同级目录下建立启动脚本文件: 文件内容: #! /bin/bash #注意:必须有&让其后台执行,否则没有pid生成 jar包路径为绝对路径 nohup java -jar /usr/local/testDemo/jdkDemo-0.0.1-SNAPSHOT.jar >/us…...
【c++|SDL】开始使用之---demo
every blog every motto: You can do more than you think. https://blog.csdn.net/weixin_39190382?typeblog 0. 前言 SDL 记录 1. hello word #include<SDL2/SDL.h>SDL_Window* g_pWindow 0; SDL_Renderer* g_pRenderer 0;int main(int argc, char* args[]) {//…...
leetcode:有效的括号
题目描述 题目链接:20. 有效的括号 - 力扣(LeetCode) 题目分析 题目给了我们三种括号:()、{ }、[ ] 这里的匹配包括:顺序匹配和数量匹配 最优的思路就是用栈来解决: 括号依次入栈…...
使用STM32微控制器实现光电传感器的接口和数据处理
光电传感器在许多领域中被广泛应用,例如工业自动化、智能家居等。本文将介绍如何使用STM32微控制器实现光电传感器的接口和数据处理的方案,包括硬件设计、引脚配置、数据采集、滤波和阈值判断等关键步骤,并给出相应的代码示例。 一、引言 光…...
ELK企业级日志分析平台——kibana数据可视化
部署 新建虚拟机server5,部署kibana [rootelk5 ~]# rpm -ivh kibana-7.6.1-x86_64.rpm [rootelk5 ~]# cd /etc/kibana/[rootelk5 kibana]# vim kibana.ymlserver.host: "0.0.0.0"elasticsearch.hosts: ["http://192.168.56.11:9200"]i18n.local…...
Shell条件变量练习
1.算数运算命令有哪几种? (1) "(( ))"用于整数运算的常用运算符,效率很高 [rootshell scripts]# echo $((24*5**2/8)) #(( ))2452814 14 (2) "$[ ] "用于整数运算 [rootshell scripts]# echo $[24*5**2/8] #[ ]也可以运…...
【PHP】MySQL简介与MySQLi函数(含PHP与MySQL交互)
文章目录 一、MySQL简介二、MySQLi函数1. 开启mysqli扩展:2. PHP MySQLi扩展的常用函数 三、PHP与MySQL交互0. 准备1. 创建连接(mysqli_connect() )连接mysql语法 2. 选择数据库(mysqli_select_db())3. 在php中操作数据…...
vscode在Windows上安装插件提示错误xhr failed
问题描述: 在Windows下,在vscode里搜索扩展时发现无法搜索,报如下错:”Error while fetching extensions. XHR failed“。 问题定位: 在vscode界面下键入ctrlshiftp, 然后输入:Developer: T…...
SHAP(一):具有 Shapley 值的可解释 AI 简介
SHAP(一):具有 Shapley 值的可解释 AI 简介 这是用 Shapley 值解释机器学习模型的介绍。 沙普利值是合作博弈论中广泛使用的方法,具有理想的特性。 本教程旨在帮助您深入了解如何计算和解释基于 Shapley 的机器学习模型解释。 我…...
C++数据结构:图
目录 一. 图的基本概念 二. 图的存储结构 2.1 邻接矩阵 2.2 邻接表 三. 图的遍历 3.1 广度优先遍历 3.2 深度优先遍历 四. 最小生成树 4.1 最小生成树获取策略 4.2 Kruskal算法 4.3 Prim算法 五. 最短路径问题 5.1 Dijkstra算法 5.2 Bellman-Ford算法 5.3 Floyd-…...
「C++」红黑树的插入(手撕红黑树系列)
💻文章目录 📄前言红黑树概念红黑树的结构红黑树节点的定义红黑树的定义红黑树的调整 红黑树的迭代器迭代器的声明operator( )opeartor--( ) 完整代码 📓总结 📄前言 作为一名程序员相信你一定有所听闻红黑树的大名,像…...
2023年生肖在不同时间段的运势预测
随着信息技术的飞速发展,API已经成为了数据获取和交互的重要途径。很多网站和APP都在运用API来获取数据。今天我们来介绍一个十分有趣的API——《十二生肖运势预测API》,通过这个API,我们可以获取到每个生肖在不同时间段的运势预测࿰…...
ERRO报错
无法下载nginx 如下解决: 查看是否有epel 源 安装epel源 安装第三方 yum -y install epel-release.noarch NGINX端口被占用 解决: 编译安装的NGINX配置文件在/usr/local/ngin/conf 修改端口...
shiyan
import javax.xml.transform.Result; import java.util.Arrays; public class ParseText {//需要统计的字符串为private String text"Abstract-This paper presents an overview";private Result[] res;private int count;public ParseText(){resnew Result[100];cou…...
深度学习黎明时期的LeNet:揭开卷积神经网络的序幕
在深度学习的历史长河中,Yann LeCun 的 LeNet 是一个里程碑式的研究成果,它为后来的卷积神经网络(Convolutional Neural Networks,CNN)的发展奠定了基础。LeNet 的诞生标志着深度学习黎明时期的到来,为人工…...
跨越威胁的传说:揭秘Web安全的七大恶魔
🤍 前端开发工程师(主业)、技术博主(副业)、已过CET6 🍨 阿珊和她的猫_CSDN个人主页 🕠 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 🍚 蓝桥云课签约作者、已在蓝桥云…...
【SpringCloud系列】@FeignClient微服务轻舞者
💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…...
使用VSCode开发Django指南
使用VSCode开发Django指南 一、概述 Django 是一个高级 Python 框架,专为快速、安全和可扩展的 Web 开发而设计。Django 包含对 URL 路由、页面模板和数据处理的丰富支持。 本文将创建一个简单的 Django 应用,其中包含三个使用通用基本模板的页面。在此…...
椭圆曲线密码学(ECC)
一、ECC算法概述 椭圆曲线密码学(Elliptic Curve Cryptography)是基于椭圆曲线数学理论的公钥密码系统,由Neal Koblitz和Victor Miller在1985年独立提出。相比RSA,ECC在相同安全强度下密钥更短(256位ECC ≈ 3072位RSA…...
Debian系统简介
目录 Debian系统介绍 Debian版本介绍 Debian软件源介绍 软件包管理工具dpkg dpkg核心指令详解 安装软件包 卸载软件包 查询软件包状态 验证软件包完整性 手动处理依赖关系 dpkg vs apt Debian系统介绍 Debian 和 Ubuntu 都是基于 Debian内核 的 Linux 发行版ÿ…...
基于uniapp+WebSocket实现聊天对话、消息监听、消息推送、聊天室等功能,多端兼容
基于 UniApp + WebSocket实现多端兼容的实时通讯系统,涵盖WebSocket连接建立、消息收发机制、多端兼容性配置、消息实时监听等功能,适配微信小程序、H5、Android、iOS等终端 目录 技术选型分析WebSocket协议优势UniApp跨平台特性WebSocket 基础实现连接管理消息收发连接…...
dedecms 织梦自定义表单留言增加ajax验证码功能
增加ajax功能模块,用户不点击提交按钮,只要输入框失去焦点,就会提前提示验证码是否正确。 一,模板上增加验证码 <input name"vdcode"id"vdcode" placeholder"请输入验证码" type"text&quo…...
【ROS】Nav2源码之nav2_behavior_tree-行为树节点列表
1、行为树节点分类 在 Nav2(Navigation2)的行为树框架中,行为树节点插件按照功能分为 Action(动作节点)、Condition(条件节点)、Control(控制节点) 和 Decorator(装饰节点) 四类。 1.1 动作节点 Action 执行具体的机器人操作或任务,直接与硬件、传感器或外部系统…...
【2025年】解决Burpsuite抓不到https包的问题
环境:windows11 burpsuite:2025.5 在抓取https网站时,burpsuite抓取不到https数据包,只显示: 解决该问题只需如下三个步骤: 1、浏览器中访问 http://burp 2、下载 CA certificate 证书 3、在设置--隐私与安全--…...
Python爬虫(一):爬虫伪装
一、网站防爬机制概述 在当今互联网环境中,具有一定规模或盈利性质的网站几乎都实施了各种防爬措施。这些措施主要分为两大类: 身份验证机制:直接将未经授权的爬虫阻挡在外反爬技术体系:通过各种技术手段增加爬虫获取数据的难度…...
DBAPI如何优雅的获取单条数据
API如何优雅的获取单条数据 案例一 对于查询类API,查询的是单条数据,比如根据主键ID查询用户信息,sql如下: select id, name, age from user where id #{id}API默认返回的数据格式是多条的,如下: {&qu…...
OPenCV CUDA模块图像处理-----对图像执行 均值漂移滤波(Mean Shift Filtering)函数meanShiftFiltering()
操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 在 GPU 上对图像执行 均值漂移滤波(Mean Shift Filtering),用于图像分割或平滑处理。 该函数将输入图像中的…...
