👉
这是一个或许对你有用
的社群
🐱
一对一交流/面试小册/简历优化/求职解惑,欢迎加入
「
芋道快速开发平台
」
知识星球。
下面是星球提供的部分资料:
👉
这是一个或许对你有用的开源项目
国产 Star 破 10w+ 的开源项目,前端包括管理后台 + 微信小程序,后端支持单体和微服务架构。
功能涵盖 RBAC 权限、SaaS 多租户、数据权限、商城、支付、工作流、大屏报表、微信公众号等等功能:
-
Boot 仓库:https://gitee.com/zhijiantianya/ruoyi-vue-pro
-
Cloud 仓库:https://gitee.com/zhijiantianya/yudao-cloud
-
视频教程:https://doc.iocoder.cn
【国内首批】支持 JDK 21 + SpringBoot 3.2.2、JDK 8 + Spring Boot 2.7.18 双版本
来源:juejin.cn/post/
7080441168462348319
大家在使用IDEA开发的时候有没有注意到过一个提示,在字段上使用Spring的依赖注入注解
@Autowired
后会出现如下警告
Field injection is not recommended (字段注入是不被推荐的)
但是使用
@Resource
却不会出现此提示
网上文章大部分都是介绍两者的区别,没有提到为什么,当时想了好久想出了可能的原因,今天来总结一下
-
-
Setter注入
:调用Setter的方法注入依赖
-
字段注入
:在字段上使用
@Autowired/Resource
注解
事实上,他们的基本功能都是通过注解实现
依赖注入
,只不过
@Autowired
是
Spring
定义的,而
@Resource
是
JSR-250
定义的。大致功能基本相同,但是还有一些细节不同:
-
依赖识别方式
:
@Autowired
默认是
byType
可以使用
@Qualifier
指定Name,
@Resource
默认ByName
如果
找不到则ByType
-
适用对象
:
@Autowired
可以对
构造器、方法、参数、字段
使用,
@Resource
只能对
方法、字段
使用
-
提供方
:
@Autowired
是
Spring
提供的,
@Resource
是
JSR-250
提供的
基于 Spring Boot + MyBatis Plus + Vue & Element 实现的后台管理系统 + 用户小程序,支持 RBAC 动态权限、多租户、数据权限、工作流、三方登录、支付、短信、商城等功能
-
项目地址:https://github.com/YunaiV/ruoyi-vue-pro
-
视频教程:https://doc.iocoder.cn/video/
参考Spring官方文档,建议了如下的使用场景:
-
构造器注入
:
强依赖性
(即必须使用此依赖),
不变性
(各依赖不会经常变动)
-
Setter注入
:
可选
(没有此依赖也可以工作),
可变
(依赖会经常变动)
-
Field注入
:大多数情况下尽量
少使用
字段注入,一定要使用的话,
@Resource相对@Autowired
对IoC容器的
耦合更低
基于 Spring Cloud Alibaba + Gateway + Nacos + RocketMQ + Vue & Element 实现的后台管理系统 + 用户小程序,支持 RBAC 动态权限、多租户、数据权限、工作流、三方登录、支付、短信、商城等功能
-
项目地址:https://github.com/YunaiV/yudao-cloud
-
视频教程:https://doc.iocoder.cn/video/
-
-
依赖对外部不可见
,外界可以看到构造器和setter,但无法看到私有字段,自然无法了解所需依赖
-
会导致
组件与IoC容器紧耦合
(这是最重要的原因,离开了IoC容器去使用组件,在注入依赖时就会十分困难)
-
-
依赖过多时不够明显
,比如我需要10个依赖,用构造器注入就会显得庞大,这时候应该考虑一下此组件是不是
违反了单一职责原则