Bean作用域和生产周期已经Bean的线程安全问题

bean 的作用域

  • 单例(Singletion) : Spring 容器中只有一个 bean ,这个 bean 在整个应用程序内共享。

  • 原话(Prototype) : 每次 getBean(), 都是不同的bean,都会创建一个实例。

  • 请求(Request):每个HTTP请求都会创建一个新的 Bean 实例。

  • 会话(Session) :每个用户会话会创建一个新的 Bean.

  • 应用程序(Application) : 每个应用程序会创建一个新的 Bean

  • 自定义作用域 @Scope(value = "目标的作用域" , proxyMode = ScopeProxyMode.TARGET.CLASS)

Bean 的生命周期

三分恶面渣逆袭:Bean生命周期四个阶段

对应的完整步骤:

三分恶面渣逆袭:Spring Bean生命周期

实例化

首先通过 createBeanInstanse 创建实例对象,这里使用反射机制利用 BeanClass 拿到类的构造方法,如果有多个构造方法,就拿有@Autowired 注解的构造方法,如果有两个有@Autowired 注解的构造方法,那么就会报错。

选择好构造方法后,就要确定参数,这里会在体内的单例池内进行查找,如果找到了,那么通过反射就可以开始实例化对象了。如果没有找到,那么会报错,信息不完整。

如果选择的是无参构造方法,那么直接构造。

属性填充

通过三级缓存进行依赖注入。

初始化

利用 initializeBean 方法进行初始化

具体步骤

  • 填充初始化容器相关信息

    通过 invokeAwareMethods 方法,为实现 aware 接口(信息感知接口)的Bean 注入 beanName,beanFactory 等容器信息。

  • 初始化构造方法 invokeInitMethods

    通过重写 InitializingBean 接口而实现 afterPropertiesSet 方法来实现的。afterPropertiesSet 写在填充属性后。如果自定义了 initMethod 方法,还会执行这些自定义构造方法。

  • Bean 的后置处理

    在 invokeInitMethods 前后进行

    • applyBeanPostProcessorsBeforeInitialization

    • invokeInitMethods

    • applyBeanPostProcessorsAfterInitialization

使用

将产生的对象放入单例池中。

销毁

在销毁前需要要执行销毁前处理器,这样就会执行 @PreDestroy注解的方法。

然后通过 destroyBeans 方法逐一摧毁体内所有 bean

然后还会执行用户自定义的销毁方法,但是需要手动指定。

单例 Bean 的线程安全问题

单例 Bean 是线程不安全的,如果只对 bean 执行查询的操作,不对bean 进行修改,那么这个单例 Bean 是线程安全的。

解决办法
  • 将单例 bean 定义为多例 Prototype,不方便管理。

  • 在 Bean 对象中,尽量避免定义可变的成员变量,但是这样会限制很多,所以不能这样做。

  • 利用 ThreadLocal,将 Bean 中的成员变量保存在 ThreadLocal 中。

    ThreadLocal 可以保证变量在多线程环境下,保证变量隔离。

    public class MyClass {private ThreadLocal<String> threadLocal = new ThreadLocal<>();
    ​public void setThreadLocal(String value) {threadLocal.set(value);}
    ​public String getThreadLocal() {return threadLocal.get();}
    }

    可以在类中定义一个 ThreadLocal 成员变量,将需要的可变成员变量保存在 ThreadLocal 里,这是推荐的一种方式。

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

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

相关文章

旧衣回收小程序带来的收益优势,小程序有哪些功能?

随着互联网的快速发展&#xff0c;大众对旧衣回收市场也越来越了解&#xff0c;对于闲置的旧衣物也有了适合的处理方式。旧衣回收也符合了当下资源回收利用&#xff0c;因此&#xff0c;旧衣回收市场获得了爆发式增长&#xff0c;市场规模不断扩大。同时市场中还吸引了越来越多…

