Su的技术博客

  • 首页
  • 原创
  • 视频
  • Java
  • MySQL
  • DDD
  • 事故复盘
  • 架构方案
  • AI
  • Other
  • 工具
    • AI工具集
    • 工具清单
    • JSON在线格式化
    • JSON在线比较
    • SQL在线格式化
  • 打赏
  • 关于
路很长,又很短
  1. 首页
  2. Java
  3. 正文
                           

【原创】用了@Autowired注入,竟然被警告

2020-07-09 2124点热度 0人点赞 0条评论
用了@Autowired注入,竟然被警告
点击上方蓝色字关注我们~

01

问题背景

用了@Autowired注入,竟然被警告

最近,在使用idea开发时业务系统时,发现idea上使用了@Autowired,发现竟然被警告了!提示:Field injection is not recommended,警告如下图:

用了@Autowired注入,竟然被警告

what?Field injection is not recommended. (不推荐使用属性注入)

这不是常规操作吗?我们在开发的时候经常使用@Autowired将Bean注入到容器里,已经是非常正规的操作了,凭什么警告我呢?

用了@Autowired注入,竟然被警告

02

原来如此

这里我们先了解下依赖注入的几种方式:构造器注入、setter注入、属性注入。
1)构造方法注入
为了强制依赖,或者为了易变性,使用构造方法注入。
private final DependencyA dependencyA;@Autowiredpublic Controller(DependencyA dependencyA){    this.dependencyA = dependencyA;}

 

2)setter方法注入

为了可选的或者可变的依赖,使用setter注入。
private DependencyA dependencyA;    @Autowiredpublic void setDependencyA(DependencyA dependencyA){    this.dependencyA = dependencyA;}

 

3)属性Field注入
通过反射直接注入到fields。
@Autowiredprivate DependencyA dependencyA;

 

为什么我们经常使用属性field进行注入呢?
其很明显的好处:
变量方式注入非常简洁,直接在属性上增加注解即可,没有任何多余代码,非常有效的提高了java的简洁性。即使再多几个依赖一样能解决掉这个问题。
 
为什么不推荐使用属性Field进行注入呢?
有其坏处:
①不能使用属性注入的方式构建不可变对象;
②类和依赖容器强耦合,不能在容器外使用;
③类不能绕过反射(例如单元测试的时候)进行实例化,必须通过依赖容器才能实例化;
④实际的依赖被隐藏在外面,不是在构造方法或者其它方法里面反射的;
但是,假设一个类经常会有超过10个的依赖。如果使用构造方法的方式注入的话,构造方法会有10个参数,明显不优雅甚至很不科学。如
果使用属性注入的话就没有这样的限制。但是一个类有很多的依赖,是一个危险的标志,因为很有可能这个类完成了超过一件事,违背了单一职责原则。
 
所以,idea也建议我们尽量使用构造器的方式注入:

用了@Autowired注入,竟然被警告

03

扩展

@Autowired、@Inject、@Resource三者区别
在我们开发spring相关的应用系统时,使用@Autowired、@Resource作为Bean的注入,是比较常见的。@Inject这个注解我是比较晚(毕竟比@Resource 对应的规范出来的晚,JSR330>JSR250嘻嘻)才使用到的。
那么@Autowired、@Inject、@Resource这三个注解你知道有什么区别吗?
(也可能会在面试中出现哦)
区别:
1)@Autowired是spring自带的注解,@Resource是JSR250规范实现的,@Inject是JSR330规范实现的,需要导入不同的包;
2)@Resource如果既没有指定name,又没有指定type,则自动按照byName方式进行装配;如果没有匹配,则回退为一个原始类型进行匹配,如果匹配则自动装配;
3)@Autowired、@Inject用法基本一样,不同的是@Autowired有一个request属性;
4)@Autowired如果需要按照名称匹配需要和@Qualifier一起使用,@Inject和@Name一起使用;
5)@Autowired、@Inject是默认按照类型匹配的,@Resource是按照名称匹配的。
 

04

总结

 

1)使用Field注入有其坏处:不能注入不可变对象;类和依赖容器强耦合;不能绕过反射进行实例化注入等。
2)依赖注入一般有三种方式:构造器注入、setter方法注入、属性field注入。
3)区分@Autowired、@Inject、@Resource之间的不同:@Autowired与@Inject类似,不过一个spring、一个是JSR330规范。@Autowired、@Inject是默认按照类型匹配的,@Resource是按照名称匹配的等。
4)可以结合实际的使用情况和使用Field注入的缺点进行权衡是否不使用此种方式。虽然说属性Field注入不被推荐,但是我们在日常开发中也会去使用,毕竟可以让代码简洁和提高开发效率。
 
PS:看到idea出现波浪线,时常会让有强迫症的码农难受,如果你不想看到,可以在idea设置将其去除:选择File--Settings--Inspections,然后在右侧搜索 spring Core,Autowiring for bean class【去掉自动装配依赖对象的红线警告】 和 Field injection warning【去掉黄色背景】后面的√即可。

 

参考资料:

https://www.cnblogs.com/pjfmeng/p/7551340.html

https://www.jianshu.com/p/7f20176f2a40

https://www.jianshu.com/p/36db3e167958

