Spring框架(四)Spring的Bean作用域和生命周期

2023-11-04

一,作用域定义

限定程序中变量的可用范围叫做作用域,而 Bean 的作用域是指 Bean 在 Spring 整个框架中的某种行为模式,比如 singleton 单例作用域,就表示 Bean 在整个 Spring 中只有⼀份,它是全局共享的,那么当其他⼈修改了这个值之后,那么另⼀个⼈读取到的就是被修改的值

二,同⼀类型多个 @Bean 报错的解决办法

  • 方法1:使用正确的bean name 获取
  • 方法2:使用@Resource设置name属性
// 注⼊
@Resource(name = "user1")
private User user;
  • 方法3:使用@Autowired+@Qualifier
// 注⼊
@Autowired
@Qualifier(value = "user2")
private User user;

三,Bean的6种作用域

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

1.singleton:单例作用域

  • 描述:该作用域下的Bean在IoC容器中只存在⼀个实例:获取Bean(即通过
    applicationContext.getBean等方法获取)及装配Bean(即通过@Autowired注入)都是同⼀
    个对象。
  • 场景:通常无状态的Bean使用该作用域,无状态表示Bean对象的属性状态不需要更新
  • 备注:Spring默认选择该作用域

2.prototype:原型作用域(多例作用域)

  • 描述:每次对该作⽤域下的Bean的请求都会创建新的实例:获取Bean(即通过
  • applicationContext.getBean等⽅法获取)及装配Bean(即通过@Autowired注⼊)都是新的
    对象实例。
  • 场景:通常有状态的Bean使⽤该作⽤

3.request:请求作用域

  • 描述:每次http请求会创建新的Bean实例,类似于prototype
  • 场景:⼀次http的请求和响应的共享Bean
    备注:限定SpringMVC中使⽤

4.session:回话作用域

  • 描述:在⼀个http session中,定义⼀个Bean实例
  • 场景:⽤户回话的共享Bean, ⽐如:记录⼀个⽤户的登陆信息
  • 备注:限定SpringMVC中使⽤

5.application:全局作用域

  • 描述:在⼀个http servlet Context中,定义⼀个Bean实例
  • 场景:Web应⽤的上下⽂信息,⽐如:记录⼀个应⽤的共享信息
  • 备注:限定SpringMVC中使⽤

6.websocket:HTTP WebSocket 作用域

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

7,单例作用域(singleton)和全局作用域(application)区别

  • singleton 是 Spring Core 的作用域;application 是 Spring Web 中的作用域;
  • singleton 作用于 IoC 的容器,而application 作用于 Servlet 容器

四,Spring框架中的单例bean是线程安全的吗

  • 不是,Spring框架中的单例bean不是线程安全的
  • spring 中的 bean 默认是单例模式,spring 框架并没有对单例 bean 进行多线程的封装处理。
    实际上大部分时候 spring bean 无状态的(比如 dao 类),所以某种程度上来说 bean 也是安全的,但如果 bean 有状态的话(比如 view model 对象),那就要开发者自己去保证线程安全了,最简单的就是改变 bean 的作用域,把“singleton”变更为“prototype”,这样请求 bean 相当于 new Bean()了,所以就可以保证线程安全了。
    ①有状态就是有数据存储功能。
    ②无状态就是不会保存数据。

五,Spring如何处理线程并发问题

  • 在一般情况下,只有无状态的Bean才可以在多线程环境下共享,在Spring中,绝大部分Bean都可以声明为singleton作用域,因为Spring对一些Bean中非线程安全状态采用ThreadLocal进行处理,解决线程安全问题
  • ThreadLocal和线程同步机制都是为了解决多线程中相同变量的访问冲突问题。同步机制采用了“时间换空间”的方式,仅提供一份变量,不同的线程在访问前需要获取锁,没获得锁的线程则需要排队。而ThreadLocal采用了“空间换时间”的方式
  • ThreadLocal会为每一个线程提供一个独立的变量副本,从而隔离了多个线程对数据的访问冲突。因为每一个线程都拥有自己的变量副本,从而也就没有必要对该变量进行同步了。ThreadLocal提供了线程安全的共享对象,在编写多线程代码时,可以把不安全的变量封装进ThreadLocal

六,Spring框架中bean的生命周期

  • Bean 执行流程(Spring 执行流程):启动 Spring 容器 -> 实例化 Bean(分配内存空间,从⽆到有)-> Bean 注册到 Spring 中(存操作) -> 将 Bean 装配到需要的类中(取操作)
  • Bean的生命周期:
    1.实例化 Bean(为 Bean 分配内存空间)
    2.设置属性(Bean 注⼊和装配)
    3.Bean 初始化
    实现了各种 Aware 通知的⽅法,如 BeanNameAware、BeanFactoryAware、
    ApplicationContextAware 的接⼝⽅法;
    执⾏ BeanPostProcessor 初始化前置⽅法;
    执⾏ @PostConstruct 初始化⽅法,依赖注⼊操作之后被执⾏;
    执⾏⾃⼰指定的 init-method ⽅法(如果有指定的话);
    执⾏ BeanPostProcessor 初始化后置⽅法。
    4.使用Bean
    5.销毁 Bean
    销毁容器的各种⽅法,如 @PreDestroy、DisposableBean 接⼝⽅法、destroy-method
  • 具体实例:
    ean 的⽣命流程看似繁琐,但咱们可以以⽣活中的场景来理解它,⽐如我们现在需要买⼀栋房⼦,那
    么我们的流程是这样的:
    1.先买房(实例化,从⽆到有);
    2.装修(设置属性);
    3.买家电,如洗⾐机、冰箱、电视、空调等([各种]初始化);
    4.⼊住(使⽤ Bean);
    5.卖出去(Bean 销毁)

