Spring(四):Bean作用域和生命周期

news2025/5/15 18:59:07

目录

  • 一、Bean作用域作用域
    • 1.1 Bean作用域简介
    • 1.2 作用域的定义
    • 1.3 Bean的6种作用域
    • 1.4 设置作用域
  • 二、Spring的执行流程和Bean的生命周期
    • 2.1 Spring的执行流程
    • 2.2 Bean的生命周期

一、Bean作用域作用域

1.1 Bean作用域简介

现在有一个公共的Bean,A用户先使用到这个Bean,并在使用后将Bean修改了,这就是B用户拿到的Bean是A修改后的Bean了,而B期望拿到的确实最原始的Bean

公共的Bean:User对象

@Component
public class UserBeans {
    @Bean
    public  User user(){
        User user=new User();
        user.setName("zhangsan");
        user.setId(100);
        return  user;
    }
}

A用户使用后将name修改成lisi了:

@Controller
@Controller
public class UserControllerA {

    @Autowired
    private  User user;

    public  User getUser(){
        User tmp=user;
        System.out.println("A用户修改之前的User.name:"+user.getName());
        tmp.setName("lisi");
        return tmp;
    }
}

B用户使用Bean:


@Controller
public class UserControllerB {

    @Autowired
    private  User user;

    public  User getUser(){
        return user;
    }
}

App类打印:
在这里插入图片描述
【原因分析】

产生上述情况的原因在于Bean默认情况下是单例状态,也就是所有人使用的都是同一个对象,之所以默认为单例状态是因为性能更高

1.2 作用域的定义

Bean的作用域是指Bean在Spring整个框架中的某种行为模式,比如singleton单例作用域,就表示Bean在整个Spring中只有一份,它是全局共享的,那么当其他人修改了这个值后,别人获取到的就是修改后的值了

1.3 Bean的6种作用域

Spring容器在初始化一个Bean的实例时,同时会指定该实例的作用域。Spring中有6种作用域,后4种基于Spring MVC生效:

  1. singleton 单例作用域
  2. prototype 原型作用域
  3. request 请求作用域
  4. session 会话作用域
  5. application 全局作用域
  6. websocket HTTPWebSokcet作用域

【singleton】
描述:在该作用域下的Bean在IoC容器中只存在一个实例:获取Bean及装配Bean都是同一个对象
使用场景:通常无状态的Bean使用该作用域。无状态表示Bean对象的属性状态不需要更新
Spring默认作用域为singleton

【prototype】
描述:每次都过application.getBean方法或通过注解注入Bean时,通过会创建新的实例,得到的都是新创建的对象
使用场景:通常又状态的Bean使用该作用域
【request】
描述:每次http请求都会创建新的Bean实例
使用场景:一次http请求和响应的共享Bean

【session】
描述:在一个http session中,定义一个Bean实例
使用场景:用户会话的共享Bean

【application】
描述:在⼀个http servlet Context中,定义⼀个Bean实例
使用场景:Web应⽤的上下⽂信息,⽐如:记录⼀个应⽤的共享信息

【websocket】
描述:在⼀个HTTP WebSocket的生命周期中,定义⼀个Bean实例
使用场景:WebSocket的每次会话中,保存了⼀个Map结构的头信息,将用来包裹客户端消息头。第⼀次初始化后,直到WebSocket结束都是同⼀个Bean

【singleton和application的区别】

singleton是SpringCore的作用域,application是Spring Web的作用域
singleton作用于IoC容器,application作用于Servlet容器

1.4 设置作用域

使用@Scope标签生命Bean作用域

@Component
public class UserBeans {
    @Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
    @Bean
    public  User user(){
        User user=new User();
        user.setName("zhangsan");
        user.setId(100);
        return  user;
    }
}

App中的执行结果:
在这里插入图片描述
【补充】
Scope标签有两种设置方式:

  1. 直接设置值,@Scope(“prototype”)
  2. 使用枚举设置,@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)

二、Spring的执行流程和Bean的生命周期

2.1 Spring的执行流程

在这里插入图片描述

2.2 Bean的生命周期

Bean的生命周期分为下面5个部分:

  1. 实例化Bean(为Bean分配内存空间)
  2. 设置属性(Bean注入和装配)
  3. Bean初始化
  • 实现了各种Aware通知的方法,如BeanNameAware、BeanFactoryAware、ApplicationContextAware的接口方法
  • 执行@PostConstruct初始化方法,依赖注入操作之后执行
  • 执行自己指定的init-method方法
  1. 使用Bean
  2. 销毁Bean,销毁容器的各种⽅法,如 @PreDestroy、DisposableBean 接口方法、destroy-method。

执行流程如下图所示:

BeanLifeComponent类:

package com.bit;

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

import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;


