使用 @Autowired 为什么会被 IDEA 警告,应该怎么修改最佳?

news2024/9/25 13:15:39

# 问题原因

关于这个问题,其实答案相对统一,实际上用大白话说起来也容易理解。

1.初始化问题

先看一下Java初始化类的顺序:父类的静态字段 > 父类静态代码块 > 子类静态字段 > 子类静态代码块 > 父类成员变量 > 父类构造代码块 > 父类构造器 > 子类成员变量 > 子类构造代码块 > 子类构造器。

而Autowired注入,则要排队到子类构造器以后了,SpringIOC并不会对依赖的bean是否为null做判断,JVM编译时同样也不会有问题,但如果使用不当,运行起来时或许会因为出现空指针异常。

2.对IOC容易依赖过强

@Autowired由Spring提供,而@Resource是JSR-250提供的,它是Java标准。前者会警告,而后者不警告,就是因为前者导致了应用与框架的强绑定,若是换成其他IOC框架,则不能够成功注入了。其实对于这方面,我认为在大多数情况时是不会有什么问题的。

3.其他方面

我看到网络上有一些其他方面的总结,比如:依赖过多却不够明显,违反了单一职责原则;不能像构造器那样注入不可变的对象等,这类问题需要结合个人实际开发进行判断。

对于@Autowired使用方面,它虽然是将业务代码和框架进行了强绑定,但字段注入确实大幅简化了代码。追求完完全全的松耦合其实也过于理想化,应该在实际使用中追求平衡,否则将为了过度追求松耦合而得不偿失。

# 其他使用方式

除了使用@Autowired以外,我们其实也有几种好用的方式。使用@Resource替代@Autiwired方法是其中一种,只需要改变一个注解,这里就不展示了。

set方法

@RestControllerpublic class TestController2 {    ITestService testService;    /*     * 基于set注入     * */    @Autowired    public void setTestService(ITestService iTestService) {        this.testService = iTestService;    }    @GetMapping("/status2")    public Result<?> status() {        return testService.status();    }}

这种方法也使用了@Autowired注解,但是它是作用于成员变量的Setter函数上,而不是像Fied注入一样作用于成员变量上。

构造器

@RestControllerpublic class TestController1 {    ITestService testService;    /*    * 基于构造方法的注入    * */    public TestController1(ITestService iTestService) {        this.testService = iTestService;    }    @GetMapping("/status1")    public Result<?> status() {        return testService.status();    }}

它的好处在于,采用了构造方法注入,这种方式对对象创建的顺序会有要求,它将避免循环依赖问题。是最可靠的方法。

构造器的简化版(推荐)

首先,需要引入lombok依赖。

<dependency>    <groupId>org.projectlombok</groupId>    <artifactId>lombok</artifactId>    <version>1.18.2</version></dependency>

随后,我们在创建时就可以使用@RequiredArgsConstructor注解,它将帮我们创建构造器,final关键字必不可少。

@RestController@RequiredArgsConstructorpublic class TestController3 {    /*     * 用@RequiredArgsConstructor注解,这个使用方式也可以应用于service层     * */    private final ITestService testService;    @GetMapping("/status3")    public Result<?> status() {        return testService.status();    }}

我们在使用这些创建方法时,都可以调出IDEA的结构(Structure)面板进行查看,如下图所示。

可以看到,在这个类中,已经存在我们所需要注入的内容。

在网上有博主总结了一张表,但因为到处能看到,不知原来出处是哪里。

# 总结

在使用中,使用构造方法是比较可行的,加上lombok,其实也可以到达非常简便。

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

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

相关文章

前端学习——Web API (Day3)

事件流 事件流和两个阶段说明 事件捕获 事件冒泡 阻止冒泡 解绑事件 事件委托 案例 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta http-equiv"X-UA-Compatible" content"IEedge" …

day1-搜索插入位置

搜索插入位置 给定一个排序数组和一个目标值&#xff0c;在数组中找到目标值&#xff0c;并返回其索引。如果目标值不存在于数组中&#xff0c;返回它将会被按顺序插入的位置。 请必须使用时间复杂度为 O(log n) 的算法。 示例 1: 输入: nums [1,3,5,6], target 5 输出: …

flutter开发实战-底部bottomNavigationBar➕PageView

flutter开发实战-底部bottomNavigationBar tabbar在app中非常常见&#xff0c;底部BottomNavigationBar属性 一、BottomNavigationBar属性 BottomNavigationBar组件的常用属性&#xff1a; type&#xff1a;tabbar样式&#xff0c;默认为白色不显示&#xff1b;fixedColor:t…

AR眼镜:可视化声音

推荐&#xff1a;将 NSDT场景编辑器加入你的3D工具链 3D工具集&#xff1a; NSDT简石数字孪生 音频可以包括各种各样的声音&#xff0c;从人类语音到非语音声音&#xff0c;如狗吠和警笛声。在为有听力障碍的人设计可访问的应用程序时&#xff0c;应用程序应该能够识别声音并理…

【二分查找】面试题 08.03. 魔术索引

面试题 08.03. 魔术索引 解题思路 改写递归二分查找的思路首先查找mid的值是不是mid 如果是 由于有多个解&#xff0c;那么递归搜索左半边的空间然后如果没找到&#xff0c;首先搜索左半边的空间&#xff0c;然后搜索右半边的空间 class Solution {public int res -1;privat…

mybatis-plus案例报错

报错信息: Error creating bean with name ‘dataSource’ defined in class path resource [org/springframework/boot/autoconfigure/jdbc/DataSourceConfiguration$Generic.class]: Bean instantiation via factory method failed; nested exception is org.springframework…

ELK 企业级日志分析系统(一)

