Bean作用域、生命周期

news2025/1/20 19:10:41

    • bean作用域
    • 如何设置行为模式
    • Bean的生命周期

bean作用域

Bean 的作用域指bean在spring框架的某种行为模式;bean的6种作用域分别是以下:
1:单例(Singleton)作用域
2:原型(Prototype)作用域
3:请求(Request)作用域
4:会话(Session)作用域:
5:全局(application)作用域
6:HTTP WebSockect 作用域

编写一个测试用例体会一下默认是什么行为模式:

先回顾spring的创建:先创建maven项目;在pom.mxl添加spring依赖;然后添加配置文件;配置扫描路径。等到spring boot就会发现还有摩托车这种好东西;正在骑着的电动车不香了;加油只需几十秒就能跑;电动车则需要充几个小时的电。
在这里插入图片描述
我们按一个标准分层编写这些代码:user是实体;在demo下创建一个enity实体层。userBeans是创建user实例对象要存入spring放在组件里(因为这是额外的东西;我的目的是想在spring有这样一个东西);userController、userController2是分别取出spring的对象进行操作;放在控制层。APP则是启动类。

1:首先有一个user类;里面有id和name属性;使用lombok写一下tostring和get、set方法。
在这里插入图片描述

2:有一个userBeans类;这个类用来把user的一个对象存到spring中;
在这里插入图片描述

3:有一个userController2类;使用注解Autowired把刚才存在spring的对象取出来;并且这里有一个方法printUser;作用是把这个取到的对象进行name属性的修改。
在这里插入图片描述

4:还有一个userController类;在上述修改完成后用Resource再把spring的user对象取出来看看是什么结果。到底有没有被3修改。
在这里插入图片描述

3和4我们要查到结果的话;没办法在main方法使用注解获取;所以我们套娃再把userController、userController2存入spring去;我们在启动类使用三板斧的方式;取出;并执行里面的方法;就可以知道它们用注解取出的user的初始化及修改情况。
0
简单来说a=b;然后我再a=c;结果是a=c;b=c。bean作用域;默认是单例模式;因为它们指向的是同一个地方。两个变量指向同一个引用。单例性能高;反复利用;不要每次用的时候就创建。但是上述的场景不适合;bean状态会被更新。

2.原型模式:prototype;每次对bean的请求都会创建一个新的实例。就比如张三找我借笔记本;我不把我自己用的那本给他;万一你把我乱涂乱画呢;我则是自己去复印店我打印一本一模一样的给他。

3:请求(Request)作用域;每次http请求就会创建新的bean实例;类似上面的prototype(一次http请求是共享bean的)
4:会话(Session)作用域:每次session会话共享一个bean;在一个http session中就定义一个bean实例
5:全局(application)作用域:一个http servlet context 中共享一个bean
这三种只能在springMVC使用;也叫SpringWeb

6:HTTP WebSockect 作用域;这个websocket长连接;http是短连接的。只适用于Spring WebSocket项目

如何设置行为模式

设置这些行为模式:设置方式有一种;但是写法有两种。在存之前(创建)设置;而不是取的时候
写法1:@Scope(“prototype”)
写法2:@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE) 这个就是为了避免大家写错搞出来的
设置后的结果:每一份取出来的都是新;第三行的之所以还是弼马温;因为java语法的赋值就是这样子;赋值后是指像同一个引用。
在这里插入图片描述

Bean的生命周期

Spring的执行流程:
Bean 执⾏流程(Spring 执⾏流程):启动 Spring 容器 -> 实例化 Bean(分配内存空间,从⽆到
有) -> Bean 注册到 Spring 中(存操作) -> 将 Bean 装配到需要的类中(取操作)。
1:当你的代码到new这一步;启动spring容器。在启动类的main方法这里
在这里插入图片描述
2:启动的时候会加载配置文件:会去看你有没有配置Bean;有没有配置扫描的路径base-package。如果你配置了就根据你的配置完成bean的初始化(加载的顺序是按你xml代码顺序加载;如果你bean又依赖另一个bean;那就先加载依赖的bean)

3:如果配置了base-package;就会扫描包下所有类有没有加5大类注解;把这些类的对象注册(存)到容器中。

4:取bean;进行对象的装配。进行一个初始化。使用@Autowired、Resource注解。

bean的生命周期:bean的诞生到销毁
实例化跟初始化区别:实例化是指根据类的定义创建类的对象或实例。通过实例化可以将类的定义转换为具体的对象,使其在内存中占据一定的空间。初始化是指在对象创建后,为其属性赋予初始值或执行其他必要的操作。

