【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()");}
}

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

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

相关文章

可视化学习:如何用WebGL绘制3D物体

在之前的文章中,我们使用WebGL绘制了很多二维的图形和图像,在学习2D绘图的时候,我们提过很多次关于GPU的高效渲染,但是2D图形的绘制只展示了WebGL部分的能力,WebGL更强大的地方在于,它可以绘制各种3D图形&a…

C语言之数据在内存中的存储(2),浮点数在内存中的存储

目录 前言 一、引例 二、浮点型在内存中的存储 三、浮点数在内存中的存和取过程 1.浮点数的存储过程 2.浮点数的取过程 四、引例解析 总结 前言 想知道浮点数在内存中是如何存储的吗,本文就告诉你答案,虽然一般情况题目还是面试涉及到浮点数在内…

新华三H3CNE网络工程师认证—ACL使用场景

ACL主要用于实现流量的过滤,业务中网络的需求不止局限于能够连同。 一、过略工具 你的公司当中有研发部门,包括有财务部门,财务部门的访问是要做到控制的,防止被攻击。 这种的过滤方法为,在设备侧可以基于访问需求来…

AI算力发展现状与趋势分析

综合算力发展现状与趋势分析 在数字经济的疾速推动下,综合算力作为驱动各类应用和服务的新型生产力,其价值日益凸显。我们深入探讨了综合算力的定义、重要性以及当前发展状况;并从算力形态、运力性能和存储技术等角度,预见了其发展…

基于Java技术的校友社交系统

你好呀,我是计算机学姐码农小野!如果你对校友社交系统感兴趣或者有相关需求,可以私信联系我。 开发语言 Java 数据库 MySQL 技术 Java技术SpringBoot框架 工具 IDEA/Eclipse、Navicat、Maven 系统展示 首页 校友会信息界面 校友活动…

Sqli-labs 3

1.按照路径http://localhost/sqli-labs/sqli-labs-master/Less-3/进入 2.判断注入类型----字符型 Payload:?id1’) and 11-- 注:根据报错提示的语法错误,在第一行中使用接近’union select 1,2,3--’)的正确语法 3.判断注入点:…

【Linux】vim详解

1.什么是vi/vim? 简单来说,vi是老式的文本编辑器,不过功能已经很齐全了,但是还是有可以进步的地方。vim则可以说是程序开发者的一项很好用的工具,就连 vim的官方网站( http://www.vim.org)自己也说vim是一…

区块链项目全球成功指南:全面覆盖的媒体宣发策略与实践

随着区块链技术的迅速普及和发展,全球范围内对区块链项目的关注度不断提升。为了在国际市场上取得成功,区块链项目需要通过有效的媒体宣传策略来提高知名度,吸引投资,并建立强大的社区支持。本文将详细介绍区块链项目在海外媒体宣…

为企业提升销售工作效率的工作手机管理系统

在竞争日益激烈的市场环境中,企业的销售团队如同前线战士,其作战效率直接关乎企业的生存与发展。然而,传统销售管理模式下的信息孤岛、沟通不畅、数据混乱等问题,正悄然成为制约销售效率提升的瓶颈。今天,我们为您揭秘…

在 Windows 平台搭建 MQTT 服务

引言 MQTT 是一种轻量级、基于发布/订阅模式的消息传输协议,旨在用极小的代码空间和网络带宽为物联网设备提供简单、可靠的消息传递服务。MQTT 经过多年的发展,如今已被广泛应用于资源开采、工业制造、移动通信、智能汽车等各行各业,使得 MQ…

汇聚荣做拼多多电商怎么样?

汇聚荣做拼多多电商怎么样?在当前电商平台竞争激烈的背景下,拼多多凭借其独特的商业模式和市场定位迅速崛起。对于想要加入拼多多的商家而言,了解平台的特点、优势及挑战是至关重要的。本文将深入分析加入拼多多电商的多个方面,帮助读者全面…

ubuntu计划任务反弹

目录 实验环境 实验步骤 目标主机构造任务计划 构造语句 语句解释 kali开启监听 监听成功 问题 原因 实验环境 攻击者 操作系统:kali IP:192.168.244.141 目标主机 操作系统:ubuntu IP:192.168.244.151 实验步骤 目…

论文学习_An Empirical Study of Deep Learning Models for Vulnerability Detection

1. 引言 研究背景:近年来,深度学习漏洞检测工具取得了可喜的成果。最先进的模型报告了 0.9 的 F1 分数,并且优于静态分析器。结果令人兴奋,因为深度学习可能会给软件保障带来革命性的变化。因此,IBM、谷歌和亚马逊等行业公司非常感兴趣,并投入巨资开发此类工具和数据集。…

(8)揭示Python编程精髓:深潜继承与多态的奇幻之旅

目录 1. 命名空间与作用域1.1 命名空间概述1.2 作用域1.2.1 局部作用域1.2.2 全局作用域1.2.3 修改全局变量1.2.4 嵌套作用域 2. 继承3. 多态(Polymorphism) 1. 命名空间与作用域 1.1 命名空间概述 命名空间是一个从名字到对象的映射,它在P…

Qt:19.浮动窗口/子窗口(子窗口介绍、代码方式创建子窗口、设置子窗口标题、为子窗口添加控件、设置子窗口停靠位置)

目录 1.子窗口介绍: 2.代码方式创建子窗口: 3.设置子窗口标题: 4.为子窗口添加控件: 5.设置子窗口停靠位置。 1.子窗口介绍: 在 Qt 中,可以创建和管理子窗口(子窗口体)以实现多窗…

图片怎么制作成长期可用的活码?扫码提供图片预览的制作技巧

现在图片的尺寸和清晰度的质量越来越高,相对应的会占用更多的存储空间,现在很多人会将图片存入云端后,通过生成二维码的方式,扫码来查看图片内容。图片转换二维码有利于将图片分享给其他人查看,还能够节省更多的空间&a…

SpringBoot自己开发一个starter

提示:本文主要讲述如何自行开发一个SpringBoot的starter 文章目录 目录 文章目录 前言 一、Starter是什么 二、创建一个SpringBoot项目 1.创建一个基本的SpringBoot项目 2.选择要下载的库 三、设置项目 1.提示 2.配置pom.xml 3.重点代码 1.创建一个User类…

16.x86游戏实战-汇编指令push pop pushad popad

免责声明:内容仅供学习参考,请合法利用知识,禁止进行违法犯罪活动! 本次游戏没法给 内容参考于:微尘网络安全 工具下载: 链接:https://pan.baidu.com/s/1rEEJnt85npn7N38Ai0_F2Q?pwd6tw3 提…

【第29章】MyBatis-Plus之分页插件

文章目录 前言一、支持的数据库二、配置方法三、属性介绍四、自定义 Mapper 方法中使用分页五、其他注意事项六、Page 类七、实战1. 配置类2. 分页类3. 测试 总结 前言 MyBatis-Plus 的分页插件 PaginationInnerInterceptor 提供了强大的分页功能,支持多种数据库&a…

Windows电脑安装Python结合内网穿透轻松搭建可公网访问私有网盘

文章目录 前言1.本地文件服务器搭建1.1.Python的安装和设置1.2.cpolar的安装和注册 2.本地文件服务器的发布2.1.Cpolar云端设置2.2.Cpolar本地设置 3.公网访问测试4.结语 前言 本文主要介绍如何在Windows系统电脑上使用python这样的简单程序语言,在自己的电脑上搭建…