https://blog.csdn.net/zhangjingao/article/details/81094529

https://www.4spaces.org/field-injection-is-not-recommended-solution/

 

回复公众号【资料】获得干货资料集锦:技术ppt、IT大会资料、架构、分布式资料等。
推荐好文

1、互联网Code Review最佳实践分享

2、dubbo面试题!会这些,说明你看懂了dubbo源码

3、Kafka面试题!掌握它才说明你真正懂Kafka
4、
Netty 5.0为啥被舍弃?原因竟然是...
5、
中台之上——业务架构系列【汇总】

6、必备瑞士军刀IDEA插件,你使用了哪些

7、线上热更新代码只需3步 Arthas实战

8、Eureka源码剖析之七:架构&面试题【总结】

9、互联网工程师应该用这种姿势打印日志

10、加入:互联网基础/架构交流群

用了@Autowired注入,竟然被警告

-关注搬运工来架构,与优秀的你一同进步-

原创不易,如果喜欢这篇文章可以点在看哦↘

本文仅供学习!所有权归属原作者。侵删!文章来源: 搬运工来架构

更多文章:

  1. Spring中@Autowired和@Inject注解的区别?
  2. Chrome插件(扩展)开发全攻略2.6w字,看这篇就够了!
  3. Spring事务无法生效的11个场景
  4. 既生@Resource,何生@Autowired?
  5. 聊聊spring事务失效的12种场景,太坑了
  6. 迄今为止最完整的DDD实践
  7. 大家一直在谈的领域驱动设计(DDD),我们在互联网业务系统是这么实践的
  8. 从代码到设计的性能优化指南
  9. Eureka源码剖析之一:初始化-启动
  10. 殷浩详解DDD系列 第二讲 - 应用架构
标签: 原创 IDEA @Autowired Spring 依赖注入
最后更新:2023-12-20

Cocodroid

专注Java后端,分享技术。

打赏 点赞
< 上一篇
下一篇 >

文章评论

razz evil exclaim smile redface biggrin eek confused idea lol mad twisted rolleyes wink cool arrow neutral cry mrgreen drooling persevering
取消回复

广告
最新 热点 推荐
最新 热点 推荐
Anthropic Code with Claude 开发者大会:开启 AI Agent 新时代 视频笔记-微服务架构P4:必懂5种设计模式 视频笔记:微服务架构P4 设计模式:每服务数据库、API 网关和事件驱动架构 干货 | 论Elasticsearch数据建模的重要性 马蜂窝消息总线——面向业务的消息服务设计 基于 MySQL Binlog 实现可配置的异构数据同步 视频笔记:Google发布Agent2Agent协议 视频笔记:什么是微服务,为什么是微服务?
基于 MySQL Binlog 实现可配置的异构数据同步马蜂窝消息总线——面向业务的消息服务设计视频笔记:微服务架构P4 设计模式:每服务数据库、API 网关和事件驱动架构干货 | 论Elasticsearch数据建模的重要性视频笔记-微服务架构P4:必懂5种设计模式Anthropic Code with Claude 开发者大会:开启 AI Agent 新时代
既生@Resource,何生@Autowired? 系统设计 | 系统设计中需要考虑到的时间问题 笔记 | JVM内存区域结构:一计两栈一堆一区 Elasticsearch 使用误区之三——分片设置不合理 微博话题高性能降级设计-final.pdf 理解领域驱动设计DDD 分布式事务场景、概念和方案整理(含概念图) 3.编程语言的演化(译)

CRUD (1) Event Sourcing (1) graphql (1) id (1) NoSQL (1) quarkus (1) rest (1) RocketMQ (2) Spring Boot (1) zk (1) zookeeper (1) 上下文 (1) 事务消息 (1) 二级缓存 (1) 值对象 (1) 关系数据库 (1) 分布式缓存 (1) 原子性 (1) 唯一ID (1) 商品 (1) 多对多 (1) 子域 (1) 字符集 (1) 客户端心跳 (1) 幂等 (2) 干货 (1) 并发 (1) 应用场景 (1) 应用架构图 (1) 康威定律 (2) 异步复制 (1) 微服务架构 (3) 总体方案 (1) 技术方案 (2) 技术架构 (2) 技术架构图 (1) 技能 (1) 持续集成 (1) 支撑域 (1) 故障恢复 (1) 数据架构图 (1) 方案选型 (1) 日记 (1) 服务发现 (1) 服务治理 (1) 服务注册 (2) 机房 (1) 核心域 (1) 泄漏 (1) 洋葱架构 (1) 消息队列 (5) 源码剖析 (1) 灰度发布 (1) 熔断 (1) 生态 (1) 画图工具 (1) 研发团队 (1) 线程 (2) 组织架构 (1) 缓存架构 (1) 编码 (1) 视频 (20) 读写分离 (1) 贵州 (1) 软件设计 (1) 迁移 (1) 通用域 (1) 集群化 (1) 雪花算法 (1) 顺序消息 (1)

推荐链接🔗
  • AI工具集
  • 工具箱🛠️

COPYRIGHT © 2014-2025 verysu.com . ALL RIGHTS RESERVED.

Theme Kratos Made By Seaton Jiang

粤ICP备15033072号-2