Autowired自动注入Map问题

news2024/11/14 8:22:01

问题

昨天开发的时候遇到一个诡异的问题,通过Map注入接口下所有的子类,然后json打印出来的时候,没有子类的信息,并且去调用的时候报了空指针异常。

排查问题过长,并且涉及到源码,所以这里先说结论,就是因为map取数据的时候首字母大写导致的。

但是由于业务代码的复杂问题,导致以为注入问题,一直在看源码。

本文可以帮助您学习一下Autowired注解逻辑源码

代码

工厂类

@Slf4j
@Component
public class XyHandleFactory {

    @Autowired
    private Map<String, XyHandle> xyHandleMap;

    public XyCallBackHandle getXyCallBack(Integer subType) {
        log.info("subType:{}", subType);
        log.info("xyHandleMap:{}", JSON.toJSONString(xyHandleMap));
        switch (subType) {
            case 101:
                return xyHandleMap.get("xyChangeHandleImpl");
            case 102:
                return xyHandleMap.get("XySaveHandleImpl");
            case 103:
                return xyHandleMap.get("xyDeleteHandleImpl");
            default:
                return xyHandleMap.get("xyVoidHandleImpl");
        }
    }
}

接口类+实现类

public interface XyHandle {
    void execute(String data);
}

@Slf4j
@Service
public class XyVoidHandleImpl implements XyCallBackHandle {
    @Override
    public void execute(String data){
        log.error("未查询到处理逻辑 data:{}", data);
    }
}

@Slf4j
@Service
public class XySaveHandleImpl implements XyCallBackHandle {
    @Override
    public void execute(String data){
        log.error("保存处理逻辑 data:{}", data);
    }
}

@Slf4j
@Service
public class XyChangeHandleImpl implements XyCallBackHandle {
    @Override
    public void execute(String data){
        log.error("修改处理逻辑 data:{}", data);
    }
}

@Slf4j
@Service
public class XyDeleteHandleImpl implements XyCallBackHandle {
    @Override
    public void execute(String data){
        log.error("删除处理逻辑 data:{}", data);
    }
}

异常

java.lang.NullPointerException
就是这第二行代码报了一个控制针

XyHandle xyCallBack = xyHandleFactory.getXyCallBack(result.getType());
xyCallBack.execute(data);

日志

而且发现日志中打印的map,value里面的数据没有详情

 xyCallBackHandleMap:{"xyChangeHandleImpl":{},"xyDeleteHandleImpl":{},"xySaveHandleImpl":{},"xyVoidHandleImpl":{}}

排查

注解

因为日志中 value没有对象详情,所以就怀疑 注解@Autowired 是不是没有找到数据,换成 @Resource ,但是日志打印的数据依旧没有效果。

翻源码发现如果@Resource注解后面 没有写 (name = “”) 属性的话,走的注入逻辑和@Autowired是没有任何区别,只有加了name属性的话,才会走if里面的逻辑
在这里插入图片描述
所以 注解问题排除

怀疑

而且,日志里面的key已经打印出来了每个对象的name,但是value里面没有值。
那就源码debug

排查注入源码

(因为对源码有一定了解,所以这里就直接展示方法的链路)

从Autowired注解里面开始找,首先进入
AutowiredAnnotationBeanPostProcessor在这里插入图片描述

AutowiredAnnotationBeanPostProcessor类中的inject()方法
在这里插入图片描述
resolveMethodArguments()方法
这个方法里面 beanFactory的实现类是 DefaultListableBeanFactory
在这里插入图片描述
DefaultListableBeanFactory.resolveDependency()中看看这个方法
在这里插入图片描述
到这里就是核心,如果Autowired注解的类型不是单独的bean,而是可以注入多个bean的List或者Map类型,那么就会在这个方法处理后,直接返回
在这里插入图片描述

可以看到,它有数组类型,集合类型的判断,我们本次只看Map类型
在此处打个断点开始调试
在这里插入图片描述

调试

主要看这个对象matchingBeans ,断点调试结果竟然是注入成功的!!!! key和value的值都是正常的。
疯了疯了
在这里插入图片描述

再次排查日志

这次多打印了一些,发现map里面确实是已经有值了,那证明注入是正常的!
这样的话,就说明是取值的时候是有问题。
但是直接用JSON.toJSONString打印对象的话,确实是没有详细信息的。

log.info("xyChangeHandleImpl:{}", xyCallBackHandleMap.get("xyChangeHandleImpl").getClass());