七,Bean生命周期演示

import org.springframework.beans.factory.BeanNameAware;
        import org.springframework.stereotype.Component;
        import javax.annotation.PostConstruct;
        import javax.annotation.PreDestroy;
@Component
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()");
    }
    public void setBeanName(String s) {
        System.out.println("执⾏了 setBeanName ⽅法:" + s);
    }
}

实例化和初始化的区别:
实例化和属性设置是 Java 级别的系统“事件”,其操作过程不可⼈工预和修改;而初始化是给开发者提供的,可以在实例化之后,类加载完成之前进行自定义“事件”处理

八,哪些是重要的bean生命周期方法? 你能重载它们吗

  • 有两个重要的bean 生命周期方法,第一个是setup , 它是在容器加载bean的时候被调用。第二个方法是 teardown 它是在容器卸载类的时候被调用。
  • bean 标签有两个重要的属性(init-method和destroy-method)。用它们你可以自己定制初始化和注销方法。它们也有相应的注解(@PostConstruct和@PreDestroy)
    扩展【什么是Spring的内部bean?什么是Spring inner beans】
    在Spring框架中,当一个bean仅被用作另一个bean的属性时,它能被声明为一个内部bean。内部bean可以用setter注入“属性”和构造方法注入“构造参数”的方式来实现,内部bean通常是匿名的,它们的Scope一般是prototype

九,在 Spring中如何注入一个java集合

Spring提供以下几种集合的配置元素:

  • 类型用于注入一列值,允许有相同的值。

  • 类型用于注入一组值,不允许有相同的值。

  • 类型用于注入一组键值对,键和值都可以为任意类型。

  • 类型用于注入一组键值对,键和值都只能为String类型。

十,使用@Autowired注解自动装配的过程是怎样的

使用@Autowired注解来自动装配指定的bean。在使用@Autowired注解之前需要在Spring配置文件进行配置,<context:annotation-config />。
在启动spring IoC时,容器自动装载了一个AutowiredAnnotationBeanPostProcessor后置处理器,当容器扫描到@Autowied、@Resource或@Inject时,就会在IoC容器自动查找需要的bean,并装配给该对象的属性。在使用@Autowired时,首先在容器中查询对应类型的bean:

  • 如果查询结果刚好为一个,就将该bean装配给@Autowired指定的数据;
  • 如果查询的结果不止一个,那么@Autowired会根据名称来查找;
  • 如果上述查找的结果为空,那么会抛出异常。解决方法时,使用required=false。

扩展 【自动装配有哪些局限性】
重写:你仍需用 和 配置来定义依赖,意味着总要重写自动装配。
基本数据类型:你不能自动装配简单的属性,如基本数据类型,String字符串,和类。
模糊特性:自动装配不如显式装配精确,如果有可能,建议使用显式装配。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Spring框架(四)Spring的Bean作用域和生命周期 的相关文章

