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方式进行匹配,如果还有多个,则报出异常。

img

@Resource的装配顺序如下:

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

img

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

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

img

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

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

img

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

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

img

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/557005.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java面试题大全

一、Java 基础 1. JDK 和 JRE 有什么区别&#xff1f; JDK&#xff1a;Java Development Kit 的简称&#xff0c;java 开发工具包&#xff0c;提供了 java 的开发环境和运行环境。JRE&#xff1a;Java Runtime Environment 的简称&#xff0c;java 运行环境&#xff0c;为 ja…

Java面试题整理(附参考答案)

1、面向对象的特征有哪些方面&#xff1f; 抽象&#xff1a;将同类对象的共同特征提取出来构造类。继承&#xff1a;基于基类创建新类。封装&#xff1a;将数据隐藏起来&#xff0c;对数据的访问只能通过特定接口。多态性&#xff1a;不同子类型对象对相同消息作出不同响应。 …

win7 找不到 计算机策略组,win7打开组策略报错:找不到资源string.Advanced_EnableSSL3Fallback...

今天要在组策略里关闭几个端口&#xff0c;每次打开组策略时都弹出一个错误提示框&#xff0c;说是找不到资源“string.Advanced_EnableSSL3Fallback”。找不到资源string.Advanced_EnableSSL3Fallback我的系统好好的&#xff0c;怎么会这样呢&#xff1f;一时间不知如何解决。…

xbox虚拟服务器,Xbox One平台真相:原生Win8/虚拟化运行

Xbox One搭载的是Windows8吗&#xff1f;没错。在Build2014开发者大会上&#xff0c;Frank Savage介绍Xbox One平台未来的开发计划&#xff0c;其中他也揭秘Xbox One平台运行原生Win8系统&#xff0c;那些主机游戏均采用虚拟化技术加载运行。据国外wccftech科技网站透露&#x…

SpringMVC 执行流程解析

SpringMVC 执行流程解析 注&#xff1a;SpringMVC 版本 5.2.15 上面这张图许多人都看过&#xff0c;本文试图从源码的角度带大家分析一下该过程。 1. ContextLoaderListener 首先我们从 ContextLoaderListener 讲起&#xff0c;它继承自 ServletContextListener&#xff0c;用…

无线网服务器mac是什么,电脑MAC和LAN MAC以及WIRELESS MAC是什么关系?

满意答案刘义芳aaa推荐于 2017.12.14采纳率&#xff1a;51% 等级&#xff1a;12已帮助&#xff1a;19753人一楼和二楼的回答都是对的电脑MAC这样说不好理解的&#xff0c;应该说MAC电脑&#xff0c;MAC是Macintosh这个的前三个字母&#xff0c;至于它为什么只用前三个字母做…

@RequestParam详解

RequestParam 主要用于将请求参数区域的数据映射到控制层方法的参数上 首先我们需要知道RequestParam注解主要有哪些参数 value&#xff1a;请求中传入参数的名称&#xff0c;如果不设置后台接口的value值&#xff0c;则会默认为该变量名。比如上图中第一个参数如果不设置va…

springboot 的 RedisTemplate 的 execute 和 executePipelined 功能的区别redis

1.executespring 如下是 springboot 官网原文:springboot Redis provides support for transactions through the multi, exec, and discard commands. These operations are available on RedisTemplate, however RedisTemplate is not guaranteed to execute all operatio…

Error running ‘Tomcat‘: Unable to open debugger port (127.0.0.1:2148): java.net.SocketExceptio

在Web项目运行的时候&#xff0c;IDEA可能会报Error running ‘Tomcat’: Unable to open debugger port (127.0.0.1:2148): java.net.SocketException “socket closed”错误&#xff0c;启动不了Tomcat&#xff0c;在这种时候&#xff0c;网上的解决办法大多都是修改端口的这…

Java 枚举(enum) 详解7种常见的用法

JDK1.5引入了新的类型——枚举。在 Java 中它虽然算个“小”功能&#xff0c;却给我的开发带来了“大”方便。 用法一&#xff1a;常量 在JDK1.5 之前&#xff0c;我们定义常量都是&#xff1a; public static fianl… 。现在好了&#xff0c;有了枚举&#xff0c;可以把相关…

