Resource与Autowired注解
#为什么不推荐使用@Autowired
依赖注入 有三种形式
属性注入
最常用的就是 属性注入
1
2
3
4
5
6
public class AppointmentNumberConfigurationController {
private AppointmentNumberConfigurationService numberConfigurationService;
}构造器注入
Constructor Injection是构造器注入,是我们最为推荐的一种使用方式。
但是, 每次注入都按照这样的流程去构造注入的话, 会显得比较麻烦.set
方法 注入set 方法注入也会用到
@Autowired
注解,但使用方式与属性注入有所不同,
属性注入是用在成员变量上,而set 方法的时候,是用在成员变量的Setter函数上。
使用 属性注入 时,可能会出现
基于属性注入的方式,违背 单一职责 原则
现在的也无 一般都会使用 很多依赖,但拥有太多依赖 通常意味着更多的责任,显然违背 单一职责 原则,并且 类和依赖 强耦合,不能在 容器外 使用
属性注入的方式,容易使得 Spring 初始化失败
因为 Spring ,特别是 SpringBoot 的使用中,经常会因为 初始化的时候,由于 属性在被注入之前 就引用导致 npe,进而导致 容器初始化失败
Java 在 初始化一个类的时候,是按照 :
静态变量或静态语句块 -> 实例对象或初始化语句块 -> 构造方法 -> @Autowired
所以 在执行这个类的构造方法时, 对象尚未被注入, 他的值还是null
**通过
@Autowired
注入,又因为是 通过类型 注入,因此可能会出现 两个相同类型的Bean
**
进而导致 装填失败
解决方案
如果一定要使用 属性注入, 尽量使用
@Resource
代替,如果想通过ByName
注入,那么可以使用Qualifier
如果可能,尽量使用 构造注入
Lombok
提供了一个@RequiredArgsConstructor
,可以方便我们进行 快速 构造注入1
2
3
4
5
6
public class AppointmentNumberConfigurationController {
final AppointmentNumberConfigurationService numberConfigurationService;
}
#为什么推荐使用@Resource,不推荐使用@Autowired
因为@Autowired
注解在Bean 注入的时候是基于ByType, 因此会由于注入两个相同类型的Bean导致装配失败
@Resource
的作用相当于@Autowired
,只不过 @Autowired
按照byType自动注入。
如果我们想使用按照名称byName来装配,可以结合 @Qualifier
注解一起使用。
@Resource
装配顺序:
- 如果同时指定了name和type,则从Spring上下文中找到唯一匹配的bean进行装配,找不到则抛出异常。
- 如果指定了name,则从上下文中查找名称(id)匹配的bean进行装配,找不到则抛出异常。
- 如果指定了type,则从上下文中找到类型匹配的唯一bean进行装配,找不到或是找到多个,都会抛出异常。
- 如果既没有指定name,又没有指定type,则自动按照byName方式进行装配;如果没有匹配,则回退为一个原始类型进行匹配,如果匹配则自动装配。
#@Autowired, @Qualifier, @Resource, 三者有何区别
@Autowired
: 通过byType 方式进行装配, 找不到或是找到多个,都会抛出异常。@Qualifier
: 如果想让 @Autowired
注入的Bean进行 byName装配, 可以使用 @Qualifier
进行指定@Resource
:作用相当于 @Autowired
,只不过 @Resource
默认按照byName方式装配, 如果没有匹配, 则退回到 byType 方式进行装配
- Title: Resource与Autowired注解
- Author: cccs7
- Created at : 2025-03-01 23:09:27
- Updated at : 2025-03-01 23:12:39
- Link: https://cs7eric.github.io/2025/03/01/@Resource、@Autowired/
- License: This work is licensed under CC BY-NC-SA 4.0.