大流程分五部分:
1:实例化bean;开辟内存空间
2:设置属性(bean的注入和装配)
3:bean初始化
为什么不先初始化后设置呢?因为这个属性有可能在初始化的时候被用到;比如下面的初始化方法;我在初始化的时候调用属性的方法;如果不先设置属性;那么就空指针异常。
在这里插入图片描述
初始化做的很多事情:
3.1 :实现了各种 Aware 通知的⽅法,比如bean的名字设置成功就会有一个BeanNameAware通知的方法;还有其它BeanFactoryAware、ApplicationContextAware 的接⼝⽅法;
3.2:执行初始化的前置方法; BeanPostProcessor
3.3:执行初始化方法(设置了就执行;不设置就不执行):两种实现方式(注解:@PostConstruct ;xml方式:init-method方法)
3.4:执行后置方法
4:使用bean
5:销毁bean
在这里插入图片描述
我在想设置属性不就是初始化吗?
设置属性是初始化的一部分,但并不等同于完整的初始化过程。初始化还可能涉及其他操作,如分配内存、执行其他初始化代码等。不是啊;初始化你可以设置名字;那些各自通知的方法

代码演示:前置方法和后置方法用的比较少。
xml方式:里面很多属性;init-method就是初始化方法;destroy-methods是销毁方法。
在这里插入图片描述
实现一个BeanNameAware通知;这里的s是设置的bean的名称

在这里插入图片描述

初始化方法:得要名字一样在这里插入图片描述
在这里插入图片描述

销毁方法也是两种设置方式;xml、注解
在这里插入图片描述
使用bean的时候会自动使用这些方法;得使用 ApplicationContext子类ClassPathXmlApplicationContext去拿才能拿到;因为它的子类才有销毁方法
在这里插入图片描述

bce8477279d750d.png)

看到这里的结果会发现注解的优先级比xml高。context.destroy();这个得调用一下;销毁容器

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

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

相关文章

chatgpt赋能Python-python_chardet

Python Chardet: 自动识别文件编码的利器 Python Chardet 是一个用于自动识别文件编码的工具,它基于最新的编码库,可以自动检测多种编码类型。在今天的多语言互联网时代,我们经常需要处理各种编码类型的文件,例如:爬虫…

chatgpt赋能Python-python_calc

介绍 Python Calc 是一款基于 Python 编程语言开发的计算器应用程序。它具备简单易用、功能强大、可扩展性强等特点,广泛应用于数据科学、机器学习、人工智能等领域。 Python Calc 提供了基本算术运算、三角函数、指数函数、对数函数等常用数学运算,同…

chatgpt赋能Python-python_cancel

Python的Cancel:如何有效管理异步操作? 在编写Python应用程序时,异步编程是提高性能和响应能力的重要方式。然而,异步编程会带来一些挑战,如复杂性和不可预测的代码执行顺序。幸运的是,Python提供了一个名…

设计模式-简单Demo掌握责任链模式

文章目录 1、要点2、Demo3、进阶掌握 参考文章: 基本原理:责任链模式 | 菜鸟教程 (runoob.com) 简单例子:五分钟学设计模式.12.责任链模式_哔哩哔哩_bilibili 阿里巴巴的应用:责任链模式在复杂数据处理场景中的实战 责任链模式&am…

chatgpt赋能Python-python_6_0_

Python——一门强大的编程语言 Python是现今最流行的编程语言之一,广泛应用于Web开发、数据分析、人工智能等领域,优雅简洁的语法和强大的库使得Python成为很多开发者的首选语言。 Python的优点 易学易用 作为一门动态类型的语言,Python的…

由浅入深Dubbo核心源码剖析SpringBoot整合使用

目录 1 Dubbo与SpringBoot的整合2 公用RPC接口工程3. 服务端工程4. 消费端工程5. 工程调用验证 1 Dubbo与SpringBoot的整合 基于Zookeeper实现Dubbo与Spring Boot的集成整合,依赖导入 <properties><dubbo-version>2.7.8</dubbo-version><spring-boot.vers…

CMake初学笔记(一)

CMake初学笔记&#xff08;一&#xff09; CMake是什么CMake怎么实现跨平台CMake具体实践过程CMakeLists.txt编写快速入门常见函数例子 CMake是什么 跨平台编译工具&#xff0c;为了实现“write once, run everywhere”。 CMake怎么实现跨平台 开发者编写与平台无关的编译过…

opencv_c++学习(十八)

一、连通域分析 连通域分割原理&#xff1a; 邻域分为4邻域和8邻域。如上图所示。当使用连通域分割方法时&#xff0c;需要首先将图像进行二值化处理&#xff0c;在进行连通域的处理。右图为连通域分割两遍法的一个示意图&#xff0c;具体原理可以自行查询&#xff0c;这里只…

零基础学网络安全/web安全,一般人还真学不会

