JavaEE进阶第四课:Bean 作用域和生命周期

news2024/10/6 8:32:48

上篇文章介绍了Spring更简单的对象存储和取出,这篇文章我们将会介绍Bean 作用域和生命周期

目录

  • 1.作用域
    • 1.1引例
    • 1.2Bean的六种作用域
    • 1.3设置作用域
  • 2.生命周期
    • 2.1Spring 执行流程
    • 2.2Bean的生命周期
  • 结束语

1.作用域

1.1引例

首先这里的作用域和我们之前java学到变量的作用域可能有点不一样。我们之前学习的变量作用域指的是该变量的可使用范围,比如:

{
	{
		int a=0;
	}//2
}//1

a变量只在括号2中生效。但是Bean的作用域指的是:

  • Bean在Spring框架(项目)里面的某种行为模式

具体什么意思呢,我们先看例子:

有一个公共的Bean供A和B两个类使用,假设这个Bean里面有个属性为value=ikun,A第一次使用时拿到value=ikun,待B使用时他偷偷改成了value=只因,A下一次使用时就拿到了value=只因,但是预期value=ikun啊,从而导致了程序出现错误。
说好一起当ikun,你却偷偷开了团

用代码怎么演示呢?

@Controller
@Data
public class Ikun {
    private String name="ikun";
}

@Controller
public class A {
    @Autowired
    private Ikun ikun;
    public void show(){
        System.out.println(ikun.getName());//我是ikun
    }
}

@Controller
public class B {
    @Autowired
    private Ikun ikun;
    public void show(){
        ikun.setName("只因");//偷偷开团
    }
}

public class App {
    public static void main(String[] args) {
        ApplicationContext context=
                new ClassPathXmlApplicationContext("spring-config.xml");
        A a=context.getBean("a",A.class);
        System.out.println("A第一次使用Ikun:");
        a.show();
        B b=context.getBean("b",B.class);
        System.out.println("B偷偷开团,修改Ikun");
        b.show();
        System.out.println("A第二次使用Ikun:");
        a.show();
    }
}

注意:这里使用了@Data注解,属于lombok插件,可以帮我们处理set,get等等方法,喜欢可以去了解以下

运行得到结果:
在这里插入图片描述
首先怎么处理这样的问题呢?我们需要先知道原因。
原因是Bean默认的作用域是单例状态,也就是所有类用的都是同一个对象。可能会有人问,为什么默认是单例模式呢?因为对于单例模式(以前学过懒汉,饿汉等等),我们知道可以提高代码的性能。那怎么修改Bean的模式呢?修改之前,我们要先知道有哪些模式。

1.2Bean的六种作用域

  1. singleton:单例作⽤域
  2. prototype:原型作⽤域(多例作⽤域)
  3. request:请求作⽤域
  4. session:回话作⽤域
  5. application:全局作⽤域
  6. websocket:HTTP WebSocket 作⽤域

后四种都属于SpringMVC里面的值,普通的Spring只有前两种,本文只说前两种。
第一种已经说明,着重解释第二种

prototype:原型作⽤域(多例作⽤域)
这个与单例作用域恰恰相反,每一次装配(即@AutoWired)都是新的对象实例,也就是一个类修改Bean不会影响另一个类的Bean。
那怎么修改上面例子的Bean为该模式呢?

1.3设置作用域

使用@Scope 标签就可以⽤来声明 Bean 的作⽤域
为Ikun类添加注解

//或者 @Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
@Scope("prototype")
@Controller
@Data
public class Ikun {
    private String name="ikun";
}

得到结果:
在这里插入图片描述
很明显,开团失败了

小结:
@Scope 标签既可以修饰⽅法也可以修饰类(上面就是修饰类)
@Scope 有两种设置⽅式:

  1. 直接设置值:@Scope(“prototype”)//适合记得住单词
  2. 使⽤枚举设置:@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)//idea会有提示,更方便

2.生命周期

解释生命周期之前,必须要先了解Spring的执行流程

2.1Spring 执行流程

这个我JavaEE第二课就介绍过,这里我直接给出流程:

Bean 执行流程(Spring 执行流程):启动 Spring 容器 -> 实例化 Bean(读取配置文件,分配内存空间,初始化) -> Bean 注册到 Spring 中(存操作) -> 将 Bean 装配到需要的类中(取操作)

这里可能会出一道面试题:
在这里插入图片描述

2.2Bean的生命周期

