Bean作用域、生命周期

news/2025/1/11 3:00:08/

    • 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.ppmy.cn/news/87449.html

相关文章

安信可(云知声蜂鸟US516P6)SDK开发学习---freertos os接口函数封装管理

安信可(云知声蜂鸟US516P6)SDK开发学习—freertos os接口函数封装管理 线程,互斥锁,、延时函数,任务优先级定义,线程栈定义 #define uni_usleep(us) vTaskDelay(((us)/1001 1) / por…

B站动态自检方法1 bilibili应用自检

文章目录 相关地址注意事项主要流程假设你的 IP:192.188.0.100端口必须设置:8899一、电脑设置代理1、查看IP2、电脑设置代理 二、手机配置代理三、安装证书四、启动动态自检方式11、点击开启动态检测2、按测试流程进行测试:3、完成自测后,点击…

vue3选项式API

私人博客 许小墨のBlog —— 菜鸡博客直通车 系列文章完整版,配图更多,CSDN博文图片需要手动上传,因此文章配图较少,看不懂的可以去菜鸡博客参考一下配图! 系列文章目录 前端系列文章——传送门 后端系列文章——传送…

ChatGPT 4.0大升级,能替代留学中介吗?

ChatGPT4.0发布了! 在之前轰动世界版本的基础上又有了大幅度升级,根据官方介绍,它的输入可以是文字(上限2.5万字)还可以是图像,是一个超大的多模态模型。 越来越多的人开始好奇这个东西到底能用来做什么&…

MyBatis-Plus 可视化代码生成器来啦,生产力直接拉满

在基于Mybatis的开发模式中,很多开发者还会选择Mybatis-Plus来辅助功能开发,以此提高开发的效率。虽然Mybatis也有代码生成的工具,但Mybatis-Plus由于在Mybatis基础上做了一些调整,因此,常规的生成工具生成的代码还有一…

C++设计模式学习(二)

模板方法 GOF-23模式分类 从目的来看: 创建型(Creational)模式:将对象的部分创建工作延迟到子类或者其他对象,从而应对需求变化为对象创建时具体类型实现引来的冲击。结构型(Structural)模式:通过类继承或者对象组合获得更灵活的结构,从而应对需求变化为对象的结构带来的冲击…

2023电工杯数学建模B题思路模型代码

占个位置吧,开始在本帖实时更新电工杯数学建模赛题思路代码,文章末尾获取! B题思路分析 B题就是一个评价类的题目,整体难度就远低于A题了,这个题目主要是评估人工智能对大学生学习的影响。我们需要先对提供的数据进行…

PyTorch-Forecasting一个新的时间序列预测库

时间序列预测在金融、天气预报、销售预测和需求预测等各个领域发挥着至关重要的作用。PyTorch- forecasting是一个建立在PyTorch之上的开源Python包,专门用于简化和增强时间序列的工作。在本文中我们介绍PyTorch-Forecasting的特性和功能,并进行示例代码…