当前位置: 首页 > news >正文

如何控制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对象的声明周期!

&#x1f609;&#x1f609; 学习交流群&#xff1a; ✅✅1&#xff1a;这是孙哥suns给大家的福利&#xff01; ✨✨2&#xff1a;我们免费分享Netty、Dubbo、k8s、Mybatis、Spring...应用和源码级别的视频资料 &#x1f96d;&#x1f96d;3&#xff1a;QQ群&#xff1a;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包同级目录下建立启动脚本文件&#xff1a; 文件内容&#xff1a; #! /bin/bash #注意&#xff1a;必须有&让其后台执行&#xff0c;否则没有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:有效的括号

题目描述 题目链接&#xff1a;20. 有效的括号 - 力扣&#xff08;LeetCode&#xff09; 题目分析 题目给了我们三种括号&#xff1a;&#xff08;&#xff09;、{ }、[ ] 这里的匹配包括&#xff1a;顺序匹配和数量匹配 最优的思路就是用栈来解决&#xff1a; 括号依次入栈…...

使用STM32微控制器实现光电传感器的接口和数据处理

光电传感器在许多领域中被广泛应用&#xff0c;例如工业自动化、智能家居等。本文将介绍如何使用STM32微控制器实现光电传感器的接口和数据处理的方案&#xff0c;包括硬件设计、引脚配置、数据采集、滤波和阈值判断等关键步骤&#xff0c;并给出相应的代码示例。 一、引言 光…...

ELK企业级日志分析平台——kibana数据可视化

部署 新建虚拟机server5&#xff0c;部署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.算数运算命令有哪几种&#xff1f; (1) "(( ))"用于整数运算的常用运算符&#xff0c;效率很高 [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扩展&#xff1a;2. PHP MySQLi扩展的常用函数 三、PHP与MySQL交互0. 准备1. 创建连接&#xff08;mysqli_connect() &#xff09;连接mysql语法 2. 选择数据库&#xff08;mysqli_select_db()&#xff09;3. 在php中操作数据…...

vscode在Windows上安装插件提示错误xhr failed

问题描述&#xff1a; 在Windows下&#xff0c;在vscode里搜索扩展时发现无法搜索&#xff0c;报如下错&#xff1a;”Error while fetching extensions. XHR failed“。 问题定位&#xff1a; 在vscode界面下键入ctrlshiftp&#xff0c; 然后输入&#xff1a;Developer: T…...

SHAP(一):具有 Shapley 值的可解释 AI 简介

SHAP&#xff08;一&#xff09;&#xff1a;具有 Shapley 值的可解释 AI 简介 这是用 Shapley 值解释机器学习模型的介绍。 沙普利值是合作博弈论中广泛使用的方法&#xff0c;具有理想的特性。 本教程旨在帮助您深入了解如何计算和解释基于 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++」红黑树的插入(手撕红黑树系列)

&#x1f4bb;文章目录 &#x1f4c4;前言红黑树概念红黑树的结构红黑树节点的定义红黑树的定义红黑树的调整 红黑树的迭代器迭代器的声明operator( )opeartor--( ) 完整代码 &#x1f4d3;总结 &#x1f4c4;前言 作为一名程序员相信你一定有所听闻红黑树的大名&#xff0c;像…...

2023年生肖在不同时间段的运势预测

随着信息技术的飞速发展&#xff0c;API已经成为了数据获取和交互的重要途径。很多网站和APP都在运用API来获取数据。今天我们来介绍一个十分有趣的API——《十二生肖运势预测API》&#xff0c;通过这个API&#xff0c;我们可以获取到每个生肖在不同时间段的运势预测&#xff0…...

ERRO报错

无法下载nginx 如下解决&#xff1a; 查看是否有epel 源 安装epel源 安装第三方 yum -y install epel-release.noarch NGINX端口被占用 解决&#xff1a; 编译安装的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:揭开卷积神经网络的序幕

在深度学习的历史长河中&#xff0c;Yann LeCun 的 LeNet 是一个里程碑式的研究成果&#xff0c;它为后来的卷积神经网络&#xff08;Convolutional Neural Networks&#xff0c;CNN&#xff09;的发展奠定了基础。LeNet 的诞生标志着深度学习黎明时期的到来&#xff0c;为人工…...

跨越威胁的传说:揭秘Web安全的七大恶魔

&#x1f90d; 前端开发工程师&#xff08;主业&#xff09;、技术博主&#xff08;副业&#xff09;、已过CET6 &#x1f368; 阿珊和她的猫_CSDN个人主页 &#x1f560; 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 &#x1f35a; 蓝桥云课签约作者、已在蓝桥云…...

