【Spring core学习四】Bean作用域和生命周期

目录

一、Bean的作用域

🌈1、被修改的Bean值现象

🌈2、 Bean 的 6 种作⽤域

🌈3、设置作用域 

二、Spring的执行流程

三、Bean的生命周期 

🌈1、Bean生命周期的过程

🌈2、演示生命周期


一、Bean的作用域

🌈1、被修改的Bean值现象

UserService类:

 UserController1类:修改姓名

 UserController2类:

执行结果:

 分析: 公共 Bean,A ⽤户使⽤时,进⾏了修改操作,B ⽤户再去使⽤公共 Bean 的时候,获取到的是被修改的值。操作以上问题的原因是因为 Bean 默认情况下是单例状态(singleton),也就是所有⼈的使⽤的都是同⼀个对象,使⽤单例可以很⼤程度上提⾼性能,Spring 中Bean 的作⽤域默认也是 单例模式。

🌈2、 Bean 的 6 种作⽤域

        Spring 容器在初始化⼀个 Bean 的实例时,同时会指定该实例的作⽤域。Spring有 6 种作⽤域,最后四种是基于 Spring MVC ⽣效的:
(1) singleton:单例作⽤域

        该作⽤域下的Bean在IoC容器中只存在⼀个实例:获取Bean(即通过
applicationContext.getBean等⽅法获取)及装配Bean(即通过@Autowired注⼊)都是同⼀个对象。

        比如我们要区分两个学生一定是属性不同,如果两个个对象各种属性都相同,那么就认为是同一个对象,所以可以共享一个对象的,我们就称为是无状态的。使用场景:一般无状态的Bean,使用该单例作用域,也就是Bean对象的属性不需要更新。(每次获取的Bean都是相同的一个对象)
(2)prototype:原型作⽤域(多例作⽤域)

        每次获取的Bean都是一个新的对象。
(3)request:请求作⽤域

        在一次http请求中获取的是同一个Bean,每次http请求会创建新的Bean实例。类似于prototype。
(4) session:会话作⽤域

        在⼀个session中,是⼀个相同的Bean实例;在Session过期后,获取的就是新的一个Bean。
(5)application:全局作⽤域

        在⼀个http servlet Context中,定义⼀个Bean实例。
(6)websocket:HTTP WebSocket 作⽤域

      在⼀个HTTP WebSocket的⽣命周期中,定义⼀个Bean实例。


单例作⽤域(singleton) VS 全局作⽤域(application)

  • singleton 是 Spring Core 的作⽤域;application 是 Spring Web (Spring MVC)中的作⽤域;
  • singleton 作⽤于 IoC 的容器,⽽ application 作⽤于 Servlet 容器。
  • Application 作用域是对于整个web容器来说,bean的作用域是ServletContext级别的,和singleton有点类似,但是区别在于Application作用域是ServletContext级别,singleton是一个ApplicationContext的单例。一个web 服务,只有一个ServletContext,但是可以有多个ApplicationContext)

演示在一个ApplicationContext下获取到的是同一个单例

🌈3、设置作用域 

使⽤ @Scope 标签就可以⽤来声明 Bean 的作⽤域⽐如设置 Bean 的作⽤域
在第一部分,我们将代码做如下修改:


二、Spring的执行流程

Bean 执⾏流程(Spring 执⾏流程):

  • 启动 Spring 容器
  • 实例化 Bean(分配内存空间,从⽆到有) 
  • Bean 注册到 Spring 中(存操作)
  • 将 Bean 装配到需要的类中(取操作)

三、Bean的生命周期 

🌈1、Bean生命周期的过程

所谓的⽣命周期指的是⼀个对象从诞⽣到销毁的整个⽣命过程,我们把这个过程就叫做⼀个对象的⽣命周期。

Bean 的⽣命周期分为以下 5 ⼤部分:

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

(2)设置属性(Bean注入和装配);

(3)Bean初始化:

  • 实现各种Aware通知的方法:如BeanNameAware,BeanFactoryAware,ApplicationContextAware 的接⼝⽅法;
  • 执行BeanPostProcessor初始化前置方法;
  • 执行@PostContruct初始化方法,依赖注入操作之后被执行;
  • 执行自己指定的Init-method方法(如果有指定的话);
  • 执行BeanPostProcessor初始化后置方法;

(4)使用Bean;

(5)销毁Bean。

Bean 的⽣命流程看似繁琐,用一个例子来比喻一下:⽐如我们现在需要买⼀栋房⼦,那么我们的流程是这样的:
1. 先买房(实例化,从⽆到有);
2. 装修(设置属性);
3. 买家电,如洗⾐机、冰箱、电视、空调等([各种]初始化);
4. ⼊住(使⽤ Bean);
5. 卖出去(Bean 销毁)

上面一个过程可能比较抽象,尤其是第三步初始化中,很多顺序理解不清楚,所以遇见比较抽象的东西,我们可以用代码来验证一下。