生命周期指的是有个对象从诞生到销毁的整个生命过程,Bean的生命周期注意分为以下五部分:

  1. 实例化Bean(为Bean分配内存空间)ex:拿到毛坯房
  2. 设置属性(Bean注入和装配)ex:购买装修材料
  3. 进行初始化工作
    实现了各种 Aware 通知的方法,如 BeanNameAware、BeanFactoryAware、
    ApplicationContextAware 的接口方法;ex:通知装修工人
    执行 BeanPostProcessor 初始化前置方法;ex:工人制定装修方案
    执行 @PostConstruct 初始化方法,依赖注入操作之后被执行;
    执行自己指定的 init-method 方法(如果有指定的话);ex:开始装修
    执行 BeanPostProcessor 初始化后置方法;ex:处理装修后现场
  4. 使用Bean ex:住房
  5. 销毁Bean ex:拆迁,房子被击碎

个人而言,对于第二点设置属性(Bean注入和装配)如果有疑问的。看以下代码便知:

@Controller
public class B {
    @Autowired //这一步就是设置属性
    private Ikun ikun;
    public void show(){
        ikun.setName("只因");//偷偷开团
    }
}

看到这里我们可以思考一个问题:

上面五个部分中,2和3能不能颠倒顺序?
显然是不能的,因为可能第三步中会用到第二步的设置好的属性Bean,如果颠倒就会导致出现空指针异常,因为Bean还没有注入和装配。

结束语

那么今天的第四课就到这里,下节课会进入SpringBoot的学习,喜欢的话还请多多为我投票吧(doge)

在这里插入图片描述

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

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

相关文章

2023-02-09 - 3 Java客户端的使用

1 Java客户端的使用 为了演示RestHighLevelClient的使用&#xff0c;需要创建一个Spring Boot Web项目。该项目的依赖配置如下&#xff1a; <dependencies> <!--Spring Boot Web依赖--> <dependency> <groupId>org.springframework.boot</gro…

tcp的理解

1、源端口号&#xff1a;发送方端口号2、目的端口号&#xff1a;接收方端口号3、序列号&#xff1a;报文段的数据的第一个字节的序号3、确认序号&#xff1a;期望收到对方下一个报文段的第一个数据字节的序号4、首部长度(数据偏移)&#xff1a;TCP报文段的数据起始距离TCP报文段…

List、ArrayList与顺序表的介绍(数据结构系列3)

目录 前言&#xff1a; 1.List 1.1什么是List 1.2List的使用 2.ArrayList 2.1线性表 2.2ArrayList的方法 2.3ArrayList的模拟实现 2.4ArrayList的使用 2.5ArrayList的三种遍历方式 2.5.1for循环遍历 2.5.2for-each遍历 2.5.3使用迭代器遍历 结束语&#xff1a; 前…

分享88个JS焦点图代码,总有一款适合您

分享88个JS焦点图代码&#xff0c;总有一款适合您 88个JS焦点图代码下载链接&#xff1a;https://pan.baidu.com/s/1zfspX9OSsbAlL53fjiSCEw?pwdulz6 提取码&#xff1a;ulz6 Python采集代码下载链接&#xff1a;https://wwgn.lanzoul.com/iKGwb0kye3wj base_url "…

XGBoost

目录 1.XGBoost推导示意图 2.分裂节点算法 Weighted Quantile Sketch 3.对缺失值得处理 1.XGBoost推导示意图 XGBoost有两个很不错得典型算法&#xff0c;分别是用来进行分裂节点选择和缺失值处理 2.分裂节点算法 Weighted Quantile Sketch 对于特征切点点得选择&#xff…

怎么不让消息弹出?录屏弹窗怎么关

当我们对电脑屏幕进行录制时&#xff0c;时不时跳出的消息窗口和广告会影响我们录制的效果。怎样不让消息弹出&#xff1f;如何关闭录屏弹窗&#xff1f;使用“锁定窗口录制”模式&#xff0c;就能很好地解决这个问题。那有没有拥有“锁定窗口”录制模式的录屏工具&#xff1f;…

synchronized 关键字-监视器锁 monitor lock

1.代码示例&#xff1a; package thread3;import java.util.Scanner;public class Test2 {public static Object object new Object();public static void main(String[] args) throws InterruptedException {Thread thread1 new Thread(() -> {Scanner scanner new Sca…

盂县基本情况

寒假的活动报告&#xff0c;万物皆可CSDN&#xff0c;贴一下吧 盂县隶属于阳泉市&#xff0c;阳泉市是李彦宏和刘慈欣的家乡&#xff0c;阳泉市内有百度云计算中心 基本情况 盂县&#xff0c;隶属山西省阳泉市&#xff0c;地处山西省东部、太行山西麓&#xff0c;东与河北省平…

测试开发面经

操作系统 进程与线程 进程间通信方式 进程间的六种通信方式 管道消息队列共享内存信号量信号套接字 socket长连接和短连接 长连接与短连接的概念&#xff1a;前者是整个通讯过程&#xff0c;客户端和服务端只用一个Socket对象&#xff0c;长期保持Socket的连接&#xff1b…

