详细分析Java类调用Service接口失效的注意事项(附Demo)

目录

  • 前言
  • 1. 问题所示
  • 2. 原理分析
  • 3. 解决方法

前言

试错了一小时,发现接口返回null!!
最后梳理其知识点并总结其原理

1. 问题所示

接口类如下:

public interface IInfoService extends BaseService<Info> {

错误方式一:(此处infoservice返回null值)

在这里插入图片描述

错误方式二:(不使用注解,通过new实例化 也返回null值)
在这里插入图片描述

2. 原理分析

在Spring MVC中,@Autowired@Resource等注解通常用于在Controller中注入Service,这是因为在Spring MVC中,Controller属于Spring容器的一部分,因此可以自动注入其他由Spring管理的Bean,如Service

然而,在一般的类中,如果想要使用Service,直接使用new关键字实例化一个Service对象是不可取的


这是因为通过new实例化的对象是脱离了Spring容器的管理的,因此无法获取到Spring容器中的注解属性值,这样可能会导致注入的Service为null。
即使该类被标记为@Component并且被Spring管理,直接通过new实例化Service的方式也无法注入依赖,因为这个实例不受Spring容器的管控。

为了解决这个问题,应该让这个一般类也成为Spring容器的一个Bean,方法是使用@Component或者相关的注解,如@Service@Repository等。然后,在需要使用Service的地方,通过注入的方式将Service注入到这个一般类中,而不是通过new关键字实例化。这样就能保证依赖注入成功,避免出现null的情况。

在实践中,确保了类成为了Spring容器的一个Bean,并使用了适当的注解来进行依赖注入,可以有效避免由于依赖注入失败而导致的空指针异常等问题

springboot不支持注入静态属性,使用`@Autowired等注解注入会失败

3. 解决方法

使用如下方式:

@Component
public class CommonUtil {@Autowiredprivate IInfoService infoService;public static CommonUtil commonUtil;@PostConstructpublic void init() {commonUtil = this;}

最终在调用inforservice方法时,通过使用commonUtil.infoService.list

在这里插入图片描述

主要的步骤逻辑如下:

  1. @Component注解标记了CommonUtil类,使其成为了Spring容器的一个Bean,因此Spring会对其进行管理
  2. @Autowired注解标记了infoService字段,告诉Spring在初始化CommonUtil的时候,自动注入一个IInfoService类型的实例
  3. @PostConstruct注解标记了init()方法,这意味着在CommonUtil实例创建完成并且所有的依赖注入完成后,Spring会调用init()方法。在init()方法中,将当前实例赋值给了静态的commonUtil对象
  4. 通过将commonUtil对象设置为静态的,使得其他类可以通过CommonUtil.commonUtil来访问CommonUtil类的实例,从而间接获取到了IInfoService的实例

这种方法虽然能够解决在普通类中使用Service的问题,但要注意以下几点:

  • 静态变量commonUtil可能存在线程安全问题,如果多个线程同时访问该变量,可能会出现竞态条件。
  • 静态变量的使用会增加类的耦合度,降低代码的可维护性和可测试性。

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

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

相关文章

【Zookeeper】ZooKeeper的一些重要功能和作用

&#x1f34e;个人博客&#xff1a;个人主页 &#x1f3c6;个人专栏&#xff1a;日常聊聊 ⛳️ 功不唐捐&#xff0c;玉汝于成 目录 前言 正文 结语 我的其他博客 前言 随着分布式系统的普及和应用场景的不断增加&#xff0c;构建可靠、高效的分布式系统变得愈发重要。然…

C 嵌入式系统设计模式 19:保护调用模式

本书的原著为&#xff1a;《Design Patterns for Embedded Systems in C ——An Embedded Software Engineering Toolkit 》&#xff0c;讲解的是嵌入式系统设计模式&#xff0c;是一本不可多得的好书。 本系列描述我对书中内容的理解。本文章描述嵌入式并发和资源管理模式之五…

Cesium 3D Tiles 简介

3D Tiles 是大规模异构 3D 地理空间数据集&#xff08;例如点云、建筑物和摄影测量&#xff09;的开放标准。3D Tiles 基于 glTF 和其他 3D 数据类型构建&#xff0c;是一种可类似二维瓦片模式的流式传输的优化格式&#xff0c;旨在适应当今不断增长的 3D 地理空间数据集的渲染…

【数据分享】1979~2020年MSWEP降水数据集

各位同学们好&#xff0c;今天和大伙儿分享的是1979~2020年MSWEP降水数据集。如果大家有下载处理数据等方面的问题&#xff0c;您可以私信或者评论。 Beck, H. E., E. F. Wood, M. Pan, C. K. Fisher, D. G. Miralles, A. I. J. M. van Dijk, T. R. McVicar, and R. F. Adler, …

深度学习 精选笔记(7)前向传播、反向传播和计算图

学习参考&#xff1a; 动手学深度学习2.0Deep-Learning-with-TensorFlow-bookpytorchlightning ①如有冒犯、请联系侵删。 ②已写完的笔记文章会不定时一直修订修改(删、改、增)&#xff0c;以达到集多方教程的精华于一文的目的。 ③非常推荐上面&#xff08;学习参考&#x…

U盘无法读取?轻松掌握正确解决方法!

“为什么我的u盘插入电脑后会显示无法读取呢&#xff1f;想查看一些比较重要的文件&#xff0c;但就是无法读取U盘&#xff0c;想问问大家&#xff0c;我应该怎么操作呢&#xff1f;” U盘作为一种便捷的数据存储设备&#xff0c;广泛应用于我们的日常生活和工作中。然而&#…

独立游戏《星尘异变》UE5 C++程序开发日志2——创建并编写一个C++类

在本篇日志中&#xff0c;我们将要用一个C类来实现一个游戏内的物品&#xff0c;同时介绍UCLASS、USTRUCT、UPROPERTY的使用 一、创建一个C类 我们在UE5的"内容侧滑菜单"中&#xff0c;在右侧空白中右键选择"新建C类"&#xff0c;然后可以选择一个想要的…

Spring AOP(Aspect-Oriented Programming,面向切面编程)介绍

Spring AOP&#xff08;Aspect-Oriented Programming&#xff0c;面向切面编程&#xff09;是Spring框架的一个重要模块&#xff0c;它提供了一种强大的方式来帮助开发者实现横切关注点&#xff08;cross-cutting concerns&#xff09;的模块化。横切关注点是指那些影响多个模块…

Linux设备模型(十一) - platform设备

一&#xff0c;platform device概述 在Linux2.6以后的设备驱动模型中&#xff0c;需关心总线、设备和驱动这3个实体&#xff0c;总线将设备和驱动绑定。在系统每注册一个设备的时候&#xff0c; 会寻找与之匹配的驱动&#xff1b;相反的&#xff0c;在系统每注册一个设备的时…

可让照片人物“开口说话”阿里图生视频模型EMO,高启强普法

3 月 1 日消息&#xff0c;阿里巴巴研究团队近日发布了一款名为“EMO&#xff08;Emote Portrait Alive&#xff09;”的 AI 框架&#xff0c;该框架号称可以用于“对口型”&#xff0c;只需要输入人物照片及音频&#xff0c;模型就能够让照片中的人物开口说出相关音频&#xf…

PDN分析及应用系列二-简单5V电源分配-Altium Designer仿真分析-AD

PDN分析及应用系列二 —— 案例1:简单5V电源分配 预模拟DC网络识别 当最初为PCB设计打开PDN分析仪时,它将尝试根据公共电源网络命名法从设计中识别所有直流电源网络。 正确的DC网络识别对于获得最准确的模拟结果非常重要。 在示例项目中已经识别出主DC网络以简化该过程。 …

Vulnhub靶机:Bellatrix

一、介绍 运行环境&#xff1a;Virtualbox 攻击机&#xff1a;kali&#xff08;10.0.2.4&#xff09; 靶机&#xff1a;Bellatrix&#xff08;10.0.2.9&#xff09; 目标&#xff1a;获取靶机root权限和flag 靶机下载地址&#xff1a;https://www.vulnhub.com/entry/hogwa…

网络学习:MPLS技术基础知识

目录 一、MPLS技术产生背景 二、MPLS网络组成&#xff08;基本概念&#xff09; 1、MPLS技术简介&#xff1a;Multiprotocol Lable Switching&#xff0c;多协议标签交换技术 2、MPLS网络组成 三、MPLS的优势 四、MPLS的实际应用 一、MPLS技术产生背景 1、IP采用最长掩码…

Power BI vs Superset BI 调研报告

调研结论 SupersetPower BI价格开源①. Power BI Pro 每人 $10/月($120/年/人) ②. Power BI Premium 每人 $20/月($240/年/人) ③. Power BI Embedded:4C10G $11W/年 权限基于角色的访问控制,支持细粒度的访问: 表级别、库级别、图表级别,看板级别,用户级别 基于角色…

【推荐】免费AI论文写作神器-「智元兔 AI」

还在为写论文焦虑&#xff1f;免费AI写作大师来帮你三步搞定&#xff01; 智元兔AI是ChatGPT的人工智能助手&#xff0c;并且具有出色的论文写作能力。它能够根据用户提供的题目或要求&#xff0c;自动生成高质量的论文。 不论是论文、毕业论文、散文、科普文章、新闻稿件&…

#WEB前端(浮动与定位)

1.实验&#xff1a; 2.IDE&#xff1a;VSCODE 3.记录&#xff1a; float、position 没有应用浮动前 应用左浮动和右浮动后 应用定位 4.代码&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><me…

pyqt5怎么返回错误信息给页面(警告窗口)

在软件设计中&#xff0c;我们可能会遇到对异常的处理&#xff0c;有些异常是用户需要看到的&#xff0c;比如说&#xff0c;当我们登录出错的时候&#xff0c;后端需要给我们返回响应的错误信息&#xff0c;就像下图实现的这样。 类似这种效果&#xff0c;我们该如何实现&…

javaWebssh题库管理系统myeclipse开发mysql数据库MVC模式java编程计算机网页设计

一、源码特点 java ssh题库管理系统是一套完善的web设计系统&#xff08;系统采用ssh框架进行设计开发&#xff09;&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为TOMCAT7.0,Mye…

「MySQL」基本操作类型

&#x1f387;个人主页&#xff1a;Ice_Sugar_7 &#x1f387;所属专栏&#xff1a;数据库 &#x1f387;欢迎点赞收藏加关注哦&#xff01; 数据库的操作 创建、显示数据库 使用 create 创建一个数据库 create database goods;然后可以用 show databases 来查看已经创建的数…

javaWebssh网上超市销售管理系统myeclipse开发mysql数据库MVC模式java编程计算机网页设计

一、源码特点 java ssh网上超市销售管理系统是一套完善的web设计系统&#xff08;系统采用ssh框架进行设计开发&#xff09;&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为TOMCA…