Spring的作用域与生命周期

news2024/12/24 8:12:52

在这里插入图片描述

文章目录

  • 一、lombok的安装与使用
  • 二、Spring作用域
  • 二、Bean原理分析
    • 执行流程
    • Bean的生命周期

一、lombok的安装与使用

lombok插件可以提供给我们一些注释,这些注释可以很好的帮助我们消除Java代码中大量冗余的代码,可以使得我们的Java类可以看起来非常的干净整洁
1.安装lombok插件
在这里插入图片描述
在这里插入图片描述
2.pom.xml导入依赖
在这里插入图片描述
在这里插入图片描述

<!-- https://mvnrepository.com/artifact/org.projectlombok/lombok -->
<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <version>1.18.24</version>
    <scope>provided</scope>
</dependency>

3.基本使用
我们创建一个简单的User实体类

public class User {
    private int id;
    private String name;
    private String password;
}

如果我们手动的在类中加入setter+getter,toString等等,如果属性比较多,代码看起来十分的冗余,我们可以使用lombok提供的注解来帮助我们自动生成
在这里插入图片描述
以下就是我们lombok的注解了,我们在这里介绍一些常用的注解:

注解作用
@Data为所有属性提供getting、setting、hashCode、equals、toString等方法
@Value除了将变量都设置为final
@Setter自动生成setting方法
@Getter自动生成getting方法
@ToString自动重写toString方法
@EqualsAndHashCode自动生成equals和hashCode方法
@NoArgsConstructor生成无参构造器
@AllArgsConstructor生成一个包含所有参数的构造器,不包含无参构造
@RequireArgsConstructor生成特定参数的构造器,特定参数指的是final修饰的变量们

在这里插入图片描述
在这里插入图片描述
此时我们没有写setter方法,只是加入了相应注解,lombok帮我们补全,我们可以看到set方法右下角有个logo,以上就是lombok的功能演示

二、Spring作用域

Spring作用域:Spring的作用域是用来控制Bean实例创建的范围和生命周期的,可以根据具体情况选择不同的作用域来达到性能优化、资源利用最大化和可维护性等目的

Spring Bean作用域(Scope):
1.singleton:单例模式。Spring IoC容器中只会存在一个共享的Bean实例,无论有多少个Bean引用它,始终指向同一对象。Singleton作用域是Spring中的缺省作用域,也可以显示的将Bean定义为singleton模式
2.prototype:原型模式。每次通过Spring容器获取prototype定义的Bean时,容器都将创建一个新的Bean实例,每个Bean实例都有自己的属性和状态,而singleton全局只有一个对象
3.request:请求模式。在一次HTTP请求中,容器会返回该Bean的同一个实例,但在不同的请求中会创建新的实例。仅适用于WebApplicationContext环境
4.session:会话模式。在同一个HTTP Session中,每个Bean定义对应一个实例。仅适用于WebApplicationContext环境
5.global seesion:全局会话模式。仅在使用Portlet上下文时有效,表示整个Web应用中所有Portlet共享同一个Bean实例,仅适用于WebApplicationContext环境
6.websocket:网络长连接,只适用于Spring WebSocket项目

我们可以通过两种方式设置Spring Bean作用域:
1.xml配置文件手动设置作用域
在这里插入图片描述
因为我们这里是普通的Spring项目所以只有两种作用域类型
2.使用注解进行设置作用域
在这里插入图片描述
我们Scope注解还可以传入另一种参数形式
在这里插入图片描述
在这里插入图片描述
ConfigurableBeanFactory类为我们提供了静态属性,防止我们手动输错

我们来看一下singleton和prototype到底有什么区别:
singleton:

public static void main(String[] args) {
        ApplicationContext context =
                new ClassPathXmlApplicationContext("spring-config.xml");
        //singleton作用域下
        User user1 = context.getBean("user",User.class);
        User user2 = context.getBean("user",User.class);
        System.out.println(user1 == user2);
    }

在这里插入图片描述
prototype:

public static void main(String[] args) {
        ApplicationContext context =
                new ClassPathXmlApplicationContext("spring-config.xml");
        //prototype作用域下
        User user1 = context.getBean("user",User.class);
        User user2 = context.getBean("user",User.class);
        System.out.println(user1 == user2);
    }

在这里插入图片描述
我们可以发现我们singleton每次获取都是同一份对象,而prototype每次获取都会去创建一个新的对象

二、Bean原理分析

执行流程

1.首先启动容器,加载配置文件
在这里插入图片描述
2.根据配置文件完成Bean的初始化
在这里插入图片描述
配置文件中的Bean是按顺序初始化的
3.注册Bean对象到容器中
扫描com.zd.demo包下的注解进行初始化(@Controller,Service,@Component,@Repository),然后初始化我们手动写的Bean
在这里插入图片描述
4.装配Bean的属性
如果Bean对象需要其他的Bean作为属性,可以使用注解的方式注入(@Autowired、Resource)
在这里插入图片描述
Bean执行流程:启动容器 -> 实例化Bean(分配空间) -> Bean注册到Spring容器中(存对象) -> 将Bean装配到需要的类中(取对象)