【调试笔记-20240530-Linux-在 OpenWRT-23.05 上为 nginx 配置 HTTPS 网站】

调试笔记-系列文章目录 调试笔记-20240530-Linux-在 OpenWRT-23.05 上为 nginx 配置 HTTPS 网站 文章目录 调试笔记-系列文章目录调试笔记-20240530-Linux-在 OpenWRT-23.05 上为 nginx 配置 HTTPS 网站 前言一、调试环境操作系统&#xff1a;OpenWrt 23.05.3调试环境调试目标…

安全风险 - 组件导出风险

在安全审查中关于组件导出风险是一种常见问题&#xff0c;不同组件都有可能遇到这种问题&#xff0c;而且从一定角度来看的话&#xff0c;如果涉及到三方业务&#xff0c;基本处于无法解决的场景&#xff0c;所以我们需要说明为何无法避免这种风险 组件导出风险能不能规避&…

【智能AI相机】基于AI的新型成像和照明技术

缩短检测时间 降低废品率和成本 更快捕捉更多缺陷 ” Trevista CI Dome将康耐视专利的计算成像算法与结构化漫射圆顶照明相结合&#xff0c;提供无与伦比的地形图像质量&#xff0c;为光泽和哑光表面检测提供创新解决方案。有助于&#xff1a;缩短检测时间、降低废品率和成本…

北京仁爱堂李艳波主任如何预约挂号?

北京仁爱堂擅长治疗神经系统疾病&#xff0c;例如&#xff1a;痉挛性斜颈&#xff0c;特发性震颤&#xff0c;眼球震颤&#xff0c;帕金森&#xff0c;眼球震颤等。 北京仁爱堂国医馆是一所集治疗、 预防、保健、养生于一体的传统中医诊所&#xff0c;具有精湛技术和丰富经验的…

C#的web项目ASP.NET

