当前位置: 首页 > news >正文

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

项目场景:

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


问题描述

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


原因分析:

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

代码示例如下:

@Component
public class ApplicationInitor {@Autowiredprivate 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.lryc.cn/news/415730.html

相关文章:

  • 外卖项目day14(day11)---数据统计
  • 养猫科普!牙口不好的猫咪怎么选粮?好吃易消化主食罐推荐
  • 力扣刷题之3143.正方形中的最多点数
  • 【更新2022】省级经济高质量发展指标体系测度 含代码 2000-2022
  • 缓冲流练习
  • 自己履行很多的话语,依旧按照这个方式进行生活
  • 交通预测数据文件梳理:METR-LA
  • 按钮类控件
  • opencascade AIS_ViewController源码学习 视图控制、包含鼠标事件等
  • 拉削基础知识——拉床的类型及特点
  • docker-compose笔记
  • C# 自定义控件无法加载
  • avl树自实现(带图),探讨平衡因子与旋转
  • Elasticsearch 的DSL查询,聚合查询与多维度数据统计
  • 【如何高效处理前端常见问题:策略与实践】
  • 聊聊前端 JavaScript 的扩展运算符 “...“ 的使用场景
  • 华为续签了,但我准备离职了
  • RocketMQ 的认证与授权机制
  • 【设计模式】六大原则-上
  • CRC16循环冗余校验
  • Mysql80主从复制搭建;遇到问题 Slave_IO_Running: Connecting和Slave_SQL_Running以及解决过程
  • Yarn网络代理配置指南:在受限网络环境中优化依赖管理
  • AOE网及其求解关键路径
  • 【FPGA】modelsim编译verilog代码产生错误集合
  • Rabbitmq的持久化机制
  • Unity UnityWebRequest封装类
  • JVM内存划分
  • c++ 全排列
  • 未授权访问漏洞系列详解⑤!
  • 【CONDA】库冲突解决办法