public class BeanLifeComponent implements BeanNameAware {

    @PostConstruct
    public void postConstruct() {
        System.out.println("执⾏ PostConstruct()");
    }
    public void init() {
        System.out.println("执⾏ BeanLifeComponent init-method");
    }

    @PreDestroy
    public void preDestroy() {
        System.out.println("执⾏:preDestroy()");
    }
    @Override
    public void setBeanName(String s) { //BeanNameAware接口中的方法
        System.out.println("执行BeanName通知");
    }
}

spring.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="com.bit"></content:component-scan>

    <bean id="beanLifeComponent" class="com.bit.BeanLifeComponent" init-method="init"></bean>
</beans>

App启动类:
在这里插入图片描述
【注意】:设置属性一定要在初始化之前,如果步骤颠倒就可能出现空指针异常

@Service
public class UserService {
 public UserService(){
 System.out.println("调⽤ User Service 构造⽅法");
 }
 public void sayHi(){
 System.out.println("User Service SayHi.");
 }
}
@Controller
public class UserController {
 @Resource
 private UserService userService;
 @PostConstruct
 public void postConstruct() {
 userService.sayHi(); //在构造方法中使用到属性userService
 System.out.println("执⾏ User Controller 构造⽅法");
 }
}

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

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

相关文章

统计学中的Bootstrap方法(Bootstrap抽样)用来训练bagging算法,如果随机森林Random Forests

统计学中的Bootstrap方法&#xff08;Bootstrap抽样&#xff09;用来训练bagging算法&#xff0c;如果随机森林Random Forests 提示&#xff1a;系列被面试官问的问题&#xff0c;我自己当时不会&#xff0c;所以下来自己复盘一下&#xff0c;认真学习和总结&#xff0c;以应对…

Java与Python常见语法对比及区别

这里写目录标题一、前记1.1为什么写这篇文章&#xff1f;1.2 本文的结构二、整体区别2.1 差异总结十句话2.2整体对比三、细节区别3.1数据类型3.2其他数据结构3.3 String的处理方法3.4数组3.5条件语句3.6循环语句3.7类和接口定义与调用四 其他技巧知识字节的换算Tips&#xff1a…

flutter项目编译问题汇总

1、kotlin compiler embeddable下载慢的解决办法 备注&#xff1a;可以使用https://developer.aliyun.com/mvn/search这个链接搜索并下载 2、运行Flutter项目一直卡在--Running Gradle task assembleDebug 解决方法&#xff1a; 第一步&#xff1a;修改flutter安装目录/pac…

校招前端一面经典react面试题(附答案)

React.forwardRef是什么&#xff1f;它有什么作用&#xff1f; React.forwardRef 会创建一个React组件&#xff0c;这个组件能够将其接受的 ref 属性转发到其组件树下的另一个组件中。这种技术并不常见&#xff0c;但在以下两种场景中特别有用&#xff1a; 转发 refs 到 DOM …

多层次目录结构的CMake工程管理

多层次目录结构的CMake工程管理一、多层次目录结构的文件结构二、如何利用CMake组织多层次目录结构三、构建工程一、多层次目录结构的文件结构 我们编写程序&#xff0c;不可能把所有源文件都一股脑地放在顶层目录下&#xff0c;必然会有一个目录结构&#xff0c;每个目录中只…

【django】项目开发准备之数据库配置

文章目录一、docker中启动mariadb服务二、django配置文件中进行配置1.安装mysqlclient2.找到settings.py文件3.启动django程序一、docker中启动mariadb服务 --restartalways:自动启动容器 --name mydb&#xff1a;容器名称 -d&#xff1a;后台运行容器 -v /home/ubuntu/ck14/ma…

php宝塔搭建部署实战服务类家政钟点工保姆网站源码

大家好啊&#xff0c;我是测评君&#xff0c;欢迎来到web测评。 本期给大家带来一套php开发的服务类家政钟点工保姆网站源码&#xff0c;感兴趣的朋友可以自行下载学习。 技术架构 PHP7.2 nginx mysql5.7 JS CSS HTMLcnetos7以上 宝塔面板 文字搭建教程 下载源码&…

单机模拟搭建 Zookeeper 集群

1. 准备 官网下载&#xff1a;https://www.apache.org/dyn/closer.lua/zookeeper/zookeeper-3.6.3/apache-zookeeper-3.6.3-bin.tar.gz 注意&#xff1a; zookeeper 从 3.5 版本以后&#xff0c;命名就发生了改变apache-zookeeper-X.X.X.tar.gz 这样命名的&#xff0c;都是未…

并发编程之JMMvolatile详解

