服务器之家:专注于服务器技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - Java教程 - Spring中@Autowired与@Resource的区别详析

Spring中@Autowired与@Resource的区别详析

2022-02-24 13:10每天都要进步一点点 Java教程

@Autowired与@Resource都可以用来装配bean,都可以写在字段上,或写在setter方法上,下面这篇文章主要给大家介绍了关于Spring中@Autowired与@Resource区别的相关资料,需要的朋友可以参考下

一、定义

  • @Autowired

对类成员变量、方法及构造函数进行标注,完成自动装配的工作。

  • @Resource

在语义上被定义为通过其唯一的名称来标识特定的目标组件,其中声明的类型与匹配过程无关。

如果没有明确指定名称,则默认名称是从字段名称或设置方法(get、set方法)派生的。 如果用在字段上,则采用字段名称; 如果用在在setter方法,它采用其属性名称(例如setProperty()方法,取property做为属性名称)。

 

二、区别

在Spring框架中,如果在Service层中需要注入其他依赖的对象,通常我们都会使用@Autowired或者@Resource注解,但是它们是有区别的,比如@Autowired跟Spring框架强耦合了, 如果换成其他框架,@Autowired就没作用了。而@Resource是JSR-250提供的,它是Java标准,绝大部分框架都支持。

接下来,我们总结一下@Autowired和@Resource的区别:

(一)、包含的属性不同

@Autowired只包含一个参数:required,表示是否开启自动注入,默认是true。而@Resource包含七个参数,其中最重要的两个参数是:name 和 type。如下:

public @interface Autowired {

  /**
   * 是否开启自动注入,有些时候我们不想使用自动装配功能,可以将该参数设置成false。
   */
	boolean required() default true;

}


public @interface Resource {
  /**
   * bean的名称
   */
  String name() default "";

  String lookup() default "";

  /**
   * Java类,被解析为bean的类型
   */
  Class<?> type() default java.lang.Object.class;

  enum AuthenticationType {
          CONTAINER,
          APPLICATION
  }

  /**
   * 身份验证类型
   */
  AuthenticationType authenticationType() default AuthenticationType.CONTAINER;

  /**
   * 组件是否可以与其他组件之间共享
   */
  boolean shareable() default true;

  String mappedName() default "";

  /**
   * 描述
   */
  String description() default "";
}

(二)、@Autowired默认按byType自动装配,而@Resource默认byName自动装配。

@Autowired如果要使用byName,需要使用@Qualifier一起配合。而@Resource如果指定了name,则用byName自动装配,如果指定了type,则用byType自动装配。

(三)、注解应用的地方不同

@Autowired能够用在:构造器、方法、参数、成员变量和注解上,而@Resource能用在:类、成员变量和方法上。

(四)、出处不同

@Autowired是Spring定义的注解,而@Resource是JSR-250定义的注解。所以@Autowired只能在Spring框架下使用,而@Resource则可以与其他框架一起使用。

(五)、装配顺序不同

@Autowired的装配顺序如下:

@Autowired默认先按byType进行匹配,如果发现找到多个bean,则又按照byName方式进行匹配,如果还有多个,则报出异常。

Spring中@Autowired与@Resource的区别详析

@Resource的装配顺序如下:

如果同时指定了name和type,流程如下:

Spring中@Autowired与@Resource的区别详析

如果指定了name,流程如下:

只是指定了@Resource注解的name,则按name后的名字去bean元素里查找有与之相等的name属性的bean。

Spring中@Autowired与@Resource的区别详析

如果指定了type,流程如下:

只指定@Resource注解的type属性,则从上下文中找到类型匹配的唯一bean进行装配,找不到或者找到多个,都会抛出异常。

Spring中@Autowired与@Resource的区别详析

如果既没有指定name,也没有指定type,流程如下:

既不指定name属性,也不指定type属性,则自动按byName方式进行查找。如果没有找到符合的bean,则回退为一个原始类型进行进行查找,如果找到就注入。

Spring中@Autowired与@Resource的区别详析

 

总结

到此这篇关于Spring中@Autowired与@Resource区别的文章就介绍到这了,更多相关Spring中@Autowired与@Resource区别内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!

原文链接:https://blog.csdn.net/Weixiaohuai/article/details/120853683

延伸 · 阅读

精彩推荐
  • Java教程Mybatis初始化知识小结

    Mybatis初始化知识小结

    Mybatis的初始化过程就是加载自己运行时所需要的配置信息的过程,这篇文章主要介绍了Mybatis初始化知识小结,需要的朋友可以参考下...

    毛奇志4082022-02-12
  • Java教程java删除文件和文件夹具体实现

    java删除文件和文件夹具体实现

    这篇文章介绍了java删除文件和文件夹具体实现,有需要的朋友可以参考一下 ...

    java之家9792019-10-18
  • Java教程Web Service 运行原理详细介绍

    Web Service 运行原理详细介绍

    这篇文章主要介绍了 Web Service 运行原理详细介绍的相关资料,需要的朋友可以参考下...

    java教程网4152020-06-28
  • Java教程java获取客服端信息的方法(系统,浏览器等)

    java获取客服端信息的方法(系统,浏览器等)

    下面小编就为大家带来一篇java获取客服端信息的方法(系统,浏览器等)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看...

    jingxian8832020-06-18
  • Java教程学习Java多线程之同步

    学习Java多线程之同步

    这篇文章主要为大家详细介绍了Java多线程之同步,感兴趣的小伙伴们可以参考一下 ...

    刘望舒2782020-04-06
  • Java教程Spring框架生成图片验证码实例

    Spring框架生成图片验证码实例

    验证码在很多地方都会遇到,实现的方法和形式也有很多,主要的目的就是为了安全,防止一些恶意的攻击等。今天在之前搭建好的一个spring框架上写了一...

    daisy1952020-06-07
  • Java教程Maven 配置文件 生命周期 常用命令详解

    Maven 配置文件 生命周期 常用命令详解

    Maven是围绕着构建生命周期的核心概念为原型,整个项目的创建和部署都是围绕着生命周期展开的,一个生命周期由若干个生命周期阶段组成。下面通过本...

    清枫_小天8962021-02-18
  • Java教程spring boot实现验证码功能

    spring boot实现验证码功能

    Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程。这篇文章主要介绍了spring boot实现验证码功能,需要的...

    mmp_gaihaoleba4992021-04-22