ELK 一、ELK理论日志管理方案为什么要使用ELK完整日志系统基本特征ELK 简介ELK 的工作流程 二、ELK实验ELK Elasticsearch 集群部署ELK Logstash 部署&#xff08;在 apche节点上操作&#xff09;ELK Kiabana 部署&#xff08;在 Node1 节点上操作) 一、ELK理论 日志管理方案 …

django对数据库中的表进行重新生成

删除数据库中的表删除项目中migrations包下的初始化文件 进入到manage.py目录下执行命令python manage.py makemigrations执行完上述命令之后&#xff0c;再执行命令python manage.py migrate就可以啦 关于详细的数据表生成见博文&#xff1a;https://blog.csdn.net/David_hou…

IO多路复用之select,poll,epoll

所以&#xff0c;我们调用 select 会把所有要管理的 socket 的 fd (文件描述符&#xff0c;Linux下皆为文件&#xff0c;简单理解就是通过 fd 能找到这个 socket)传到内核中。 此时&#xff0c;要遍历所有 socket&#xff0c;看看是否有感兴趣的事件发生。如果没有一个 socket…

Linux常见维护报错,修复MBR引导/修复grub2菜单/内核文件丢失

目录 一&#xff0c;修复MBR 1.模拟MBR损坏 2.重启查看系统 3.借助当前系统的光盘来进行修复 4.进入修复模式 进行修复 5.恢复正常 二&#xff0c;修复grub2菜单 1.出现情况 2.进入修复模式 3.进行修复grub2菜单 4.退出重启即可 三&#xff0c;内核文件丢失 1.进入安全模式 2.挂…

进销存软件哪个好?怎么选?(附模板)

已经把挑选进销存软件的几个注意点归纳的很到位了&#xff1a; 软件价格收费模式&#xff08;按年付费还是一次性买断&#xff09;功能要贴合本企业使用注重数据的准确性与安全性操作一定要简单要有良好的售后服务支持 在这几点的基础上&#xff0c;我简单说一下&#xff1a;…

运维开发面试题第四期(最后有数据库的题)

linux 如何查看当前linux系统的版本号&#xff08;uname -a 内核 cat /proc/version版本&#xff09;、系统状态《如CPU使用&#xff08;top - bn&#xff09;&#xff0c;内存使用情况&#xff08;vmstat,free-m&#xff09;》、如何查看监控磁盘 io负载&#xff08;iostat/ls…

Docker部署Mysql数据库详解

目录 1. Docker部署Mysql 1.1 Mysql容器 1.1.1 创建Mysql容器 1.1.2 进入Mysql容器并登录Mysql 1.1.3 持久化数据 1.2 远程登录Mysql 1.2.1 修改root加密方式 1.2.2 在容器启动时配置加密方式为mysql_native_password 1.3 Mysql编码 1.3.1 Mysql编码问题 1.3.2 Mysql编码…

虚函数是什么?虚函数是怎么实现的?什么时候用虚函数?

发现自己的笔记记录得四处都是&#xff0c;这些天统一整理汇总一下 1. 虚函数和多态的关系&#xff1a; 虚函数 往往 用于 实现 C的多态性 2. 什么是多态&#xff1a; &#xff08;1&#xff09;Wiki定义 &#xff1a; 指计算机程序运行时&#xff0c;相同的消息 发送给 多…

Acwing 848.有向图的拓扑序列

Acwing 848.有向图的拓扑序列 链接&#xff1a;848. 有向图的拓扑序列 - AcWing题库 /* 啥是拓扑排序? 首先要满足有向无环图的条件 一个有向图&#xff0c;如果图中有入度为 0 的点&#xff0c;就把这个点删掉&#xff0c;同时也删掉这个点所连的边。 一直进行上面出处理&am…

一个合格的测试人员需要具备迅速的反馈力

01 反馈指的是&#xff1a;在信息的传播中&#xff0c;接受者对传播者发出信息的反映。反馈得很重要一个属性就是时间滞延。在测试活动中&#xff0c;笔者经常会团队的测试人员一个问题&#xff1a;开发提交了一段代码后&#xff0c;多久能收到质量反馈&#xff1f;是按天&…

腾讯云轻量应用服务器性能测评一下,感觉还行吧

腾讯云轻量应用服务器性能如何&#xff1f;轻量服务器CPU内存带宽配置高&#xff0c;CPU采用什么型号主频多少&#xff1f;轻量应用服务器会不会比云服务器CVM性能差&#xff1f;腾讯云服务器网详解CPU型号主频、内存、公网带宽和系统盘存储多维对比&#xff0c;相对于CVM云服务…

Vue电商项目--登录与注册

登录注册静态组件 刚刚报了一个错误&#xff0c;找不到图片的资源 assets文件夹--放置全部组件共用静态资源 在样式当中也可以使用符号【src别名】。切记在前面加上 注册业务上 先修改原先的接口成这个按钮 然后把input框里面的数据保存到data中 注册业务下 就是点击获…

渠道归因(三)基于Shapley Value的渠道归因

渠道归因&#xff08;三&#xff09;基于Shapley Value的渠道归因 通过Shapley Value可以计算每个渠道的贡献权重&#xff0c;而且沙普利值的计算只需要参加的渠道总数&#xff0c;不考虑顺序&#xff0c;因此计算成本也较低。 传统的shapeley value import itertools from …

2.带你入门matlab数理统计常见分布的概率密度函数(matlab程序)

1.简述 计算概率分布律及密度函数值 matlab直接提供了通用的计算概率密度函数值的函数&#xff0c;它们是pdf 和namepdf函数&#xff0c;使用方式如下&#xff1a; Ypdf(‘name’&#xff0c;K&#xff0c;A&#xff0c;B)或者&#xff1a;namepdf (K&#xff0c;A&#xff0c;…