记录一次单例模式乱用带来的危害。

news2025/1/25 9:24:51

项目场景:

我们在接受到短信网关下发的回执之后,需要将回执内容也下发给我们的下游服务。为了防止下游响应超时,我们需要将超时的信息存放到Redis中然后进行补发操作。


问题描述

在使用Redis进行数据存储的时候,报NPE问题。


原因分析:

在Spring托管的Bean中手动通过单例模式的方式去构造了实体对象,导致Bean对象不受Spring托管,无法通过Autowried的注入方式进行注入。

代码示例如下:

@Component
public class ApplicationInitor {
      @Autowired
      private UserService userService;

      public static ApplicationInitor getApplicationInitor(){
        return Inner.instance;
      }

      private static class Inner {
        private static final ApplicationInitor instance = new ApplicationInitor();
      }

    public void register(String name) {
        try {
            TestDemo testDemo = new TestDemo(userService);
            testDemo.registerUser(name);
        }catch (Exception e) {
            e.printStackTrace();
        }
    }

    class TestDemo{

          UserService userService;

          TestDemo(UserService userService){
              this.userService = userService;
          }

          public void registerUser(String name) {
              userService.setUserName(name);
              System.out.println("注册成功");
          }
      }
}

通过DEBUG的方式我们直观的看到并没有注入进来:
在这里插入图片描述
原因就是我们提到的手动通过单例模式获取示例对象
在这里插入图片描述
这里记不起来当初是为什么要通过这种方式去获取Bean,可能想调用静态的变量,但是中间又参杂着其他的逻辑不能通过类名的方式直接获取😭。

解决方案:

去掉通过单例模式获取实例的方法,因为Spring Bean本身就是单例的,无非就是通过Autowried进行注入下就行。
在这里插入图片描述

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

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

相关文章

Leetcode第136场双周赛题解(c++)

题外话 也是好久没有更新力扣比赛的题解了,前段时间也是比较忙(说的好像现在不忙一样哈哈),像我等菜鸟,一般都是保二进三四不写的,笑死。 题目一.求出胜利玩家的数目 给你一个整数 n ,表示在…

【C++ STL】vector

文章目录 vector1. vector的接口1.1 默认成员函数1.2 容量操作1.3 访问操作1.4 修改操作1.5 vector与常见的数据结构的对比 2. vector的模拟实现2.1 类的定义2.2 默认成员函数迭代器的分类 2.3 容量接口memcpy 浅拷贝问题内存增长机制reserve和resize的区别 2.4 修改接口迭代器…

ScreenAgent:基于LVLM的计算机控制智能体

ScreenAgent : A Vision Language Model-driven Computer Control Agent 论文链接: https://arxiv.org/abs/2402.07945https://arxiv.org/abs/2402.07945IJCAI 2024 1.概述 大型语言模型(LLM),诸如ChatGPT与GPT-4,在自然语言处理领域(涵盖生成、理解及对话等任务)展现出…

springBoot 3.X整合camunda

camunDa camunDa 是2013年从Activiti5 中分离出来的一个新的工作流引擎。Camunda 官方提供了 Camunda Platform、Camunda Modeler,其中 Camunda Platform 以 Camunda engine 为基础为用户提供可视化界面,Camunda Modeler 是流程文件建模平台&#xff0c…

python 的 tuple(元组) 是不是冗余设计?

有人问,python 的 tuple(元组) 是不是冗余设计?因为它和list(列表)很像。 先抛观点,tuple不是冗余设计,它最大的特点是不可变,在Python程序设计中非常重要。 tuple与li…

药店管理小程序的设计

管理员账户功能包括:系统首页,个人中心,用户管理,药品分类管理,药品信息管理,留言板管理,订单管理,系统管理 微信端账号功能包括:系统首页,药品信息&#xf…

VBA中类的解读及应用第十四讲:限制复选选择,程序运行过程及效果

《VBA中类的解读及应用》教程【10165646】是我推出的第五套教程,目前已经是第一版修订了。这套教程定位于最高级,是学完初级,中级后的教程。 类,是非常抽象的,更具研究的价值。随着我们学习、应用VBA的深入&#xff0…

【Vue3】组件通信之$parent

【Vue3】组件通信之$parent 背景简介开发环境开发步骤及源码总结 背景 随着年龄的增长,很多曾经烂熟于心的技术原理已被岁月摩擦得愈发模糊起来,技术出身的人总是很难放下一些执念,遂将这些知识整理成文,以纪念曾经努力学习奋斗的…

