Hi,大家好,我是 Mic。
一个工作 2 年的粉丝,问我一个 Spring 外面的问题。
心愿我能从不同的视角去剖析,而后碾压面试官。
这个问题是:“@Resource 和 @Autowired”的区别。
上面看看普通人和高手的答复
普通人:
@Resource 和 @Autowired 的区别我认为是在它们的一个注入的一个形式上
@Resource 它是依据 name 来进行注入的,@Autowired 是依据类型来注入的。
高手:
好的,面试官。
@Resource 和 @Autowired 这两个注解的作用都是在 Spring 生态外面去实现 Bean 的依赖注入。
上面我别离说一下 @Autowired 和 @Resource 这两个注解。
闪现 [@Autowired 的作用详解] 几个字。
首先,@Autowired 是 Spring 外面提供的一个注解,默认是依据类型来实现 Bean 的依赖注入。
@Autowired 注解外面有一个 required
属性默认值是 true,示意强制要求 bean 实例的注入,
在利用启动的时候,如果 IOC 容器外面不存在对应类型的 Bean,就会报错。
当然,如果不心愿主动注入,能够把这个属性设置成 false。
其次呢,如果在 Spring IOC 容器外面存在多个雷同类型的 Bean 实例。因为 @Autowired 注解是依据类型来注入 Bean 实例的
所以 Spring 启动的时候,会提醒一个谬误,大略意思本来只能注入一个单实例 Bean,
然而在 IOC 容器外面却发现有多个,导致注入失败。
当然,针对这个问题,咱们能够应用 @Primary 或者 @Qualifier 这两个注解来解决。
@Primary 示意次要的 bean,当存在多个雷同类型的 Bean 的时候,优先应用申明了 @Primary 的 Bean。
@Qualifier 的作用相似于条件筛选,它能够依据 Bean 的名字找到须要拆卸的指标 Bean。
闪现 [@Resource 的作用详解] 几个字。
接下来,我再解释一下 @Resource 注解。
@Resource 是 JDK 提供的注解,只是 Spring 在实现上提供了这个注解的性能反对。
它的应用形式和 @Autowired 完全相同,(如图)最大的差别于 @Resource 能够反对 ByName 和 ByType 两种注入形式。
如果应用 name,Spring 就依据 bean 的名字进行依赖注入,如果应用 type,Spring 就依据类型实现依赖注入。
如果两个属性都没配置,就先依据定义的属性名字去匹配,如果没匹配胜利,再依据类型匹配。两个都没匹配到,就报错。
最初,我再总结一下。
- @Autowired 是依据 type 来匹配,@Resource 能够依据 name 和 type 来匹配,默认是 name 匹配。
- @Autowired 是 Spring 定义的注解,@Resource 是 JSR 250 标准外面定义的注解,而 Spring 对 JSR 250 标准提供了反对。
- @Autowired 如果须要反对 name 匹配,就须要配合 @Primary 或者 @Qualifier 来实现。
以上就是我对这个问题的了解。
总结
大家能够关注高手局部的答复,他的逻辑构造很清晰的。
他是十分直观的通知面试官这两个注解的差别,同时又基于两个注解的个性解释了更多的差别。
最初做了一个简短的总结。
大家在面试的时候能够参考相似的答复思路。
喜爱我的作品的小伙伴记得点赞和珍藏加关注。
版权申明:本博客所有文章除特地申明外,均采纳 CC BY-NC-SA 4.0 许可协定。转载请注明来自
Mic 带你学架构
!
如果本篇文章对您有帮忙,还请帮忙点个关注和赞,您的保持是我一直创作的能源。欢送关注同名微信公众号获取更多技术干货!