【SpringCloud系列】@FeignClient微服务轻舞者

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…...

PPIO上线GLM-5.1:面向8小时级长程任务的开源SOTA模型

今天&#xff0c;PPIO 上线 GLM-5.1。GLM-5.1 是智谱新一代的旗舰级智能体工程模型&#xff0c;其编码能力比上一代产品显著增强。GLM-5.1 在 SWE-Bench Pro 测试中取得了最先进的性能&#xff0c;并在 NL2Repo&#xff08;代码库生成&#xff09;和 Terminal-Bench 2.0&#x…...

AI的影响5

AI帮我选了午餐、回了邮件、定了行程——那我还剩什么&#xff1f;前两天&#xff0c;我发现自己陷入了一种奇怪的状态。早晨&#xff0c;AI帮我排好了今天的优先级。中午&#xff0c;AI根据冰箱存货推荐了午餐。下午&#xff0c;AI替我润色了工作消息。晚上&#xff0c;AI还帮…...

Pixel Mind Decoder 面试题库构建:基于情绪分析筛选候选人回答

Pixel Mind Decoder面试题库构建&#xff1a;基于情绪分析筛选候选人回答 1. 招聘场景中的情绪分析价值 在传统招聘流程中&#xff0c;HR面对海量候选人回答时往往面临两大挑战&#xff1a;主观判断偏差和效率瓶颈。一个候选人回答"我曾在高压环境下完成项目"时&am…...

Nunchaku FLUX.1 CustomV3批量处理技巧:高效生成1000+图像的方法

Nunchaku FLUX.1 CustomV3批量处理技巧&#xff1a;高效生成1000图像的方法 1. 引言 如果你正在使用Nunchaku FLUX.1 CustomV3生成图像&#xff0c;可能会遇到这样的困扰&#xff1a;每次只能生成几张图片&#xff0c;想要大批量产出内容时&#xff0c;需要反复手动操作&…...

Phi-4-mini-reasoning Chainlit插件开发:集成Copilot式代码补全与执行沙箱

Phi-4-mini-reasoning Chainlit插件开发&#xff1a;集成Copilot式代码补全与执行沙箱 1. 项目概述 Phi-4-mini-reasoning是一个基于合成数据构建的轻量级开源模型&#xff0c;专注于高质量、密集推理的数据处理。作为Phi-4模型家族的一员&#xff0c;它特别强化了数学推理能…...

避坑指南:Windows/Linux下Java串口通信库RXTX与jSerialComm选型及配置详解

Java串口通信库选型实战&#xff1a;RXTX与jSerialComm的工业级应用对比 工业自动化领域对串口通信的需求从未减弱&#xff0c;尤其在RS485设备控制、传感器数据采集等场景中。作为Java开发者&#xff0c;面对RXTX和jSerialComm这两个主流选择时&#xff0c;如何根据项目特点做…...

HunyuanVideo-Foley问题解决:常见部署错误与解决方案汇总

HunyuanVideo-Foley问题解决&#xff1a;常见部署错误与解决方案汇总 1. 镜像简介与环境准备 HunyuanVideo-Foley是由腾讯混元团队开发的开源视频音效生成模型&#xff0c;能够智能分析视频内容并自动匹配电影级音效。本镜像封装了完整的运行环境&#xff0c;支持一键部署使用…...

单细胞UMAP图配色进阶:手把手教你用RColorBrewer和ggsci打造高级感图表

单细胞UMAP图配色进阶&#xff1a;手把手教你用RColorBrewer和ggsci打造高级感图表 在科研数据可视化领域&#xff0c;一张精心设计的图表往往能成为论文的点睛之笔。单细胞RNA测序分析中&#xff0c;UMAP图作为展示细胞异质性的核心工具&#xff0c;其配色方案直接影响着数据的…...

2025身份证前六位地区代码解析:如何快速查询与使用指南

1. 身份证前六位地区代码的奥秘 每次看到身份证号码前六位数字&#xff0c;你有没有好奇过它们代表什么&#xff1f;这串看似简单的数字其实是行政区划代码&#xff0c;相当于每个地区的"身份证号"。我刚开始研究这个时也一头雾水&#xff0c;直到发现它背后藏着完整…...

D3KeyHelper终极指南:暗黑3技能自动化与辅助功能完全解析

D3KeyHelper终极指南&#xff1a;暗黑3技能自动化与辅助功能完全解析 【免费下载链接】D3keyHelper D3KeyHelper是一个有图形界面&#xff0c;可自定义配置的暗黑3鼠标宏工具。 项目地址: https://gitcode.com/gh_mirrors/d3/D3keyHelper D3KeyHelper是一款专为《暗黑破…...