Java面试题:让依赖注入变得简单,面对@Autowired和@Resource,该如何选择?
@Autowired和@Resource都是Java Spring框架中的注解,用于实现依赖注入(DI)和控制反转(IoC)。
它们的区别主要在以下三个方面:
源头不同
@Autowired是Spring自带的注解,而@Resource是JSR 250规范中定义的注解。因此,在使用Spring框架的时候,通常建议使用@Autowired注解。
查找顺序不同
在注入Bean时,@Autowired注解的查找顺序为:先按类型(byType)匹配,如果有多个Bean符合该类型,则再按照名称(byName)进行匹配。如果两种方式都无法唯一确定Bean,则会抛出异常。
伪代码如下:
public class Person {
private Phone phone;
@Autowired
public void setPhone(Phone phone) {
this.phone = phone;
}
//...
}
public interface Phone {
//...
}
@Component("apple")
public class ApplePhone implements Phone {
//...
}
@Component("huawei")
public class HuaweiPhone implements Phone {
//...
}
在上面的示例中,如果有ApplePhone和HuaweiPhone两个Bean都实现了Phone接口,那么当Person类的setPhone方法被调用时,Spring会根据类型匹配到这两个Bean,但是无法唯一确定,此时会抛出异常。可以通过添加@Qualifier注解来指定具体的Bean:
伪代码如下:
@Autowired
@Qualifier("apple")
public void setPhone(Phone phone) {
this.phone = phone;
}
而@Resource注解的查找顺序为:先按照名称(byName)进行匹配,如果无法匹配到Bean,则再按照类型(byType)进行匹配。
伪代码如下:
public class Person {
private Phone phone;
@Resource(name = "apple")
public void setPhone(Phone phone) {
this.phone = phone;
}
//...
}
@Component("apple")
public class ApplePhone implements Phone {...}
@Component("huawei")
public class HuaweiPhone implements Phone {...}
在上面的示例中,当Person类的setPhone方法被调用时,Spring会先根据名称查找是否有名称为"apple"的Bean,如果有,则直接注入;如果没有,则再根据类型匹配。
适用范围不同
@Autowired注解可以用于构造器、Setter方法、字段和方法上,而@Resource注解只能用于字段和方法上。因此,如果需要在构造器中注入Bean,就必须使用@Autowired注解。综上所述,建议在使用Spring框架时,尽量使用@Autowired注解。
以下是具体的代码示例:
public interface Phone {
String brand();
}
@Component("apple")
public class ApplePhone implements Phone {
@Override
public String brand() {
return "Apple";
}
}
@Component("huawei")
public class HuaweiPhone implements Phone {
@Override
public String brand() {
return "Huawei";
}
}
@Component
public class Person {
// 使用@Autowired注解进行注入
@Autowired
private Phone phone1;
// 使用@Resource注解进行注入,指定名称
@Resource(name = "apple")
private Phone phone2;
private Phone phone3;
public void setPhone3(Phone phone3) {
this.phone3 = phone3;
}
// 使用@Autowired注解和@Qualifier注解进行注入
@Autowired
@Qualifier("huawei")
public void setPhone4(Phone phone4) {
this.phone4 = phone4;
}
}
在上面的示例中,Person类中有四个属性需要注入Bean。其中,phone1属性使用了@Autowired注解,使用默认的查找方式进行注入;phone2属性使用了@Resource注解,并指定了名称为"apple"的Bean进行注入;phone3属性没有。
总结一下:
@Autowired是Spring框架提供的注解,@Resource是Java EE 5规范提供的注解。
@Autowired默认按照类型自动装配,而@Resource默认按照名称自动装配。
@Autowired支持@Qualifier注解来指定装配哪一个具有相同类型的bean,而@Resource 默认按照名称进行注入,如果指定了name或者type属性,则会按照指定的名称或者类型来查找对应的Bean实例进行注入。
综上所述,@Autowired更加灵活,但也更加复杂;@Resource更加简单、直观,适用于简单的场景。
往期面试题:
Java面试题:如果你这样做,你会后悔的,两次启动同一个线程~~~
Java面试题:@PostConstruct、init-method和afterPropertiesSet执行顺序?
Java面试题:SimpleDateFormat是线程安全的吗?使用时应该注意什么?
Java面试题:细数ThreadLocal大坑,内存泄露本可避免
Java面试题:为什么HashMap不建议使用对象作为Key?
Java面试题:你知道Spring的IOC吗?那么,它为什么这么重要呢?
Java面试题:Spring Bean线程安全?别担心,只要你不写并发代码就好了!
Java面试题:Spring框架除了IOC和AOP,还有哪些好玩的设计模式?
Java面试题:让依赖注入变得简单,面对@Autowired和@Resource,该如何选择?的更多相关文章
- Java 控制反转和依赖注入模式【翻译】【整理】
Inversion of Control Containers and the Dependency Injection pattern --Martin Fowler 本文内容 Component ...
- java 控制反转和依赖注入的理解
开始好好学习java基础和思想~ 控制反转(IOC)是Spring框架的核心思想,用我自己的话说,就是你要做一件事,别自己可劲new了,你就说你要干啥,然后外包出去就好~ 依赖注入(DI) 在我浅薄的 ...
- 轻松理解 Java开发中的依赖注入(DI)和控制反转(IOC)
前言 关于这个话题, 网上有很多文章,这里, 我希望通过最简单的话语与大家分享. 依赖注入和控制反转两个概念让很多初学这迷惑, 觉得玄之又玄,高深莫测. 这里想先说明两点: 依赖注入和控制反转不是高级 ...
- java控制反转与依赖注入
1.简介 依赖注入和控制反转,目的是为了使类与类之间解耦合,提高系统的可扩展性和可维护性,下面通过一个例子来引入这一概念. 2.案例 1)一般情况下的类耦合 Main.java public clas ...
- JAVA入门[3]—Spring依赖注入
Spring支持属性注入和构造器注入,它支持XML和注解两种方式.本文介绍Spring控制反转容器加载包含beans的XML文件,实现依赖注入. 一.创建bean实例 暂且抛开对象依赖,我们先看下如何 ...
- java之spring之依赖注入
一.DI: Dependency injection; 依赖注入 依赖注入和控制反转是同一个概念的不同说法. 对象的创建依赖于容器.对象属性的设置是由容器来设置. 对象属性的赋值过程称为注入. 二.S ...
- 依赖注入(二)Autofac简单使用
Autofac简单使用 源码下载传上源码,终于学会传文件了. 首先 还是那句话:“不要信我,否则你死得很惨!”. C#常见的依赖注入容器 IoC in .NET part 1: Autofac IoC ...
- 关于asp.net mvc的控制器的依赖注入思考及对StructureMap依赖注入框架的简单实践笔记
写在前面: 依赖注入这个玩意很多人其实都接触过,但可能没有细究其中的原理. 比如Controller的构造函数中,只要你传入一些接口,应用自动就给你处理了创建的过程,无需你手动去new 一个实例并穿进 ...
- 5. Effective Java 第三版——使用依赖注入取代硬连接资源
Tips <Effective Java, Third Edition>一书英文版已经出版,这本书的第二版想必很多人都读过,号称Java四大名著之一,不过第二版2009年出版,到现在已经将 ...
- Effective Java 第三版——5. 使用依赖注入取代硬连接资源
Tips <Effective Java, Third Edition>一书英文版已经出版,这本书的第二版想必很多人都读过,号称Java四大名著之一,不过第二版2009年出版,到现在已经将 ...
随机推荐
- #二分,负环#JZOJ 3852 单词接龙
题目 只要一个单词的最后两个字母和另一个单词的前两个字母相同,那么这两个单词就可以有序的连接起来.给出\(n\)个单词组成单词环,求所有环的环中单词平均长度最大值. 分析 二分答案,判断是否存在正环( ...
- #左偏树,树形dp#洛谷 1552 [APIO2012]派遣
题目 分析 那我指定管理层之后,选择薪水越小的人越好, 考虑小根堆,由于需要合并,所以采用左偏树 代码 #include <cstdio> #include <cctype> ...
- OpenHarmony Camera源码分析
一.简介 当前,开源在科技进步和产业发展中发挥着越来越重要的作用,OpenAtom OpenHarmony(简称"OpenHarmony")赋予了开发者孕育创新的种子,也为数字化产 ...
- 【FAQ】运动健康服务云侧数据常见问题及解答
目录 Q1:v2接口相比于v1接口传参及返回的数据格式有变化吗?是否可以直接将v1接口改成v2接口? Q2:如何获取采集健康数据的穿戴设备信息? Q3:如何处理非华为手机产生的步数调用采样明细接口查询 ...
- 鸿蒙HarmonyOS实战-ArkUI组件(Navigation)
一.Navigation Navigation组件通常作为页面的根容器,支持单页面.分栏和自适应三种显示模式.开发者可以使用Navigation组件提供的属性来设置页面的标题栏.工具栏.导航栏等. 在 ...
- Python2同时输出中文和变量时中文乱码
Python2同时输出中文和变量时中文乱码 一.问题描述 最近在学习tensorflow时,突然发现一个问题,python2在输出中文和变量时会出现一点问题,如下图: 可以看到,输出并不是想要的结果, ...
- React的理解以及特性
一.是什么 React,用于构建用户界面的 JavaScript 库,提供了 UI 层面的解决方案 遵循组件设计模式.声明式编程范式和函数式编程概念,以使前端应用程序更高效 使用虚拟DOM来有效地操作 ...
- 力扣1045(MySQL)-买下所有产品的客户(中等)
题目: Customer 表: Product 表: 写一条 SQL 查询语句,从 Customer 表中查询购买了 Product 表中所有产品的客户的 id. 示例: 解题思路: 建表语句: 1 ...
- 阿里云 MSE 支持 Go 语言流量防护
简介: OpenSergo 开源项目联合 Sentinel 项目,正在制定.完善限流降级标准,方便不同语言应用通过统一控制面来实现统一的微服务治理.阿里云微服务引擎(MSE)也会逐步支持 OpenSe ...
- EventBridge 集成云服务实践
简介:本篇文章主要向大家分享了通过 EventBridge 如何集成云产品事件源,如何集成云产品事件目标以及通过事件流如何集成消息产品. 作者:李凯(凯易) EvenBridge 集成概述 Even ...