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

【Spring Boot】Spring原理:Bean的作用域和生命周期

目录

  • Spring原理
    • 一. 知识回顾
      • 1.1 回顾Spring IOC
      • 1.2 回顾Spring DI
      • 1.3 回顾如何获取对象
    • 二. Bean的作用域
    • 三. Bean的生命周期

Spring原理

一. 知识回顾

在之前IOC/DI的学习中我们也用到了Bean对象,现在先来回顾一下IOC/DI的知识吧!
首先Spring IOC,也叫控制反转,简单来说就是依赖添加5大注解把该对象交给Spring来管理,Spring会把该对象放入IOC容器中,在接下来的调用中直接注入即可,注入也就是Spring DI操作了。
回顾一下,一共有以下五大注解:

1.1 回顾Spring IOC

类注解

  1. @Controller(控制层注解)
  2. @Service(逻辑层注解)
  3. @Repository(数据层注解)
  4. @Component(总注解)
  5. @Configuration(插件注解)

然后就是有一点要注意的就是,@Component注解可以说是其他四个注解的父注解,就是其他注解底层都是依赖@Component来实现的,都可以使用@Component注解来代替使用,但是不能代替@Controller,因为别忘了Controller注解还有返回视图的作用,这是@Component注解所不具备的

方法注解

  1. @Bean(方法注解)

该注解用于把方法交给Spring进行管理,但是必须和类注解连用

1.2 回顾Spring DI

Spring DI就是把IOC容器里的东西拿出来进行使用,主要是@Autowired注解,主要有三种注入方式

  1. 属性注入(就是通过给成员变量进行注入)
  2. 构造注入(就是通过构造方法注入)
  3. Set方法注入

其实在实际运用中,使用属性注入基本上能满足90%的需求了.

Spring DI主要面试考的主要是拥有多个相同对象,注入时该如何保证?

主要提供了以下三大注解

  1. @Primary(默认注入的方法)
  2. @Qualifier(加入要注入对象的方法名称)
  3. @Resource(要注入对象的名称)

@Autowird与@Resource的区别

  1. @Autowired是spring框架提供的注解,⽽@Resource是JDK提供的注解
  2. @Autowired默认是按照类型注⼊,⽽@Resource是按照名称注⼊.相⽐于@Autowired来说,@Resource⽀持更多的参数设置,例如name设置,根据名称获取Bean。

1.3 回顾如何获取对象

Spring主要提供了两种方法获取Bean对象:

  1. ApplicationContext(上下文)
  2. @Autowired

第二种是注入方式就不一一叙述了,主要是ApplicationContext获取Bean对象,其实就是调用了分类BeanFactory工厂来获取对象。
两者主要有以下两点区别:

  1. 继承关系和功能方⾯来说:Spring容器有两个顶级的接口:BeanFactory和
    ApplicationContext。其中BeanFactory提供了基础的访问容器的能⼒,⽽
    ApplicationContext属于BeanFactory的⼦类,它除了继承了BeanFactory的所有功能之外,
    它还拥有独特的特性,还添加了对国际化⽀持、资源访问⽀持、以及事件传播等方⾯的⽀持.

  2. 从性能方⾯来说:ApplicationContext是⼀次性加载并初始化所有的Bean对象,也就是饿加载,⽽
    BeanFactory是需要那个才去加载那个,也就是懒加载,因此更加轻量.(空间换时间)

好了,回顾完了Spring IOC/DI的知识点了,就该进入正题了。

二. Bean的作用域

Bean的作用域是指Bean在Spring框架中的某种行为模式.

主要有以下6种作用域

  1. singleton:单例作用域
  2. prototype:原型作用域(多例作用域)
  3. request:请求作用域
  4. session:会话作用域
  5. Application:全局作用域
  6. websocket:HTTPWebSocket作用域
作用域说明
singleton每个SpringIoC容器内同名称的bean只有⼀个实例(单例)(默认)
prototype每次使用该bean时会创建新的实例(⾮单例)
request每个HTTP请求生命周期内,创建新的实例(web环境中)
session每个HTTPSession生命周期内,创建新的实例(web环境中)
application每个ServletContext生命周期内,创建新的实例(web环境中)
websocket每个WebSocket生命周期内,创建新的实例(web环境中)

单例作用域:多次访问,得到的都是同⼀个对象,并且 @Autowired 和 applicationContext.getBean()
也是同⼀个对象.