Bean的生命周期

Spring Bean的生命周期是从Bean实例化之后,即通过反射创建出对象之后,到Bean成为一个完整的对象,最终存储到单例池中,这个过程称之为Spring Bean的生命周期,大致为分为5个阶段:
1.实例化阶段:Spring框架会取出BeanDefinition的信息进行判断,Bean作用域是否是singleton,是否延迟加载(lazy-init),是否是FactoryBean等,最终Bean通过反射进行实例化
2.设置属性:Bean的注入与装配
3.Bean的初始化阶段:
执行Aware接口方法,如BeanNameAware、BeanFactoryAware、ApplicationContextAware的接口方法
执行BeanPostProcessor方法(before)
执行@PostConstruct初始化方法
行InitializingBean接口的初始化方法
执行自定义指定的init-method方法
执行BeanPostProcessor初始化后置方法(after)
4.使用Bean
5.销毁Bean
执行PreDestroy、DisposableBean接口方法
执行destroy-method方法

在这里插入图片描述
Bean初始化过程设置以下几个过程:
1.Bean实例的属性填充
2.Aware接口属性注入
3.BeanPostProcessor的before()方法回调
4.执行@PostConstruct初始化方法
5.InitializingBean接口的初始化方法回调
6.自定义初始化方法init的回调
7.BeanPostProcessor的after()方法回调
在这里插入图片描述

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

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

相关文章

OpenCV实战——二值特征描述符

OpenCV实战——二值特征描述符 0. 前言1. ORB 和 BRISK 二值描述符1. ORB 特征描述符1.2 ORB 与 BRISK 算法 2. FREAK 二值描述符3. 二值描述符采样模式4. 完整代码相关链接 0. 前言 在《特征描述符》一节中&#xff0c;我们学习了如何使用从图像强度梯度中提取的描述符来描述…

ChatGPT使用学习(一):chatgpt_academic安装到测试详细教程(一文包会)

ChatGPT 1.简介及功能2.前置准备3.开始使用 1.简介及功能 Chargpt academic是一种基于OpenAI GPT模型的语言生成模型&#xff0c;它是专门为学术研究者和学生设计的。它使用预训练模型来生成与学术论文、文章和文献相关的文本&#xff0c;可以用于自然语言处理、机器翻译、文本…

SpringBoot整合Redis,一篇带你入门使用Redis

本文介绍如何将Redis整合到SpringBoot项目中&#xff0c;以及如何配置、封装和使用 文章目录 前言环境搭建项目结构添加依赖 Module封装RedisConfig配置封装常见操作为ServiceRedisServiceRedisLockUtil 测试 前言 参考链接&#xff1a; 英文官网链接中文官网链接Redis githu…

vue项目使用RSA加解密

vue项目使用RSA加解密 1.安装2.在utils下创建rsa.js3.在main.js中引入4.页面调用5.遇到的问题 1.安装 使用一下命令安装jsencrypt插件 npm install jsencrypt --save-dev npm i encryptlong -S注意&#xff1a; &#xff08;1&#xff09;上述插件不支持在小程序中使用&#…

python大数据作业-客户价值分析-实训头歌

一、实验目的与要求 1、掌握使用numpy和pandas库处理数据的基本方法。 2、掌握使用RFM分析模型对客户信息进行特征提取的基本方法。 3、掌握对特征数据进行标准化处理的基本方法。 4、掌握使用Sklearn库对K-Means聚类算法的实现及其评价方法。 5、掌握使用matplotlib结合panda…

【2】YOLOv8原理解析:重新定义实时目标检测的速度和精度

文章目录 0.前言1.YOLOv51.1 YOLOv5网络回顾1.2 YOLOv5网络结构图 2.YOLOv82.1 YOLOv8概述2.2 YOLOv8整体结构图2.3 YOLOv8yaml 文件与 YOLOv5yaml 文件对比2.3.1 参数部分2.3.2 主干部分2.3.3 Neck部分2.3.4 Head部分 2.4 正负样本分配策略2.4.1 静态分配策略和动态分配策略有…

机器学习实战:Python基于SVD奇异值分解进行矩阵分解(八)

文章目录 1 前言1.1 奇异值分解1.2 奇异值分解的应用 2 简单计算SVD2.1 NumPy 计算 SVD2.2 scikit-learn 计算截断 SVD2.3 scikit-learn 计算随机 SVD 3 demo数据演示3.1 导入函数3.2 导入数据3.3 计算SVD 4 讨论 1 前言 1.1 奇异值分解 奇异值分解&#xff08;Singular Valu…

【李老师云计算】实验二:Spark集群的搭建与求解最大值

