详细分析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;构建可靠、高效的分布式系统变得愈发重要。然…

Vue 3 中如何迁移从 Vue 2 的项目?

引言 Vue.js 是一个流行的前端框架&#xff0c;它以其响应式数据绑定和组件化系统而闻名。随着时间的推移&#xff0c;Vue.js 也在不断发展和改进。Vue 3 是 Vue.js 的一个重大更新&#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 地理空间数据集的渲染…

编码规范(前端)

文章目录 1. 文档说明1.1 编制说明1.2 名词解释 2.前端研发规范2.1 HTML编码规范2.1.1 文档类型2.1.2 语言2.1.3 元数据2.1.4 资源加载2.1.5 页面标题2.1.6 编码风格2.1.7 标签2.1.8 属性2.1.9 语义化 2.2 CSS编码规范2.2.1 文件引用2.2.2 命名-组成元素 知识点 1. 文档说明 1…

【数据分享】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, …

【软件设计师】通俗易懂的去了解算法的特性和要求

&#x1f413; 算法 算法是对特定问题求解步骤的一种描述&#xff0c;算法是指令的有限序列。其中每一条指令表示一个或者多个操作。 &#x1f413; 算法的5种属性 有穷性 一个算法必须总是在执行有穷的步骤后&#xff0c;且在每个步骤执行的过程中时间是有限的 1.有穷性意味…

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

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

蓝桥杯:单词分析

题目 题目描述 小蓝给学生们组织了一场考试&#xff0c;卷面总分为 100 分&#xff0c;每个学生的得分都是一个 0 到 100 的整数。 如果得分至少是 60 分&#xff0c;则称为及格。如果得分至少为 85 分&#xff0c;则称为优秀。 请计算及格率和优秀率&#xff0c;用百分数表…

Rstudio-深度学习执行代码

RStudio是一个开源的集成开发环境&#xff08;IDE&#xff09;&#xff0c;专门用于R编程语言的开发和数据分析。R语言是一种流行的统计计算和数据可视化语言&#xff0c;广泛用于数据科学、统计学和机器学习领域。 RStudio提供了许多功能强大的工具&#xff0c;包括代码编辑器…

SQL 基本条件查询DQL 练习

DQL DQL&#xff08;Data Query Language&#xff09;是SQL语言中的一种类型&#xff0c;用于执行数据查询操作。它是SQL的一部分&#xff0c;用于从数据库中检索数据。DQL语句用于从一个或多个表中选择、过滤和排序数据。常见的DQL查询语句包括SELECT、FROM、WHERE、GROUP BY…

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;然后可以选择一个想要的…

python70-Python的函数入门,了解下函数

函数是执行特定任务的一段代码,程序通过将一段代码定义成函数,并为该函数指定一个函数名,这样即可在需要的时候多次调用这段代码。因此,函数是代码复用的重要手段。学习函数需要重点掌握定义函数、调用函数的方法。 与函数紧密相关的另一个知识点是lambda表达式。lamda表达…

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;在系统每注册一个设备的时…

【Redis】实际应用 - 缓存

文章目录 1. 缓存的基本概念2. Redis作为缓存的优势2.1 内存存储2.2 持久性选项2.3 数据结构丰富 3. Redis缓存的使用3.1 安装和配置Redis3.2 连接到Redis3.3 存储和获取数据3.4 设置过期时间 4. 缓存策略4.1 LRU&#xff08;最近最少使用&#xff09;4.2 数据失效4.3 主动刷新…

可让照片人物“开口说话”阿里图生视频模型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…