多例作用域:观察ContextDog,每次获取的对象都不⼀样(注⼊的对象在Spring容器启动时,就已经注⼊了,所以多次请求也不会发生变化)

请求作用域:在⼀次请求中, @Autowired 和 applicationContext.getBean() 也是同⼀个对象.
但是每次请求,都会重新创建对象

会话作用域:在⼀个session中,多次请求,获取到的对象都是同⼀个,换⼀个浏览器访问,发现会重新创建对象.(另⼀个Session)

Application作用域:在⼀个应用中,多次访问都是同⼀个对象

注意:Applicationscope就是对于整个web容器来说,bean的作用域是ServletContext级别的.这个和
singleton有点类似,区别在于:Applicationscope是ServletContext的单例,singleton是⼀个
ApplicationContext的单例.在⼀个web容器中ApplicationContext可以有多个

三. Bean的生命周期

生命周期指的是⼀个对象从诞生到销毁的整个生命过程,我们把这个过程就叫做⼀个对象的生命周期.
Bean的生命周期分为以下5个部分:

  1. 实例化(为Bean分配内存空间)

  2. 属性赋值(Bean注⼊和装配,⽐如 @AutoWired )

  3. 初始化
    执行各种通知,如 BeanNameAware , BeanFactoryAware ,ApplicationContextAware 的接口方法.

  4. 使用Bean

  5. 销毁Bean
    销毁容器的各种方法,如 @PreDestroy , DisposableBean 接口方法, destroymethod.

在这里插入图片描述
实现的代码如下:

@Component
public class BeanLifeComponent implements BeanNameAware {private UserComponent userComponent;public BeanLifeComponent() {System.out.println("执行构造函数");}@Autowiredpublic void setUserComponent(UserComponent userComponent) {System.out.println("设置属性userComponent");this.userComponent = userComponent;}@Overridepublic void setBeanName(String s) {System.out.println("执行了 setBeanName 方法:" + s);}/*** 初始化*/@PostConstructpublic void postConstruct() {System.out.println("执行 PostConstruct()");}public void use() {System.out.println("执行了use方法");}/*** 销毁前执行方法*/@PreDestroypublic void preDestroy() {System.out.println("执行:preDestroy()");}
}

相关文章:

【Spring Boot】Spring原理:Bean的作用域和生命周期

目录 Spring原理一. 知识回顾1.1 回顾Spring IOC1.2 回顾Spring DI1.3 回顾如何获取对象 二. Bean的作用域三. Bean的生命周期 Spring原理 一. 知识回顾 在之前IOC/DI的学习中我们也用到了Bean对象,现在先来回顾一下IOC/DI的知识吧! 首先Spring IOC&am…...

MinIO:开源对象存储解决方案的领先者

MinIO:开源对象存储解决方案的领先者 MinIO 是一款开源的对象存储系统,致力于提供高性能、可伸缩、安全的数据存储解决方案。 官方解释:MinIO 是一个基于Apache License v2。0开源协议的对象存储服务。它兼容亚马逊S3云存储服务接口,非常适…...

15、电科院FTU检测标准学习笔记-基本性能

作者简介: 本人从事电力系统多年,岗位包含研发,测试,工程等,具有丰富的经验 在配电自动化验收测试以及电科院测试中,本人全程参与,积累了不少现场的经验 ———————————————————…...

古建筑倾斜在线监测系统:科技守护历史的创新实践

​ ​​在文化遗产保护的广阔领域中,古建筑的健康监测占据着举足轻重的地位。然而,传统的监测方法往往受限于布线复杂、安装难度大以及对古建筑本体可能造成的伤害等问题。近年来,一种新型的古建筑倾斜在线监测系统应运而生,它…...

DP(2) | Java | LeetCode 62, 63, 343, 96 做题总结(96 未完)