🌈2、演示生命周期

下面的代码不需要掌握,只是根据代码进一步理解生命周期的执行过程即可。

xml文件设置

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:content="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">
       <content:component-scan base-package="beanLife"></content:component-scan>
       <bean id = "beanLifeComponent" class = "beanLife.BeanLifeComponent" init-method="init"></bean>
</beans>

 BeanLifeComponent类

import org.springframework.beans.factory.BeanNameAware;
import org.springframework.stereotype.Component;

import javax.annotation.PostConstruct;

//交给Spring管理
@Component
public class BeanLifeComponent implements BeanNameAware {

    //0.构造函数
    public BeanLifeComponent(){
        System.out.println("执行构造函数");
    }

    //1.实现这个接口:通知
    @Override
    public void setBeanName(String s) {
        System.out.println("设置了BeanName:"+s);
    }
    //2.设置前置方法
    @PostConstruct
    public void postConstruct(){
        System.out.println("执行postConstruct方法");
    }
//    这个方法不论是否执行,都会执行12步
    public void sayHello(){
        System.out.println("hello");
    }

    //3、init-method方法
    public void init(){
        System.out.println("执行init方法");
    }

    //4、销毁bean
    public void preDestroy(){
        System.out.println("执行了destroy方法");
    }
}
public class Main {
    public static void main(String[] args) {
        ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml");
        //通过类名拿到对象
        BeanLifeComponent component = context.getBean((BeanLifeComponent.class));
        //执行sayHello方法
//        component.sayHello();
        //销毁方法
        component.preDestroy();
    }
}

测试结果: 与前文的总结顺序一致。

 

注意: 


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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

大华相机接入web页面实现人脸识别

先看下效果&#xff0c;中间主视频流就是大华相机&#xff08;视频编码H.264&#xff09;&#xff0c;海康相机&#xff08;视屏编码H.265&#xff09; 前端接入视屏流代码 <!--视频流--><div id"col2"><div class"cell" style"flex: …

[GXYCTF2019]simple CPP

前言 三个加密区域&#xff0c;第一次是基本运算&#xff0c;八位叠加&#xff0c;z3方程 分析 第一轮加密&#xff0c;和Dst中模27异或 &#xff08;出题人对动调有很大意见呢&#xff09; 将输入的字符串按八位存入寄存器中&#xff0c;然后将寄存器内容转存到内存 第一次…

数仓-零基础小白到入土-学习路线

数仓-零基础小白到入土-学习路线 铺垫一下下讲在前面涉及基础技术栈&#xff1a;中级&#xff1a;全部掌握之后&#x1f446;&#xff1a;去刷面试题&#xff1a; 初级中级高级博主独家面试题&#xff1a;数仓名词&#xff1a;催更我戳戳个人主页&#xff1a;[up自己的网站](ht…

【电路原理学习笔记】第4章:能量与功率:4.5 稳压电源与电池

第4章&#xff1a;能量与功率 4.5 稳压电源与电池 电网采用交流电形式将电能从发电站传输给用户&#xff0c;这是因为交流电易于转换成适宜传输的高压和终端用户使用的低压。在远距离传输时&#xff0c;采用高电压传输的效率和效益要高得多。对于给定的功率&#xff0c;较高的…

基于linux下的高并发服务器开发(第一章)- 目录操作函数

09 / 目录操作函数 &#xff08;1&#xff09;int mkdir(const char* pathname,mode_t mode); #include <sys/stat.h> #include <sys/types.h>int mkdir(const char *pathname, mode_t mode); 作用&#xff1a;创建一个目录 参数&#xff1a; pat…

【OC总结- Block】

文章目录 前言2. Block2.1 Block的使用规范2.2 __block修饰符2.3 Block的类型2.4 Block的循环引用及解决循环引用的场景引入解决循环引用Block循环引用场景 2.5 Block的实现及其本质2.5.1 初始化部分2.5.2 调用部分2.5.3 捕获变量 Block本质2.6 Block捕获变量 和 对象2.7 Block…

基于 ChatGPT 的 helm 入门

1. 写在最前面 公司最近在推业务上云&#xff08;底层为 k8s 管理&#xff09;&#xff0c;平台侧为了简化业务侧部署的复杂度&#xff0c;基于 helm 、chart 等提供了一个发布平台。 发布平台的使用使业务侧在不了解 helm 、chart 等工具的时候&#xff0c;「只要点点」就可…

LCD—STM32液晶显示(1.显示器简介及LCD显示原理)(6000字详细介绍)

目录 显示器简介 液晶显示器 液晶 像素 液晶屏缺点 LED显示器 OLED显示器 显示器的基本参数 STM32板载液晶控制原理&#xff08;不带微控制器&#xff09; 液晶控制原理 控制信号线(不带液晶控制器) 液晶数据传输时序 显存 总结 3.2寸液晶屏介绍&#xff08;搭载…

IIS Express本地开发测试如何映射到外网访问?

