SpringIoC & DI(5):DI详解
文章目录
- SpringIoC & DI(5):DI详解
-
- 观前提醒
- 1. @Autowired 存在的问题
-
- 解决方法(三个):
-
- 第一种:@Primary
- 第二种:@Qualifier
-
- 另一个使用场景:
- 第三种:@Resource
- 总结:
- 2. @Resource 和 @Autowired 的区别(高频面试题)
- 3.总结:
观前提醒
这篇博客的代码,是比较简单的。 你自己可以创建类,使用注解,调用对象,就能够看见效果。
或者,你获取我的源码: https://gitee.com/mrbgvhbhjv/java-ee-course/tree/master/%E5%90%8E%E7%AB%AF%E4%BB%A3%E7%A0%81/SpringIoC_demo_20251025
1. @Autowired 存在的问题
@Autowired 这个注解,是根据 类的类型 去寻找对象的。 
这种方式,和我们 使用 根据对象的类型,获取 Bean 的代码一样,有缺点: 当同个类型的对象,有多个的时候,就会报错。
例如:有多个 Student类型 的对象,使用 @Autowired 进行依赖注入,会失败: 
解决方法(三个):
解决方法有三个:
第一种:@Primary
通过 @Primary,用于多个类型的某一个对象上,确定这个对象,在依赖注入时的最高优先级。 依赖注入时,优先注入被 @Primary 标记的对象。

第二种:@Qualifier
@Qualifier:结合 @Autowired, 根据 Bean的名称 获取对象 @Autowired:根据对象的类型来获取 @Qualifier + @Autowired:根据 Bean的名称获取 Bean

另一个使用场景:
@Bean + @Qualifier,确定方法参数中,使用的 类型。 
第三种:@Resource
@Resource,这个注解,是由 JDK 提供的依赖注入的 注解。 它的作用等同于:@Qualifier + @Autowired
@Resource,这个注解,它编写的时候,没有默认的属性 value,所以,我们需要手动加上 name = "Bean的名称"。
总结:
更多的时候,解决 多个相同类型的对象的依赖注入问题,我们使用的是:@Resource 或者 @Qualifier + @Autowired
@Primary,几乎不用。
2. @Resource 和 @Autowired 的区别(高频面试题)
@Autowird 与 @Resource的区别
-
@Autowired 是 Spring框架 提供的注解,而@Resource是JDK提供的注解
-
@Autowired 默认是按照类型注入,而@Resource是按照名称注入。
相比于 @Autowired 来说,@Resource 支持更多的参数设置,例如 name 设置,根据名称获取 Bean。
@Autowired 默认是按照类型注入,而@Resource是按照名称注入。这句话,并不严谨,但是,上述回答,面试官喜欢听。 讲完之后,还需要讲解,为什么不严谨。
@Resource :类型 + 名称 进行依赖注入 @Autowired:类型 进行依赖注入 所以,建议回答的时候,再添加一个条件:同一个类的情况下,@Autowired 默认是按照类型注入,而@Resource是按照名称注入。
@Autowired 虽说是按照 类型 进行依赖注入,但是,它赋值时的那个变量名,是有影响的:
但是,实际开发中,我们并不会这么干,因为这样的写法,很容易出现 bug,还是要严格按照 接口文档描述的来写代码。
这种情况的发生,和 Autowired注解 的装配顺序有关: 
Autowired注解 的装配顺序(优先级):
首先:根据类型查找
然后:根据 @Qualifier 定义的名称查找(写有 @Qualifier 的情况下,不会在再往下查找了)
最后:
3.1 没有 写上@Qualifier 的情况下:根据赋值的那个 引用变量的名称 进行查找
3.2 写有 @Qualifier 的情况下, 不会 根据赋值的那个 引用变量的名称 进行查找
都找不到,无法 依赖注入,就会报错。
3.总结:
有多个 相同类型(例如:多个 Student类型 ) 的对象,使用 @Autowired 进行依赖注入,会失败。 解决方法有三个:
更多的时候,解决 多个相同类型的对象的依赖注入问题,我们使用的是:@Resource 或者 @Qualifier + @Autowired @Primary,几乎不用。
@Resource 和 @Autowired 的区别(高频面试题):
-
@Autowired 是 Spring框架 提供的注解,而@Resource是JDK提供的注解
-
@Autowired 默认是按照类型注入,而@Resource是按照名称注入。
相比于 @Autowired 来说,@Resource 支持更多的参数设置,例如 name 设置,根据名称获取 Bean。
最后,如果这篇博客能帮到你的,请你点点赞,有写错了,写的不好的,欢迎评论指出,谢谢! 下一篇博客:SpringIoC & DI(6):SpringIoC & DI总结总结