Windows/VM虚拟机安装黑群晖6.1-----保证有效而且简单操作

1视频&#xff1a;Windows/VM虚拟机安装黑群晖教程_哔哩哔哩_bilibili2:网址&#xff1a;Synology Web Assistant3&#xff1a;重新打开群晖操作步骤1&#xff1a;按着视频下载好资源后&#xff0c;按照视频操作&#xff0c;途中修改地方&#xff08;两个情况选择其中一个&…

Docker系列(镜像原理)03

前言 镜像就是图中的集装箱&#xff0c;仓库就是超级码头&#xff0c;容器就是我们运行程序的地方。 从联合文件系统说起 Union文件系统(UnionFS )是一种分层、轻量级并且高性能的文件系统。它支持对文件系统的修改作为一次提交来一层层的叠加&#xff0c;同时可以将不同目录…

【游戏逆向】】游戏全屏捡物的分析实现

前言 在角色对战类中&#xff0c;拾取怪物掉落的装备是一项必备的工作&#xff0c;由于装备位置掉落的不确定性&#xff0c;玩家想要拾取离角色距离较远的装备需要一定的时间&#xff0c;这一段时间往往会影响游戏的评分或是玩家的心态&#xff0c;基于此&#xff0c;全屏捡物…

【Unity VR开发】结合VRTK4.0:键盘操作运动与旋转

前言&#xff1a; 当我们的手柄无发进行VR测试&#xff0c;或者想通过键盘进行验证&#xff0c;那么就用到了我们今天的一个功能&#xff1a;组合操作。组合操作允许更复杂的输入类型&#xff0c;我们将介绍如何使用布尔输入&#xff08;如键盘键&#xff09;来模拟模拟轴&…

Java中LinkedList增删改比ArrayList快吗?

在 Java 中&#xff0c;LinkedList 和 ArrayList 的性能是不同的&#xff0c;具体取决于你所需要的操作。 对于频繁的插入和删除操作&#xff0c;LinkedList 的性能通常更好&#xff0c;因为它使用了链表数据结构&#xff0c;只需更改节点的指针就可以在链表中插入或删除元素。…

剑指Offer 第26天 表示数值的字符串 Hard

表示数值的字符串_牛客题霸_牛客网 描述 请实现一个函数用来判断字符串str是否表示数值&#xff08;包括科学计数法的数字&#xff0c;小数和整数&#xff09;。 科学计数法的数字(按顺序&#xff09;可以分成以下几个部分: 1.若干空格 2.一个整数或者小数 3.&#xff08;可选&…

计算机组成原理第七章笔记记录

仅仅作为笔记记录,B站视频链接&#xff0c;若有错误请指出&#xff0c;谢谢 基本概念 演变过程 I/O系统基本组成 I/O软件 包括驱动程序、用户程序、管理程序、升级补丁等 下面的两种方式是用来实现CPU和I/O设备的信息交换的 I/O指令 CPU指令的一部分,由操作码,命令码,设备…

前端 基于 vue-simple-uploader 实现大文件断点续传和分片上传

文章目录一、前言二、后端部分新建Maven 项目后端pom.xml配置文件 application.ymlHttpStatus.javaAjaxResult.javaCommonConstant.javaWebConfig.javaCheckChunkVO.javaBackChunk.javaBackFileList.javaBackChunkMapper.javaBackFileListMapper.javaBackFileListMapper.xmlBac…

2023年rabbitMq面试题汇总4(7道)

一、如何保证消息的顺序性&#xff1f;1. 通过某种算法&#xff0c;将需要保持先后顺序的消息放到同⼀个消息队列中(kafka中就是partition,rabbitMq中就是queue)。然后只⽤⼀个消费者去消费该队列。2. 可以在消息体内添加全局有序标识来实现。二、使⽤RabbitMQ增加rest服务吞吐…

JVM调优几款好用的内存分析工具

对于高并发访问量的电商、物联网、金融、社交等系统来说&#xff0c;JVM内存优化是非常有必要的&#xff0c;可以提高系统的吞吐量和性能。通常调优的首选方式是减少FGC次数或者FGC时间&#xff0c;以避免系统过多地暂停。FGC达到理想值后&#xff0c;比如一天或者两天触发一次…

【Android -- 每日一问】现在 Android 怎么学?学什么?

不管在任何行业&#xff0c;任何岗位&#xff0c;初级技术人才总是供大于求&#xff1b;不管任何行业、岗位&#xff0c;技术过硬的也都是非常吃香的&#xff01; 这几年 Android 新技术的迭代明显加速了&#xff0c;有来自外部跨平台新物种的冲击&#xff0c;有去 Java 化的商…