随机推荐

  • 压电阀控制器设计—思考总结篇

    此篇主要是总结一下这一年左右时间设计的压电阀控制器心得 以及未来压电阀发展趋势的讨论 控制设计心得 最初接手设计压电阀工作作为硕士的毕业课题 也很紧张忐忑 因为之前基本没怎么接触这个领域 掌握的设计资源也基本为无 所以基本是一个从零开始的造
  • Flutter 图片加载

    内容简介 Flutter图片加载方式 网络图片加载源码流程跟踪 特别提到的优化点 本篇文章你将获得 1 Flutter 图片加载方式 2 Flutter 图片加载源码实现流程 3 Flutter 图片加载优化点有什么 Flutter Ima
  • xmanager - xstart - The X11 forwarding request was rejected

    安装xmanager 启动xstart的时候报错 The X11 forwarding request was rejected 查询了下 ssh的设置参数都正常 再次重装了下桌面环境 就恢复了 解决办法 在linux 机器上执行语句 yu
  • eclipse开发运行C++程序(新手入门详细教程)

    eclipse有好几种IDE 先说两种 一种是eclipse IDE for java 一种是eclipse IDE for c eclipse IDE for java下载地址 https www eclipse org download
  • 安装mlxtend_利用mlxtend进行数据关联分析

    guan 大数据挖掘最深入人心的一个故事应该是 啤酒与尿布 这个规律就是用关联分析发现的 今天我们就来点关联分析 刚刚学到的 现学现分享 下面假设是某超市的交易记录 我编造的 基本概念 我们在关联分析之前先了解几个基本概念 找出频繁一起出现
  • 【洛谷 P1328】[NOIP2014 提高组] 生活大爆炸版石头剪刀布 题解(模拟+向量)

    NOIP2014 提高组 生活大爆炸版石头剪刀布 题目描述 石头剪刀布是常见的猜拳游戏 石头胜剪刀 剪刀胜布 布胜石头 如果两个人出拳一样 则不分胜负 在 生活大爆炸 第二季第 8 集中出现了一种石头剪刀布的升级版游戏 升级版游戏在传统的石
  • [Flex]在TextArea中嵌入圖像

    TextArea的htmlText支持多種html標簽 如 a b br font img 等 這裏使用 img 標簽來將圖片嵌入到TextArea中 img 標簽可用于嵌入JPEG GIF PNG及SWF等媒體文件到文本框中 文本會自動分
  • pads更新原理图后,pcb文件出现* Part nameXXX not found解决方法

    方法 MAX Layers
  • 思科 BroadWorks 受严重的认证绕过漏洞影响

    聚焦源代码安全 网罗国内外最新资讯 编译 代码卫士 思科BroadWorks Application Delivery Plaftform 和BroadWorks Xtended Services Platform 受一个严重漏洞 CVE
  • Anacoda3中成功配置Tesseract-OCR实现OCR文字识别超详细教程!!(win7、win10)

    Anacoda3中成功配置Tesseract OCR Tesseract OCR简介 安装及配置环境步骤 1 在Anaconda虚拟环境中安装pytesseract第三方库 2 下载tesseract ocr安装包并安装 3 环境配置 检验
  • 图像知识 太经典 膜拜

    图像知识 图形图像 图形设备和系统 图形文件的显示 图形文件的格式 WINDOWS编程基础 WINDOWS图像编程 动画技术 三维世界 图形图像 传统的电脑只能处理文字 数字 最多是简单的图形 近年来 随着电脑硬件技术的飞速发展和更新 使得
  • 三冲IPO的思派健康如何承载腾讯的互联网医疗梦?

    腾讯在互联网医疗领域的 大将 思派健康10月27日向港交所主板递交第三次上市申请 在2021年8月6日和2022年2月25日两次 折戟 港交所后 此次能否如愿以偿仍未可知 我国当前正步入老龄化社会 慢性病人口增加 市场对医疗健康方面的需求不
  • 十秒带你了解python程序结构

    提示 文章写完后 目录可以自动生成 如何生成可参考右边的帮助文档 文章目录 前言 一 pandas是什么 二 使用步骤 1 引入库 2 读入数据 总结 前言 Python中有三种程序结构 顺序结构 分支结构 循环结构 1 顺序结构 pyth
  • 【分布式】红包秒杀系统、高并发安全分布式锁

    分布式 内容管理 业务Intro 业务模块划分 数据库表设计 开发流程 红包金额随机生成算法 Monte Carlo 方法 发红包模块 EnableAsync 多线程异步 抢红包模块 并发测试 Jmeter压力测试高并发下抢红包 并发安全问
  • python之面向对象编程

    最近阅读到了一篇关于面向对象编程和面向过程编程解释说明的文章 觉得写的通俗易懂 文章链接如下 漫画 如何通俗易懂地解释面向对象思想 但是该文章举的例子是用Java 故在此我按照我的理解 针对python 梳理一下面向对象编程 一 面向对象编
  • 微信小程序image组件的使用

    image属性说明 属性 类型 默认值 必填 说明 src string 否 图片资源地址 mode string scaleToFill 否 图片裁剪 缩放的模式 webp string false 否 默认不解析 webP 格式 只支持
  • java 生成excel下载_java生成excel并下载功能

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 HttpServletRequest request ServletActionContext getRequest projectId long Integer parseInt reques
  • 奇安信和深信服哪个好_网络安全头部公司全面比较

    管理 网络安全头部公司全面比较 秋名山藤原 2019 06 10 08 47 发布 选取的样本包括启明星辰 绿盟科技 奇安信 天融信 深信服 本人很看好的公司安恒信息还在静默期 就不写了 后面上市了再统一到一个表里面 关于下表有几点说明 基
  • 微电网优化调度(风、光、储能、柴油机)(Python代码实现)

    欢迎来到本博客 博主优势 博客内容尽量做到思维缜密 逻辑清晰 为了方便读者 座右铭 行百里者 半于九十 目录 1 概述 2 运行结果 3 参考文献 4 Python代码实现 详细文章 数据 文献来源 Python代码复现之 1 概述 电力对
  • Spring框架(四)Spring的Bean作用域和生命周期

    目录 一 作用域定义 二 同 类型多个 Bean 报错的解决办法 三 Bean的6种作用域 1 singleton 单例作用域 2 prototype 原型作用域 多例作用域 3 request 请求作用域 4 session 回话作用域