1.IIS Express是什么 IIS Express是为开发人员优化的轻量级、自包含版本的IIS。它具有IIS 7及以上的所有核心功能&#xff0c;以及为简化网站开发而设计的附加功能。 IIS Express&#xff08;跟ASP.NET开发服务器一样&#xff09;可以快速地从硬盘上的某个文件夹上启动网站…

SylixOS下SSH和SFTP连接

简要 基于网络的连接&#xff08;telnet&#xff0c;ftp&#xff09;方便高效&#xff0c;但其是基于明文的通信&#xff0c;容易被窃取、篡改和攻击&#xff0c;存在网络安全问题&#xff0c;尤其在进行远程访问时&#xff0c;穿过复杂未知的公网环境非常危险&#xff0c;为此…

中信银行西安分行举办金融助力外贸企业“走出去“高端论坛

7月14日&#xff0c;中信银行西安分行联合中国出口信用保险公司陕西分公司、西安市工商联举办"智汇西安、信融全球"——金融助力外贸企业"走出去"高端论坛。该论坛紧跟“加快建设贸易强国”的战略指引&#xff0c;以创新金融服务助力外贸企业融入高水平对外…

C++-----vector

本期我们来学习C中的vector&#xff0c;因为有string的基础&#xff0c;所以我们会讲解的快一点 目录 vector介绍 vector常用接口 构造函数 sort 迭代器 size&#xff0c;max_size&#xff0c;capacity&#xff0c;empty reserve和resize front和back data insert和…

解决appium-doctor报opencv4nodejs cannot be found

一、下载cmake 在CMake官网下载&#xff1a;cmake-3.6.1-win64-x64.msi 二、安装cmake cmake安装过程 在安装时要选择勾选为所有用户添加CMake环境变量 三、检查cmake安装 重新管理员打开dos系统cmd命令提示符&#xff0c;输入cmake -version cmake -version四、安装opencv4no…

pycharm里debug时torch数组显示不全

pycharm里查看torch数组全部值 一、在Pycharm运行torch数组时&#xff0c;通常只能看到数组的一部分二、解决办法1、debug后&#xff0c;鼠标右键想要查看完整的数组&#xff0c;选择Evaluate Expression2、输入np.array(x0.data)&#xff0c;x0为想要查看的数组名&#xff0c;…

畅游NLP海洋:HuggingFace的快速入门

目录 前言一、HuggingFace介绍1-1、HuggingFace的介绍1-2、安装 二、Tokenizer分词库&#xff1a;分词工具2-0、加载BertTokenizer&#xff1a;需要传入预训练模型的名字2-1、使用Tokenizer对句子编码&#xff1a;2-2、使用增强Tokenizer对句子编码&#xff1a;2-3、批量编码单…

Apache Kudu 在**医疗科技的生产实践

目录 说明 医疗场景下数据特点 KUDU 的介绍 kudu 架构 kudu 文件组织形式 kudu的生产实践 技术选型 整体的架构 项目遇到的问题 参考资料 说明 本文主要介绍APACHE KUDU 在**医疗科技数据实时分析场景下的实践&#xff0c;内容包括&#xff1a; 医疗场景下数据特点 …

LCD—STM32液晶显示(4.液晶控制代码讲解)

目录 STM32液晶控制代码讲解 液晶接口封装介绍 使用LCD的配置步骤 内存操作要使用volatile进行修饰 图形绘制实现 绘制矩形 重点补充 STM32液晶控制代码讲解 液晶接口封装介绍 指南者液晶接口原理图 左边DB00—DB15表示液晶屏的数据线引脚&#xff0c;分别对应STM32的F…

【无线通信模块】什么是PCB板载天线,PCB板载天线UART/USB接口WiFi模块

基于射频技术的无线模块需要通过天线来发射和接收电磁波信号&#xff0c;市场上常见的天线类型有陶瓷天线、板载天线、棒状天线以及外接天线&#xff0c;外接天线是通过在PCB板上预留IPEX座子&#xff0c;可选天线类型就比较多。本篇SKYLAB小编带大家了解一下板载天线的UART接口…

Ubuntu 考虑采用新的 “统一默认安装 (unified default install)”

导读Ubuntu安装程序中的 “最小化安装” (Minimal installation) 是该发行版多年来最受欢迎的功能之一。 当用户选择 Ubuntu 的 “最小化安装” 选项时&#xff0c;可以在安装更少的预装应用程序情况下&#xff0c;获得完整、功能齐全的 Ubuntu 系统。 但这个功能可能要被砍掉…

MVVM 实现记录文本

1. MVVM 框架说明: Model - 数据层 View - 视图层 ViewModel - 管理模型的视图 2. 资源文件 2.1 启动图标: AppIconhttps://img-blog.csdnimg.cn/8fa1031489f544ef9757b6b3ab0eddbe.png 2.2 Display Name: Do Stuff 2.2 颜色图: 2.3 项目结构图: 3. Model 层实现&a…