添加实体类和控制器类 using System; using System.Collections.Generic; using System.Linq; using System.Web;namespace WebApplication1.Models {public class Company{public string companyCode { get; set; }public string companyName { get; set; }public string com…

Vue进阶之Vue无代码可视化项目(一)

Vue无代码可视化项目 项目搭建初始步骤拓展:工程项目从0-1项目规范化package.jsoncpell.jsoncustom-words.txtts-eslint规则.eslintrc.cjsgit钩子检查有没有问题type-checkspellchecklint:stylehusky操作安装pre-commitpnpm的commit规范package.json:commitlint.config.cjs安装…

跨站点脚本 (XSS) 攻击是什么

跨站点脚本 (XSS) 攻击是什么 跨站点脚本&#xff08;Cross-Site Scripting&#xff0c;简称 XSS&#xff09;攻击是一种注入攻击&#xff0c;其中恶意脚本被注入到受信任的网站中。攻击者使用 Web 应用程序向不同的最终用户发送恶意代码&#xff0c;通常以浏览器端脚本的形式…

论文笔记:Image Anaimation经典论文-运动关键点模型(Monkey-Net)

Monkey-Net&#xff08;MOviNg KEYpoints&#xff09; paper: https://arxiv.org/pdf/1812.08861, CVPR 2019 code: https://github.com/AliaksandrSiarohin/monkey-net/tree/master 相关工作 视频生成演变过程&#xff1a; spatio-temporal network: 如基于GAN网络的生成模…

异常处理1--5.31

try--catch--finally格式&#xff1a; try{ }catch(错误类型){ }finally{ } 执行情况&#xff1a; package javatest5;public class test {public static void main(String[] args) {int num115;int num20;try{System.out.println("商等于&#xff1a;"num1/num…

太速科技-基于3U VPX 4核8线程I7 X86主板

基于3U VPX 4核8线程I7 X86主板 一、产品概述 该产品是一款基于第六代Intel i7四核八线程处理器的高性能3U VPX刀片式计算机。产品提供了4个x4 PCIe 3.0总线接口&#xff0c;其中2个x4 PCIe 3.0接口可配置为1个x8 PCIe3.0接口&#xff0c;另外2个x4 PCIe 3.0接口可灵活配置…

Unity版本使用情况统计(更新至2024年4月)

UWA发布&#xff5c;本期UWA发布的内容是第十四期Unity版本使用统计&#xff0c;统计周期为2023年11月至2024年4月&#xff0c;数据来源于UWA网站&#xff08;www.uwa4d.com&#xff09;性能诊断提测的项目。希望给Unity开发者提供相关的行业趋势作为参考。 2023年11月 - 2024年…

达梦数据库(六) -------- 数据迁移MYSQL->达梦数据库

前言&#xff1a;确保安装好达梦数据库&#xff0c;达梦数据库(三) -------- 安装和初始化达梦数据库_达梦数据库安装-CSDN博客&#xff0c;需要安装达梦的数据库软件包&#xff0c;直接安装达梦8是包含这个功能的。安装包下载地址如下需要注册&#xff1a; https://www.damen…

【网络安全】Web安全学习-前言及先导

一、网络安全概述 网络安全是指网络系统的硬件、软件及其系统中的数据受到保护&#xff0c;不因偶然的或者恶意的原因遭到破坏、更改、泄露&#xff0c;系统能连续可靠的正常运行&#xff0c;网络服务不中断。简单来说。就是要保障我们的网络环境安全稳定&#xff0c;不被人破…

vmware workstation 17.0.0 ubuntu删除快照导致无法启动的问题打不开磁盘xxxxxxx或它所依赖的某个快照磁盘

在使用vmware workstation的时候 在我删除多余的快照的时候&#xff0c;发现删除快照后打不开虚拟机了&#xff0c; 提示&#xff1a; 打不开此虚拟磁盘的父磁盘打不开磁盘“D:\Virtual Machines\Ubuntu 64 位\Ubuntu 64 位-000003.vmdk”或它所依赖的某个快照磁盘。模块“Dis…

docker 启动关闭,设置仓库地址

1. 配置/etc/docker/daemon.json cat /etc/docker/daemon.json# 内容 {"registry-mirrors": ["https://0nth4654.mirror.aliyuncs.com"],"insecure-registries": ["harbor.domain.io"] }2. 配置systemd启动文件 和方法1配置会有冲突&a…

C语言 | Leetcode C语言题解之第124题二叉树中的最大路径和

题目&#xff1a; 题解&#xff1a; /*** Definition for a binary tree node.* struct TreeNode {* int val;* struct TreeNode *left;* struct TreeNode *right;* };*/ int max; int dfs(struct TreeNode* root){if(!root) return 0;int left dfs(root->left…

基于Raspi的Opencv-Python开发笔记

本文所有未强调 “windows终端” 的 “终端”字眼&#xff0c;都是默认树莓派的终端 系统版本 系统版本有必要强调一下&#xff0c;因为不同版本很多操作需要修改 在终端输入uname -a Release就是版本号&#xff0c;Codename是版本名 以下操作仅在此版本验证可行 使能摄像…

WalleWeb简化你的DevOps部署流程

walle-web&#xff1a;简化部署流程&#xff0c;提升开发效率&#xff0c;Walle Web让DevOps触手可及 - 精选真开源&#xff0c;释放新价值。 概览 Walle Web是一个功能强大且免费开源的DevOps平台&#xff0c;旨在简化和自动化代码部署流程。它支持多种编程语言&#xff0c;包…

短剧系统源码:构建互动娱乐的新平台

随着数字媒体的兴起&#xff0c;短剧成为了一种新兴的娱乐形式&#xff0c;它以紧凑的叙事和快速的节奏迎合了现代观众的观看习惯。短剧系统源码的开发&#xff0c;为短剧内容的创作、传播和消费提供了一个全面的技术解决方案。本文将探讨短剧系统源码的关键组成部分及其功能。…