零基础学网络安全能不能学的会&#xff1f; 首先&#xff0c;肯定是可以学会的。 &#xff1f; 是不是和标题不一样&#xff1f;听我继续说 不过&#xff0c;难度会比有一些编程或者网络基础的人大一些。 网络安全需要天分努力才能成就大佬。而且&#xff0c;天分占比远比…

基于springboot+mybatis+mysql+vue学生选课管理系统

基于springbootmybatismysqlvue学生选课管理系统 一、系统介绍二、功能展示1.用户登陆2.课程列表(学生)3.选课(学生)4.查询成绩(学生)5.我的课程&#xff08;老师&#xff09;6.主页&#xff08;老师&#xff09;7.开设课程&#xff08;老师&#xff09;8.成绩管理&#xff08;…

七、jdbcTemplate

一、JdbcTemplate(概念和准备) 1.什么是JdbcTemplate Spring框架对JDBC进行封装&#xff0c;使用JdbcTemplate方便对数据库操作 2.准备工作 引入相关的jar包 在spring配置文件配置数据库连接池 <!--数据库连接池--> <bean id"dataSource" class"c…

图像处理:灰度图片线性截断拉伸

1. 为什么要拉伸 很多时候&#xff0c;灰度图片的灰度级较大&#xff0c;而像素值的分布比较集中&#xff0c;这就导致灰度级的利用率过低&#xff0c;从而导致图片的对比度很小&#xff0c;人眼的感官体验很不好&#xff0c;因此我们通常需要对原始的图像数据进行拉伸调整&…

​数据库原理及应用上机(实验六 视图的定义和维护)

✨作者&#xff1a;命运之光 ✨专栏&#xff1a;数据库原理及应用上机实验 ​ 目录 ✨一、实验目的和要求 ✨二、实验内容 ✨三、实验结果 ✨四&#xff0e;实验总结 &#x1f353;&#x1f353;前言&#xff1a; 数据库原理及应用上机实验报告的一个简单整理后期还会不断…

小白漂流记(如何自学网络安全?)

一、前言&#xff08;关于我&#xff09; 我算是“入行”不久的一个新人安全工作者&#xff0c;为什么是引号呢&#xff0c;因为我是个“半个野路子”出身。早在13年的时候&#xff0c;我在初中时期就已经在90sec、wooyun等社区一直学习、报告漏洞。后来由于升学的压力&#xf…

【Python入门篇】——Python中循环语句(for循环的嵌套应用)

作者简介&#xff1a; 辭七七&#xff0c;目前大一&#xff0c;正在学习C/C&#xff0c;Java&#xff0c;Python等 作者主页&#xff1a; 七七的个人主页 文章收录专栏&#xff1a; Python入门&#xff0c;本专栏主要内容为Python的基础语法&#xff0c;Python中的选择循环语句…

普洱突围“春茶江湖”,抖音电商「春茶普洱季」解锁好茶生意新增量

“越沉越香”&#xff0c;是普洱茶鲜明的味道符号。国内普洱茶市场热自2000年左右兴起&#xff0c;并逐渐在春茶市场上占据重要的一席之地。为顺应春茶季节打造“普洱爆品”&#xff0c;实现生意的应季增长&#xff0c;抖音电商也为品牌商家提供了更为完善的营销与经营解法。 …

极米科技发布新一代光源技术,投影行业要变天?

作者&#xff1a;坚白 2018年以来&#xff0c;在年轻人群的追捧下&#xff0c;此前主要应用于商用场景的投影仪&#xff0c;逐渐切换到家用场景&#xff0c;而且随着投影技术的持续改进&#xff0c;投影效果也不断提升&#xff0c;家用投影市场进入高速发展期。 但进入2022年…

微信小程序组件设计规范分享

WeUI是一套与微信原生视觉体验一致的基本样式库。微信官方设计团队为微信网页和微信小程序量身定制设计&#xff0c;使用户感知更加统一&#xff0c;包括button、cell、dialog、progress、toast、article、actionsheet、微信weui开发团队可以直接使用icon等各种元素。下面资源社…

基于postman测试接口(整套接口测试)(附视频教程加源码)

目录 可以解决的问题 开启控制台 单个测试尝试 使用请求结果当参数 打印结果(JSON) 自定义可视化结果 随机参数 测试用例连接 一键测试接口集合 从swagger导入接口 自定义全局变量 可以解决的问题 几百个接口人工测试接口过于繁杂大多测试无法使用请求结果当参数可以…

(转载)从0开始学matlab(第12天)—选择语句(if、switch、try/catch)

选择结构可以使 MATLAB 选择性执行指定区域内的代码 ( 称之为语句块 blocks)&#xff0c;而跳过其他区域的代码。选择结构在 MATLAB 中有三种具体的形式 :if 结构&#xff0c; switch 结构和try/catch 结构。 1 if 结构 1.1if语句的基本形式 if 结构的基本形式如下: 其…