Spring中@Autowired和@Resource注解的区别?

简介: 面试官:Spring中@Autowired和@Resource注解的区别?

一.背景

Spring中@Autowired和@Resource注解的区别?

Spring框架想必大家都知道吧,那么Spring中@Autowired和@Resource注解的区别你知道吗?如果不知道也不要紧,我们就一起来学习一起吧。

image.png

二.@Autowired和@Resource注解的区别?

@Resource和@Autowired都是做bean的注入时使用,但是@Resource并不是Spring的注解,它的包是javax.annotation.Resource。

2.1 共同点

两者都可以写在字段和setter方法上。两者如果都写在字段上,那么就不需要再写setter方法。

2.2 不同点

2.3.1 @Autowired注解

@Autowired注解是按照类型(byType)装配依赖对象,默认情况下它要求依赖对象必须存在,如果允许null值,可以设置它的required属性为false。

// 使用其中一种即可
public class MallServiceImpl {
   
   
     // 注入到属性上
     @Autowired
     private MallDao mallDao;

     // 注入到属性的方法上
     @Autowired
     public void setUserDao(MallDao mallDao) {
   
   
         this.mallDao= mallDao;
     }
}

如果我们想使用按照名称(byName)来装配,可以结合@Qualififier注解一起使用。如下:

public class MallServiceImpl {
   
   
    @Autowired
    @Qualifier("mallDao")
    private MallDao mallDao; 
}

2.3.2 @Resource注解

@Resource默认按照ByName自动注入,由J2EE提供,需要导入包javax.annotation.Resource。@Resource有两个重要的属性:name和type,而Spring将@Resource注解的name属性解析为bean的名字,而type属性则解析为bean的类型。所以,如果使用name属性,则使用byName的自动注入策略,而使用type属性时则使用byType自动注入策略。如果既不制定name也不制定type属性,这时将通过反射机制使用byName自动注入策略.

// 使用其中一种即可
public class MallServiceImpl {
   
   
     // 注入到属性上
     @Resource(name="mallDao")
     private MallDao mallDao;

     // 注入到属性的方法上
     @Resource(name="mallDao")
     public void setUserDao(MallDao mallDao) {
   
   
         this.mallDao= mallDao;
     }
}

@Resource装配顺序:

  1. 如果同时指定了name和type,则从Spring上下文中找到唯一匹配的bean进行装配,找不到则抛出异常。
  2. 如果指定了name,则从上下文中查找名称(id)匹配的bean进行装配,找不到则抛出异常。
  3. 如果指定了type,则从上下文中找到类似匹配的唯一bean进行装配,找不到或是找到多个,都会抛出异常。
  4. 如果既没有指定name,又没有指定type,则自动按照byName方式进行装配;如果没有匹配,则回退为一个原始类型进行匹配,如果匹配则自动装配。

三.总结

上面的内容对于刚接触Spring框架的同学可能稍微有些难受,但是对于之前有过技术积累的同学来说就是小菜一碟了,我觉得也不要紧,谁都是从一个小白走过来的,踏踏实实的,只是时间问题!加油!

相关文章
|
6月前
|
Java Spring 容器
Spring中@Autowired和@Resource注解异同点
Spring中@Autowired和@Resource注解异同点
68 0
|
6月前
|
安全 Java 开发者
Spring依赖注入大揭秘:@Autowired、@Qualifier和@Resource的区别与应用
Spring依赖注入大揭秘:@Autowired、@Qualifier和@Resource的区别与应用
281 0
|
6月前
|
Java 编译器 Spring
Spring中@Autowired和@Resource的区别
Spring中@Autowired和@Resource的区别
140 0
|
12月前
|
Java Spring 容器
Spring中@Autowired与@Resource自动注入实现原理
Spring中@Autowired与@Resource自动注入实现原理
102 0
|
Java 编译器 Spring
Spring框架@Autowired和@Resource到底有什么区别
Spring框架@Autowired和@Resource到底有什么区别
514 0
|
开发框架 Java Spring
Spring中@Autowired和@Resource注解的区别?
Spring中@Autowired和@Resource注解的区别?
99 1
|
Java 测试技术 开发者
Spring探索丨既生@Resource,何生@Autowired?
读了本文你将会了解到:1、@Resource和@Autowired来源;2、Spring官方为什么会支持这两个功能如此相似的注解?3、为什么@Autowired属性注入的时候Idea会曝出黄色的警告?4、@Resource和@Autowired推荐用法
524 5
Spring探索丨既生@Resource,何生@Autowired?
|
Java 测试技术 开发者
Spring探索:既生@Resource,何生@Autowired?
提到Spring依赖注入,大家最先想到应该是@Resource和@Autowired,很多文章只是讲解了功能上的区别,对于Spring为什么要支持两个这么类似的注解却未提到,属于知其然而不知其所以然。不知大家在使用这两个注解的时候有没有想过,@Resource又支持名字又支持类型,还要@Autowired干嘛,难道是Spring官方没事做了?
13731 3
Spring探索:既生@Resource,何生@Autowired?
|
开发框架 Java Spring
Spring中@Autowired和@Resource的区别及详细使用
Spring中@Autowired和@Resource的区别及详细使用
|
Java Spring 容器
Spring中的Autowired、Qualifier、Resource注解详解
使用Spring系列的框架对这三个注解肯定都不会陌生,这三个注解有一个特性,就是用于属性注入,说白了点就是将Spring容器中的对象取出来,这样我们才可以使用,那么这三者到底是什么关系,又有什么区别呢?
591 0