日志
xyChangeRobotStatusHandleImpl:class com.xxx.service.xxx.impl.XyChangeHandleImpl

破案

最终发现,是因为取数据的时候,有一个key,首字母写成了大写,导致取不到值。 其实这个问题在一开始就发现了,随手改了之后,还是一直在找日志map中value没有详情的问题。
中间多次测试的时候也是由于业务代码的复杂逻辑,阴差阳错,没有成功。

xyHandleMap.get("XySaveHandleImpl");

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

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

相关文章

2018-架构师案例(七)

问题1 性能需求指什么&#xff1f; 解析&#xff1a; 指响应时间&#xff0c;吞吐量&#xff0c;资源利用率等指标&#xff0c;保证系统正常运行的情况下&#xff0c;这些数据表示系统的性能。 问题2&#xff08;9分&#xff09; MemCache和Redis两种工具的优缺点&#xff0c…

js 前端 解析excel文件【.xlsx文件】信息内容

需求&#xff1a; 从excel文件中解析里面的内容 1、使用插件xlsx.full.min.js&#xff0c;地址&#xff1a;https://unpkg.com/xlsx/dist/xlsx.full.min.js实例&#xff1a; <script src"https://unpkg.com/xlsx/dist/xlsx.full.min.js"></script><i…

【机器学习基础】数据预处理

【作者主页】Francek Chen 【专栏介绍】 ⌈ ⌈ ⌈Python机器学习 ⌋ ⌋ ⌋ 机器学习是一门人工智能的分支学科&#xff0c;通过算法和模型让计算机从数据中学习&#xff0c;进行模型训练和优化&#xff0c;做出预测、分类和决策支持。Python成为机器学习的首选语言&#xff0c;…

【综合案例】使用DevEco Studio编写B站视频卡片

效果展示 知识点 层叠布局 介绍&#xff1a;层叠布局具有较强的 组件层叠 能力。 使用场景&#xff1a;卡片层叠效果 特点&#xff1a;层叠操作 更简洁&#xff0c;编码效率更高。【绝对定位的优势是更灵活】 Stack容器内的子元素顺序是先写的在最下面&#xff0c;即从下到上依…

数据结构与算法-二分搜索树节点删除

&#x1f49d;&#x1f49d;&#x1f49d;首先&#xff0c;欢迎各位来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里不仅可以有所收获&#xff0c;同时也能感受到一份轻松欢乐的氛围&#xff0c;祝你生活愉快&#xff01; 文章目录 引言一、二分搜…

关于Unity四种合批技术详解

文章目录 一.静态合批(StaticBatching)1.启用静态合批2.举例说明3.静态合批的限制4.静态合批的优点缺点5.动态指定物品合批 二.动态合批(Dynamic Batching)1.启用动态合批2.合批规则3.举例说明4.使用限制 三.GPU Instancing1.启用GPU Instancing2.启用限制3.举例说明 四.SRP Ba…

构建积极心理学资源站:从零到一的旅程

自己搭建的心理学资源站 积极心理学网站&#xff1a;致力于推动积极未来 欢迎来到kuakua.app&#xff0c;这是一个致力于积极心理学的资源站。 作为一个独立开发者&#xff0c;我与一些热爱心理学的学生合作&#xff0c;创建了这个网站。 我们的目标是通过分享心理学知识和资源…

创新就业政策:智慧校园就业管理的策略之道

在智慧校园的广阔版图中&#xff0c;就业管理板块的“就业政策”功能模块犹如一颗璀璨的明星&#xff0c;照亮着学子们的未来职业道路。它不仅是一座信息的灯塔&#xff0c;指引着学生们穿越就业政策的迷雾&#xff0c;更是一把开启梦想大门的钥匙&#xff0c;帮助他们把握机遇…

2024智慧农场土地租赁家禽认养众筹实时监控商品溯源农业积分商城秒杀助农小程序源码

后端&#xff1a;系统后端使用PHP语言开发 前端&#xff1a;前端使用uniapp进行前后端分离开发 功能简介&#xff1a;土地种植、农业认养、积分商城、农场活动、视频监控、农场商城、实时数据监控、限时秒杀、农业众筹、送货上门、一键分销、农场入驻、全部店铺 运行环境&am…

《Token Contrast for Weakly-Supervised Semantic Segmentation》CVPR2023