sqoop导入hive时间格式问题解决方案

sqoop导入hive时间格式问题解决方案 从mysql导入数据时,发现时间格式有问题,要么是时间后面多一位零,要么要使用时间戳,还能不能好好玩耍了?! 于是,我就逛论坛&#xff0c;找大神&#xff0c;最终无果&#xff0c;也许这个问题过于简单吧&#xff0c;居然没有大牛讨论。想了好…

Java枚举类型(enum)详解

文章目录理解枚举类型枚举的定义枚举实现原理枚举的常见方法Enum抽象类常见方法编译器生成的Values方法与ValueOf方法枚举与Class对象枚举的进阶用法向enum类添加方法与自定义构造函数关于覆盖enum类方法enum类中定义抽象方法enum类与接口枚举与switch枚举与单例模式EnumMapEnu…

mysql/sqlyog导入txt文件的方法

今天尝试着用sqlyog向mysql中导入数据&#xff0c;用了以下几种&#xff1a; 一、sql载入 格式&#xff1a; LOAD DATA LOCAL INFILE 文件路径 INTO TABLE 表名 FIELDS TERMINATED BY 字段分隔符 LINES TERMINATED BY 行分隔符;直接进去了 代码&#xff1a; LOAD DATA LOCA…

XSS知识总结

XSS基础 跨站脚本&#xff08;英语&#xff1a;Cross-site scripting&#xff0c;通常简称为&#xff1a;XSS&#xff09;是一种网站应用程序的安全漏洞攻击&#xff0c;是代码注入的一种。它允许恶意用户将代码注入到网页上&#xff0c;其他用户在观看网页时就会受到影响。这…

classmethod 继承_让人眼花缭乱的类继承

Python语言的一个优势是简洁易用。是否简洁易用仅仅是Python语言本身的一个话题&#xff0c;但“好消息”是如果你想创造那种一大堆继承、混乱的内部关系的代码&#xff0c;也是可以的&#xff01;今天烦人的代码来自于验证某些math-y数学分析代码。一开始&#xff0c;他们是发…

JAVA SSM框架+Redis 实现单点登录

1&#xff1a;什么是单点登录&#xff1f; 答&#xff1a;单点登录的英文名叫做&#xff1a;Single Sign On&#xff08;简称SSO&#xff09; 一般我们的模块都是在同一个系统下&#xff0c;同一个tomcat&#xff08;如图&#xff0c;以商城为例&#xff09; 后来为了维护和…

2017云栖大会门票转让_「揭秘GP」云栖大会 | Greenplum 6.0 内核优化解读和7.0展望...

9月25日&#xff0c;云栖大会在杭州阿里巴巴云栖小镇正式拉开序幕&#xff0c;三天会议期间&#xff0c;共吸引了200多位世界级科学家、400多家科技合作伙伴参与&#xff0c;科技展区面积超过3万平方米&#xff0c;共发布了1000多项顶尖技术。云栖大会现场在此次云栖大会上&…

从mysql到大数据(一)--开宗明义

一、大数据长什么样 长像很普通&#xff0c;至少看两眼后就觉得很平常。 举个栗子&#xff1a; 一个表格&#xff0c;学生信息表&#xff0c;里面有学号、姓名、性别、年龄、学校、学院、专业、年级、宿舍号等信息如下&#xff0c; 但是表在库里&#xff0c;我们想看&#xf…

SSO单点登录方案大全

分布式微服务系统主流常用的登录方案 前言: 单点登录其实是一个概念,主要是为了解决一次登录,多系统(本系统或外部系统)之间不需要重复登录的问题,就目前来说,主流的解决方案针对业务场景分为3个方向: 1: 同一公司,同父域下的单点登录解决方案. 如[http://map.baidu.com][[h…

em算法怎么对应原有分类_机器学习基础-EM算法

EM算法也称期望最大化(Expectation-Maximum,简称EM)算法&#xff0c;它是一个基础算法&#xff0c;是很多机器学习领域算法的基础&#xff0c;比如隐式马尔科夫算法(HMM)&#xff0c; LDA主题模型的变分推断等等。本文就对EM算法的原理做一个总结。EM算法要解决的问题我们经常会…