62.不同路径 我的代码(报错) 写的过程中感到很迷惑的点:①二维数组和这道题目的对应弄不清除,m n的初始化 是 dp[m][n] 还是 dp[n][m] ② class Solution {public int uniquePaths(int m, int n) {int[][]dp new int[m1][n1];d…...

Ubuntu实战续篇:Apache httpd轻松搭建高效代理服务器

Ubuntu实战续篇:Apache httpd轻松搭建高效代理服务器 一、前言二、Ubuntu下的Apache配置文件概览三、配置并启用 Apache 代理服务 作者:高玉涵 时间:2024.7.11 21:06 博客:blog.csdn.net/cg_i 环境:Ubuntu 22.04.4 LTS…...

Linux 程序卡死的特殊处理

一、前言 Linux环境。 我们在日常编写的程序中,可能会出现一些细节问题,导致程序卡死,即程序没法正常运行,界面卡住,也不会闪退... 当这种问题出现在客户现场,那就是大问题了。。。 当我们暂时还无法排…...

(C++字符串02) 反转字符串中的单词

151、反转字符串中的单词 先将字符串的里的多余空格去掉,时间复杂度:O(n),再将字符串整体反转,时间复杂度:O(n),最后反转每一个单词,时间复杂度:O(n); class Solution { public:string reverseWords(stri…...

一致性Hash问题及解决方案

Hash算法的应用场景 请求的负载均衡 Nginx的ip_hash策略可以在客户端ip不发生变化的情况下,将其发出的请求始终路由到同一个目标服务器上,实现会话粘滞,避免处理session共享问题。 如果没有ip_hash策略,可以通过维护一张映射表的…...

【接口设计】如何设计统一 RESTful 风格的数据接口

如何设计统一 RESTful 风格的数据接口 1.版本控制1.1 通过 URL1.2 通过自定义请求头1.3 通过 Accept 标头 2.过滤信息3.确定 HTTP 的方法4.确定 HTTP 的返回状态5.定义统一返回的格式 近年来,随着移动互联网的发展,各种类型的客户端层出不穷。如果不统一…...

【备战秋招】——算法题目训练和总结day3

【备战秋招】——算法题目训练和总结day3😎 前言🙌BC149简写单词题解思路分析代码分享: dd爱框框题解思路分析代码分享: 除2!题解思路分析代码分享: 总结撒花💞 😎博客昵称&#xff…...

Git 操作总结

1. 安装、Git 环境配置 1.1 安装 Git 官方版本可以在 Git 官方网站下载:打开 https://git-scm.com/download/win,选择相应版本即可。 Git 安装完成后,可以在开始菜单中看到 Git 的三个启动图标(Git Bash、Git CMD、Git GUI&…...

若依 ruoyi-vue SpringBoot highlight-textarea 输入框敏感词关键词高亮标红(二)

参考文章,非常感谢大佬的分享 实现可高亮的输入框 — HighlightTextarea GitHub:highlight-textarea 可看作者上一篇文章 若依 ruoyi-vue SpringBoot聊天敏感词过滤sensitive-word(一) 效果图 审核时,输入框高亮敏感词&#xff…...

33 IRF配置思路

IRF配置思路网络括谱图 主 Ten-GigabitEthernet 1/0/49 Ten-GigabitEthernet 1/0/50 Ten-GigabitEthernet 1/0/51 备 Ten-GigabitEthernet 2/0/49 Ten-GigabitEthernet 2/0/50 Ten-GigabitEthernet 2/0/51 思路 主 1 利用console线进入设备的命令行页面去更改…...

Dify中的RAG和知识库

一.RAG 基本架构 当用户提问 “美国总统是谁?” 时,系统并不是将问题直接交给大模型来回答,而是先将用户问题在知识库中进行向量搜索,通过语义相似度匹配的方式查询到相关的内容(拜登是美国现任第46届总统…&#xff0…...

vue3 + i18n 中英文切换

第一步:安装vue-i18n npm install vue-i18n 第二步:配置语言包及js文件 目录如下: 英文语言包 en.js // lang/en.js - 英文语言包 export default {menu: { 库房管理: Warehouse Management,入库检测: Incoming Inspection, 设…...

one-hot-zhu案例

# 导入用于对象保存与加载的joblib # from sklearn.externals import joblib import joblib # 导入keras中的词汇映射器Tokenizer from keras.preprocessing.text import Tokenizer def one_hot_01(): # 1 准备语料 vocabs # vocabs {“周杰伦”, “陈奕迅”, “王力宏”, “…...

数据库课设---酒店管理系统(MySQL、VBNet)

目录 一. 知识技术 二. 需求分析 2.1 功能需求 2.2 数据需求 三. 数据流图与数据字典 3.1 数据流图 3.1.1 业务流图 3.1.2 数据流图 3.1.3 关系图 3.2 数据字典 四. 数据库设计 4.1 概念模型设计 4.2 逻辑模型设计 4.3 数据库实现 …...

NLP入门——前馈词袋分类模型的搭建、训练与预测

模型的搭建 线性层 >>> import torch >>> from torch import nn >>> class DBG(nn.Module): ... def forward(self,x): ... print(x.size()) ... return x ... >>> tmod nn.Sequential(nn.Linear(3,4),DB…...

GD32F303RET6读取SGM58031电压值

1、SGM58031芯片详解 (1)SGM58031是一款低功耗,16位精度,delta-sigma (ΔΣ)模数转换器(ADC)。它从3V到5.5V供电。 (2)SGM58031包含一个片上参考和振荡器。它有一个I2C兼容接口,可以选择四个I2…...

网络六边形受到攻击

大家读完觉得有帮助记得关注和点赞!!! 抽象 现代智能交通系统 (ITS) 的一个关键要求是能够以安全、可靠和匿名的方式从互联车辆和移动设备收集地理参考数据。Nexagon 协议建立在 IETF 定位器/ID 分离协议 (…...

【CSS position 属性】static、relative、fixed、absolute 、sticky详细介绍,多层嵌套定位示例

文章目录 ★ position 的五种类型及基本用法 ★ 一、position 属性概述 二、position 的五种类型详解(初学者版) 1. static(默认值) 2. relative(相对定位) 3. absolute(绝对定位) 4. fixed(固定定位) 5. sticky(粘性定位) 三、定位元素的层级关系(z-i…...

srs linux

下载编译运行 git clone https:///ossrs/srs.git ./configure --h265on make 编译完成后即可启动SRS # 启动 ./objs/srs -c conf/srs.conf # 查看日志 tail -n 30 -f ./objs/srs.log 开放端口 默认RTMP接收推流端口是1935,SRS管理页面端口是8080,可…...

Cinnamon修改面板小工具图标

Cinnamon开始菜单-CSDN博客 设置模块都是做好的,比GNOME简单得多! 在 applet.js 里增加 const Settings imports.ui.settings;this.settings new Settings.AppletSettings(this, HTYMenusonichy, instance_id); this.settings.bind(menu-icon, menu…...

c#开发AI模型对话

AI模型 前面已经介绍了一般AI模型本地部署,直接调用现成的模型数据。这里主要讲述讲接口集成到我们自己的程序中使用方式。 微软提供了ML.NET来开发和使用AI模型,但是目前国内可能使用不多,至少实践例子很少看见。开发训练模型就不介绍了&am…...

IoT/HCIP实验-3/LiteOS操作系统内核实验(任务、内存、信号量、CMSIS..)

文章目录 概述HelloWorld 工程C/C配置编译器主配置Makefile脚本烧录器主配置运行结果程序调用栈 任务管理实验实验结果osal 系统适配层osal_task_create 其他实验实验源码内存管理实验互斥锁实验信号量实验 CMISIS接口实验还是得JlINKCMSIS 简介LiteOS->CMSIS任务间消息交互…...

Mac下Android Studio扫描根目录卡死问题记录

环境信息 操作系统: macOS 15.5 (Apple M2芯片)Android Studio版本: Meerkat Feature Drop | 2024.3.2 Patch 1 (Build #AI-243.26053.27.2432.13536105, 2025年5月22日构建) 问题现象 在项目开发过程中,提示一个依赖外部头文件的cpp源文件需要同步,点…...

STM32HAL库USART源代码解析及应用

STM32HAL库USART源代码解析 前言STM32CubeIDE配置串口USART和UART的选择使用模式参数设置GPIO配置DMA配置中断配置硬件流控制使能生成代码解析和使用方法串口初始化__UART_HandleTypeDef结构体浅析HAL库代码实际使用方法使用轮询方式发送使用轮询方式接收使用中断方式发送使用中…...

宇树科技,改名了!

提到国内具身智能和机器人领域的代表企业,那宇树科技(Unitree)必须名列其榜。 最近,宇树科技的一项新变动消息在业界引发了不少关注和讨论,即: 宇树向其合作伙伴发布了一封公司名称变更函称,因…...

在鸿蒙HarmonyOS 5中使用DevEco Studio实现企业微信功能

1. 开发环境准备 ​​安装DevEco Studio 3.1​​: 从华为开发者官网下载最新版DevEco Studio安装HarmonyOS 5.0 SDK ​​项目配置​​: // module.json5 {"module": {"requestPermissions": [{"name": "ohos.permis…...