利用Dockerfile文件执行docker build自动构建镜像

一、Dockerfile使用详解 1.1 Dockerfile介绍 DockerFile是一种被Docker程序解释执行的脚本,由一条条的命令组成的,每条命令对应linux下面的一条命令,Docker程序将这些DockerFile指令再翻译成真正的linux命令,其有自己的书写方式和…

读零信任网络:在不可信网络中构建安全系统08设备清单管理

1. 设备清单管理 1.1. 设备的认证和完整性检查是零信任安全至关重要的第一大步,但是仅仅验证设备是否属于企业是不够的 1.2. 设备清单管理涉及对设备及其属性进行编目管理 1.2.1. 将配置管理作为设备清单数据库 1.2.2. 维护/管理这些记录对客户端和服务器设备同样…

AI电销机器人的效果与作用

ai电销机器人的工作效率是非常高的,电销机器人一天的外呼量至少是3000左右,工作效率是人工的十倍还多,并且电销机器人没有负面情绪,一直都可以保持高昂的工作热情,非常简单方便。 并且ai电销机器人是越用越聪明的&…

刘润《关键跃升》读书笔记3

1) 防御动⼒”发动机 ⽐如,恐惧。 转正考核、末位淘汰等,本质上都是在制造“危险”环境,从⽽激发员 ⼯全⼼投⼊。万⼀没转正,万⼀被淘汰,房贷怎么还,孩⼦怎么养? 你想想都害怕&am…

【Redis 进阶】哨兵 Sentinel(重点理解流程和原理)

Redis 的主从复制模式下,一旦主节点由于故障不能提供服务,需要人工进行主从切换,同时大量的客户端需要被通知切换到新的主节点上,对于上了一定规模的应用来说,这种方案是无法接受的,于是 Redis 从 2.8 开始…

sa-token登录机制以及网关统一鉴权环境搭建

文章目录 1.sa-token1.37集成(基于token)1.文档网址2.**sun-club-auth-application-controller引入依赖**3.application.yml4.sun-club-auth-application-controller测试的controller1.UserController.java2.启动测试1.登录,得到satoken2.验证…

当AIGC走进温室大棚:AI+“种菜“的前世今生

( 于景鑫 国家农业信息化工程技术研究中心) 近年来,人工智能生成内容(AIGC)技术引发业界广泛关注。从NLP领域的GPT-3到CV领域的Stable Diffusion,AIGC展现了惊人的创造力,正在重塑人们的工作和生活方式。与此同时,农业领域也正经历着数字化、智能化的深刻…

Golang环境篇

一、Golang环境篇 一)go简介 1、Golang定义 Go语言是Google于2009年推出的一门新的系统编程语言。 2、特性: 静态编译内存分配:Go 选择了 tcmalloc,它本就是为并发而设计的高性能内存分配组件。垃圾回收:每次升级&…

基于51单片机的汽车灯控制器proteus仿真

地址: https://pan.baidu.com/s/1YrwCUQIKwdth1N2UsUtSRA 提取码:1234 仿真图: 芯片/模块的特点: AT89C52/AT89C51简介: AT89C52/AT89C51是一款经典的8位单片机,是意法半导体(STMicroelectro…

基于Java的网络考试系统的设计与实现

点击下载源码 基于Java的网络考试系统的设计与实现 摘 要 科技在进步,人们生活和工作的方式正发生着改变,不仅体现在人们的衣食住行,也体现在与时俱进的考试形式上。以前的考试需要组织者投入大量的时间和精力,需要对考试的试题…

Java线程池原理剖析和应用指南

目录 Java线程池详解一、Java线程池简介池化思想池化思想的优点 二、线程池的实现原理分析实现线程池需要考虑哪些问题?线程池的简单使用示例线程池原理的简单图示 三、Executor详解Executor简介Executor框架的继承结构总结ExecutorExecutorService 四、ThreadPoolE…

免费自动化AI视频剪辑工具

下载地址:https://pan.quark.cn/s/3c5995da512e FunClip是一款完全开源、本地部署的自动化视频剪辑工具,通过调用阿里巴巴通义实验室开源的FunASR Paraformer系列模型进行视频的语音识别,随后用户可以自由选择识别结果中的文本片段或说话人&…