摘要(Abstract)&#xff1a; 在弱监督语义分割&#xff08;WSSS&#xff09;中&#xff0c;传统方法通常使用类激活映射&#xff08;CAM&#xff09;生成伪标签&#xff0c;但受限于卷积神经网络&#xff08;CNN&#xff09;的局部结构感知能力&#xff0c;往往难以识别完整的对…

深入分析 Android ContentProvider (十二)

文章目录 深入分析 Android ContentProvider (十二)Android 中 ContentProvider 的系统代码分析&#xff08;续&#xff09;1. ContentProvider 的内部实现机制1.1. ContentProvider 的创建与生命周期管理1.2. ContentProvider 的数据访问与处理1.3. ContentProvider 的权限管理…

Node Red 与axios简易测试环境的搭建

为了学习在vue3中如何使用axios&#xff0c;我借Sider Fusion的帮助搭建了基于node的简易测试环境。 Axios 是一个基于 Promise 的 HTTP 客户端&#xff0c;通常用于浏览器环境&#xff0c;但它也可以在 Node.js 环境中使用。因此&#xff0c;可以在 Ubuntu 的 Bash 环境下通过…

NPDP|传统行业产品大神都是怎样管理产品的?

在传统行业中&#xff0c;产品管理不仅是技术的较量&#xff0c;更是策略、洞察力和执行力的综合体现。那些被誉为“产品大神”的经理们&#xff0c;他们如何管理产品&#xff0c;使其在市场上脱颖而出&#xff0c;成为行业内的佼佼者&#xff1f;本文将探讨他们的一些关键管理…

触发邮件接口如何与现有CRM系统无缝集成?

触发邮件接口的性能优化策略&#xff1f;如何设计高效的API接口&#xff1f; 随着企业对自动化和个性化沟通需求的增加&#xff0c;触发邮件接口的集成变得尤为重要。AokSend将探讨触发邮件接口如何与现有CRM系统无缝集成&#xff0c;以及这种集成带来的优势和挑战。 触发邮件…

c语言第七天笔记

作业题&#xff1a; 设计TVM&#xff08;地铁自动售票机&#xff09;机软件。 输入站数&#xff0c;计算费用&#xff0c;计费规则&#xff0c;6站2元&#xff0c;7-10站3元&#xff0c;11站以上为4元。 输入钱数&#xff0c;计算找零(找零时优先找回面额大的钞票)&#xff0…

与树莓派的“黄金”关系,是如何帮助这家医疗设备公司扩大规模

稳定的供应和与Raspberry Pi的“黄金”关系帮助医疗设备公司进行了规模扩张 埃及医疗设备制造商Bio Business需要将物联网功能集成到其成功的患者监测设备系列中。Raspberry Pi技术使他们得以实现。 解决方案 RP2040 Compute Module 4 企业规模 中小企业 行业 医疗技术 …

springbootJZ车行系统-计算机毕业设计源码93812

目 录 摘 要 1 绪论 1.1 研究背景与意义 1.2开发现状 1.3论文结构与章节安排 2 系统分析 2.1 可行性分析 2.1.1 技术可行性分析 2.1.2 经济可行性分析 2.1.3 操作可行性分析 2.2 系统功能分析 2.2.1 功能性分析 2.2.2 非功能性分析 2.3 系统用例分析 2.4 系统流…

Java语聊大厅语音聊天小程序系统源码

语聊大厅语音聊天小程序&#xff1a;遇见声音的温暖角落 &#x1f3a7; 【初识语聊大厅&#xff0c;声音的奇妙邂逅】 在这个快节奏的时代&#xff0c;你是否渴望一份不被视线束缚的真诚交流&#xff1f;语聊大厅语音聊天小程序&#xff0c;就是你我之间最温柔的桥梁。轻轻一…

禅道项目管理软件安装教程

一、禅道软件简介 禅道项目管理软件是一款国产开源项目管理软件。它集项目集管理、产品管理、项目管理、质量管理、DevOps、知识库、BI效能、工作流、学堂、反馈管理、组织管理和事务管理于一体&#xff0c;是一款专业的研发项目管理软件&#xff0c;完整覆盖了研发项目管理的…

提升Windows录屏体验:3款顶级电脑录屏软件推荐!

Hey&#xff01;伙伴们&#xff0c;是不是有时候会觉得需要录屏呢&#xff1f;比如做个教学视频啦、直播玩游戏啦&#xff0c;或者是把重要的会议内容记录下来。这时候有一款好的电脑录屏软件简直不要太棒&#xff01;作为你们身边的科技小能手&#xff0c;今天我就来给大家安利…