目录 什么是JMM模型 定义 JMM不同于JVM内存区域模型 主内存 工作内存 Java内存模型与硬件内存架构的关系 JMM存在的必要性 数据同步八大原子操作 同步规则分析 并发编程的可见性&#xff0c;原子性与有序性问题 原子性 可见性 有序性 JMM如何解决原子性&…

【单片机】AT24C02存储器(I²C总线)/DS18B20温度传感器(单总线)

目录 一、AT24C02存储器 1、AT24C02存储器介绍 2、存储器简化模型 3、AT24C02存储器原理图 二、IC总线 1、IC总线的介绍 2、IC电路 3、IC时序图 3.1IC开始和结束时序图 3.2IC主机发送和接收时序图 3.3IC主机发送应答/接收应答 4、IC数据帧发送/接收方式 4.1主机向…

数据可视化系列-02各类图表的综合使用介绍及实践-上篇

文章目录3.各类图表的综合使用介绍及实践3.1了解数据功能图1、可视化中的数据2、基于数据的研究3、数据的可视化组件4、可视化图表的作用、制作流程和类型3.2北极星指标展示1、指标类知识回顾&#xff1a;指标类简介、指标类主要场景2、指标类图表&#xff1a;指标看板、指标趋…

C++关联容器(复习题篇)

本篇博客将介绍标准库关联容器&#xff0c;包括&#xff1a; 关联容器的概念和简单的使用关联容器涉及的类型和操作&#xff0c;特别是与顺序容器的差异无序关联容器&#xff0c;特别是与有序关联容器的差异 练习1.1 描述map和vector的不同 vector是顺序容器其中的元素是“顺序…

分布式事务的介绍

本地事务 单服务进程&#xff0c;单数据库资源,同一个连接conn多个事务操作 在JDBC编程中&#xff0c;我们通过java.sql.Connection对象来开启、关闭或者提交事务。代码如下所示&#xff1a; Connection conn ... //获取数据库连接 conn.setAutoCommit(false); //开启事务 t…

educoder数据结构与算法 栈 第2关:实现一个链接存储的栈

本文已收录于专栏 &#x1f332;《educoder数据结构与算法_大耳朵宋宋的博客-CSDN博客》&#x1f332; 目录 任务描述 相关知识 编程要求 测试说明 AC_Code 任务描述 本关任务是实现 step2/LnkStack.cpp 中的LS_IsEmpty、LS_Length、LS_Push、LS_Pop和LS_Top五个操作函数…

π122E30兼容Si8622BC-B-IS 双通道数字隔离器

π122E30兼容Si8622BC-B-IS 双通道数字隔离器 &#xff0c;具有出色的性能特征和可靠性&#xff0c;整体性能优于光耦和基于其他原理的数字隔离器产品。 产品传输通道间彼此独立&#xff0c;可实现多种传输方向的配置&#xff0c;可实现 3.0kVrms 隔离耐压等级和 DC 到 200Mbp…

Day 17-Vue3 技术_其它

1.全局API的转移 Vue 2.x 有许多全局 API 和配置。例如&#xff1a;注册全局组件、注册全局指令等。 //注册全局组件 Vue.component(MyButton, {data: () > ({count: 0}),template: <button click"count">Clicked {{ count }} times.</button> })//注…

acwing-1015 摘花生

项目场景&#xff1a; 线性dp 题源 数字三角形 问题描述 Hello Kitty想摘点花生送给她喜欢的米老鼠。 她来到一片有网格状道路的矩形花生地(如下图)&#xff0c;从西北角进去&#xff0c;东南角出来。 地里每个道路的交叉点上都有种着一株花生苗&#xff0c;上面有若干颗花…

用Typora,PicGo和OSS实现自动上传图片

前言&#xff1a; 以前写博客要发布到好些个平台&#xff0c;我是将图片一张张上传到每个平台&#xff0c;后来发现是真的麻烦&#xff0c;上传图片花的时间太多&#xff0c;极大的降低了我写文章的积极性。 后来改进为使用oss&#xff0c;把博客的图片都上传到oss上面。然后…

JAVA : ArrayList和数组的转换

一、ArrayList转换为数组 ArrayList提供public T[] toArray(T[] a)方法返回一个按照正确的顺序包含此列表中所有元素的数组&#xff0c;返回数组的运行时类型就是指定数组的运行时类型。 import java.util.ArrayList; import java.util.List; public class Test { public st…

戴尔笔记本电脑重装系统后进不了系统怎么办

​戴尔电脑是一款很棒的电脑品牌&#xff0c;不少小伙伴都在使用这个牌子的电脑。但有不少小伙伴在重装完系统之后却进不去&#xff0c;那么碰到这种情况应该怎么办呢&#xff1f;下面就和小编一起来看看戴尔笔记本电脑重装系统后进不了系统怎么办的吧。 工具/原料&#xff1a…