索引 前言1. Spark部署1.1 下载Spark1.2 解压Spark1.3 修改环境变量1.4 修改主机Spark配置文件1.4.1 slaves.template文件配置1.4.2 spark-env.sh.template文件配置 1.5 分享主机Spark到从机1.6 启动Spark集群(★重启后的操作)1.7 通过jps查看是否启动成功1.8 通过网页查看是否…

Vue+Echarts 项目演练(上)整体页面结构的构建

项目分辨率响应式创建 项目顶部信息条创建 页面主体创建 接项目搭建与初始化之后继续对项目进行部署工作 项目展示&#xff1a; 技术栈&#xff1a; 1. vue3.0vue-router4.0axios 2. flex 布局 3. LESS 4. rem 屏幕适配 5. echarts5.0 项目分辨率响应式创建 对插件…

centos 8 配置LVS+ keepalived 高可用

♥️作者&#xff1a;小刘在C站 ♥️个人主页&#xff1a;小刘主页 ♥️每天分享云计算网络运维课堂笔记&#xff0c;努力不一定有收获&#xff0c;但一定会有收获加油&#xff01;一起努力&#xff0c;共赴美好人生&#xff01; ♥️夕阳下&#xff0c;是最美的绽放&#xff0…

3105—IIS部署

一、部署子站点 1—父站点web.config配置 新增并设定location段落 <configuration><location path"." allowOverride"false" inheritInChildApplications"false"><system.webServer><handlers><add name"aspNe…

【Matlab】基于紧格式动态线性化的无模型自适应控制

例题来源&#xff1a;侯忠生教授的《无模型自适应控制&#xff1a;理论与应用》&#xff08;2013年科学出版社&#xff09;。 对应书本 4.2 单输入单输出系统(SISO)紧格式动态线性化(CFDL)的无模型自适应控制(MFAC) 例题4.1 题目要求 matlab代码 clc; clear all;%% 期望轨迹…

neo4j jdk安装版本搭配

jdk下载版本为jdk11 neo4j 为neo4j-community-4.3.15 可使用 非常流畅 没有毛病&#xff01;&#xff01;&#xff01; 这里直接给出结论&#xff0c;对于想知道这两个版本为什么适配的小伙伴可以继续往下看 出现这个界面后在网页打开browser 输入账号和密码后就可以登录了&…

【架构设计】什么是CAP理论?

1、理论 CAP理论是指计算机分布式系统的三个核心特性&#xff1a;一致性&#xff08;Consistency&#xff09;、可用性&#xff08;Availability&#xff09;和分区容错性&#xff08;Partition Tolerance&#xff09;。 在CAP理论中&#xff0c;一致性指的是多个节点上的数据…

Vector - CAPL - CANoe硬件配置函数 - 01

CAN ACK自应答 在测试CAN&CANFD通信或者网络管理的时候&#xff0c;我们经常遇到使用报文&#xff08;网络管理报文或者通信报文&#xff09;唤醒被测件这个测试点&#xff0c;如果测试比较多的情况下&#xff0c;我们就会发现&#xff0c;如果CANoe没有接被测件或者被测件…

Python标准数据类型-Number(数字)

✅作者简介&#xff1a;CSDN内容合伙人、阿里云专家博主、51CTO专家博主、新星计划第三季python赛道Top1 &#x1f4c3;个人主页&#xff1a;hacker707的csdn博客 &#x1f525;系列专栏&#xff1a;零基础入门篇 &#x1f4ac;个人格言&#xff1a;不断的翻越一座又一座的高山…

《Java集合》ConcurrentSkipListMap

目录 数据结构findPredecessordoGetdoRemovedoPut新值插入底层创建新值的索引连接索引 数据结构 java源码中对ConcurrentSkipListMap的描述如下&#xff1a; 图中&#xff0c;第0层为具体的数据&#xff0c;第1层的每一个node都有两个子node&#xff0c;一个指向同层的右边&am…

kong(3):动态负载均衡实现

nginx下负载均衡配置 upstream tulingmall-product-upstream {server 192.168.65.190:8866 weight100;server 192.168.65.190:8867 weight100; } server {listen 80;location /pms/ {proxy_pass http://tulingmall-product-upstream;} } 通过 Kong Admin API 进行上述的负载均…

srm采购管理系统有那些功能

srm采购管理系统&#xff0c;是通过系统的手段对采购过程进行管理和控制&#xff0c;实现降低成本、提高效益、提高企业核心竞争力的目的。那么 srm采购管理系统有哪些功能呢&#xff1f; 计划管理 srm采购管理系统提供了各种物料需求计划的功能&#xff0c;以帮助企业制定并控…

前端项目实战:网易云静态页面——导航栏

文章目录 一、实现目标二、顶部实现&#xff08;背景为黑色部分&#xff09;1. 内容布局2. 左边部分网易云logo左边的列表列表元素高亮指向每个列表元素的小红色三角“下载客户端”后的hot标志 3. 右边部分登陆创作者中心搜索 三、底部实现&#xff08;背景为红色部分&#xff…