首页 > 编程语言 >Java面试题:让依赖注入变得简单,面对@Autowired和@Resource,该如何选择?

Java面试题:让依赖注入变得简单,面对@Autowired和@Resource,该如何选择?

时间:2024-05-16 09:01:29浏览次数:25  
标签:面试题 Java Autowired Resource Phone 注解 public

@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面试题:请谈谈对ThreadLocal的理解?

Java面试题:为什么HashMap不建议使用对象作为Key?

Java面试题:你知道Spring的IOC吗?那么,它为什么这么重要呢?

Java面试题:线程池内“闹情绪”的线程,怎么办?

Java面试题:Spring Bean线程安全?别担心,只要你不写并发代码就好了!

Java面试题:Spring框架除了IOC和AOP,还有哪些好玩的设计模式?

 

标签:面试题,Java,Autowired,Resource,Phone,注解,public
From: https://www.cnblogs.com/marsitman/p/18195206

相关文章

  • vue 面试题
    以下是一些常见的Vue面试题:1.Vue.js是什么?有什么特点?Vue.js是一个用于构建用户界面的渐进式JavaScript框架。它采用了MVVM(模型-视图-视图模型)的架构模式,可以使开发者更容易地构建高效、可维护的Web应用程序。Vue.js具有以下特点:1.简洁:Vue.js的核心库只关注视图层,减少了学习......
  • Java响应式编程
    提纲1、响应式编程ReactiveProgramming2、ReactiveStreams3、Reactor和RxJava1、响应式编程ReactiveProgramming为了解决异步编程中出现的各种问题,程序员们提出了各种的方法和手段去解决这些问题,这些方法和手段就被称为ReactiveProgramming。ReactiveProgramming是一......
  • Java Solon v2.7.6 发布
    JavaSolon是什么框架?Java“新的”应用开发框架。开放原子开源基金会,孵化项目。从零开始构建(非java-ee架构),有灵活的接口规范与开放生态。追求:更快、更小、更简单提倡:克制、简洁、高效、开放、生态有什么特点?更高的计算性价比:并发高2~3倍;内存省50%更快的开发效......
  • Java-SSM-Day03 SpringFramework实战指南(二)
    4.2.2实验二:组件(Bean)依赖注入配置(DI)1.目标:通过配置文件,实现IoC容器中Bean之间的引用(依赖注入的DI配置)主要涉及注入场景:基于构造函数的依赖注入和基于Setter的依赖注入。3.基于构造函数的依赖注入(单个构造参数)基于构造函数的DI是通过容器调用具有多个参数的构......
  • javascript 将变量值作为对象属性 获取对象对应的值
      test(){letform={bar_rule_txt:'{spu}-{master_attr_value}-{slave_attr_alias}',bar_rule_result:'',spu:'JPK1575G',master_attr_value:'黑色',master......
  • JavaScript Object valueOf & toString All In One
    JavaScriptObjectvalueOf&toStringAllInOneclassArrayWrapper{arr:number[];constructor(nums:number[]){this.arr=nums;}//✅改写Object内置方法valueOf,返回一个number整数//❓object相加(本质上是object序列化后的string......
  • Java把List集合转成树形结构
     代码如下:privatestatic<T,K>List<T>listToTree(List<T>list,Predicate<T>isTop,Function<?superT,?extendsK>getId,Function<?superT,?extendsK>getParentId,BiConsumer<T,List<T>>setChilds){......
  • 用javax.ws.rs.client.Invocation queryParam 执行url中带参数的请求
    来自于百度AI,为了实际需要,改成我自己的环境。importlombok.AllArgsConstructor;importlombok.Data;importlombok.NoArgsConstructor;importorg.apache.commons.lang3.StringUtils;importorg.glassfish.jersey.client.ClientConfig;importorg.glassfish.jersey.client......
  • 基于Java网络书店商城设计实现(源码+lw+部署文档+讲解等)
    系统介绍:随着科学技术的飞速发展,各行各业都在努力与现代先进技术接轨,通过科技手段提高自身的优势;对于网络书店商城当然也不能排除在外,随着网络技术的不断成熟,带动了网络书店商城,它彻底改变了过去传统的管理方式,不仅使服务管理难度变低了,还提升了管理的灵活性。这种个性化的平台特......
  • 【java】【集合类】ArrayList扩容机制
    扩容规则1.ArrayList()无参构造扩容2.ArrayList(intinitialCapacity)扩容3.publicArrayList(Collection<?extendsE>c)扩容4.add(Objecto)扩容5.addAll(Collectionc)扩容要注意的是,以下所有代码中用反射方式来更直观地反映ArrayList的扩容特征,但从JDK9由于模......