前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >spring注解:@Autowired 和@Resource

spring注解:@Autowired 和@Resource

作者头像
鲲志说
发布于 2025-04-07 09:54:54
发布于 2025-04-07 09:54:54
11600
代码可运行
举报
运行总次数:0
代码可运行

刚开始接触spring的时候就接触到了注解,但那个时候是生硬的去用,去网上搜索学习也是一知半解的状态,经过多次项目中使用与时间沉淀下来的思考,才有了写有关注解博客的笔记。

关于@Autowired

1.@Autowired是spring框架自身提供的,属于org.springframework.beans.factory.annotation包

2.@Autowired默认按类型查找,有查找的优先顺序

  • 按Type匹配(Match by Type)
  • 按Qualifier匹配(Match by Qualifier)
  • 按Name匹配(Match by Name)

3.默认情况下必须要求依赖对象必须存在

  • 如果要允许null值,可以设置它的required属性为false,如:@Autowired(required=false)
  • 若想要按名称装配,可以结合@Qualifier注解一起使用,如:@Autowired(required=false) @Qualifier("bean")

4.可以标注在字段或属性的setter方法上

5.异常

  • Spring上下文中存在不止一个userServiceImpl类型的bean时就会抛出BeanCreationException异常; 可以这样解决:
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Autowired   
@Qualifier("userServiceImpl")   
public IUserService userService; 

这样Spring会找到id为userServiceImpl的bean进行装配。

  • Spring上下文中不存在UserDao类型的bean,也会抛出BeanCreationException异常。 此时可以这样解决:
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Autowired(required = false)   
public IUserService userService  

关于@Resource

1.@Resource属于J2EE,在Java扩展包:javax.annotation.Resource

2.@Resource默认按名字查找,但是也有查找的优先顺序

  • 按Name匹配(Match by Name)
  • 按Type匹配(Match by Type)
  • 按Qualifier匹配(Match by Qualifier)

3.@Resource注解和@Autowired一样,也可以标注在字段或属性的setter方法上

4.如果没有指定name属性,当注解写在字段上时,默认取字段名进行Name查找,如果注解写在setter方法上默认取属性名进行装配。当找不到与名称匹配的bean时才按照类型进行装配。但是需要注意的是,如果name属性一旦指定,就只会按照名称进行装配。


以@Resource注解为例说一下查找顺序的问题

  • @Resource的作用相当于@Autowired,只不过@Autowired默认按byType自动注入,而@Resource默认按 byName自动注入。
  • @Resource有两个属性是比较重要的,分是name和type
  • Spring将@Resource注解的name属性解析为bean的名字,而type属性则解析为bean的类型。所以如果使用name属性,则使用byName的自动注入策略,而使用type属性时则使用byType自动注入策略。如果既不指定name也不指定type属性,这时将通过反射机制使用byName自动注入策略。

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


总结:

推荐使用:@Resource注解在字段上,这样就不用写setter方法了;并且这个注解是属于J2EE的,减少了与spring的耦合。这样代码看起就比较优雅;而且考虑到效率问题的话更加建议使用。

博客有参考,但大多消化为个人理解,还将继续学习

可参考博客:BaeldungSpring

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2025-04-07,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
@Autowired和@Resource的使用
@Resource的作用相当于@Autowired,只不过@Autowired按byType自动注入,而@Resource默认按 byName自动注入罢了。@Resource有两个属性是比较重要的,分是name和type,Spring将@Resource注解的name属性解析为bean的名字,而type属性则解析为bean的类型。所以如果使用name属性,则使用byName的自动注入策略,而使用type属性时则使用byType自动注入策略。如果既不指定name也不指定type属性,这时将通过反射机制使用byName自动注入策略。   @Resource装配顺序   1. 如果同时指定了name和type,则从Spring上下文中找到唯一匹配的bean进行装配,找不到则抛出异常   2. 如果指定了name,则从上下文中查找名称(id)匹配的bean进行装配,找不到则抛出异常   3. 如果指定了type,则从上下文中找到类型匹配的唯一bean进行装配,找不到或者找到多个,都会抛出异常   4. 如果既没有指定name,又没有指定type,则自动按照byName方式进行装配;如果没有匹配,则回退为一个原始类型进行匹配,如果匹配则自动装配;
晓果冻
2022/06/15
4250
Spring注解@Resource和@Autowired区别对比
@Resource和@Autowired都是做bean的注入时使用,其实@Resource并不是Spring的注解,它的包是javax.annotation.Resource,需要导入,但是Spring支持该注解的注入。
崔笑颜
2020/06/19
8240
Spring中@Autowired注解、@Resource注解的区别
Spring不但支持自己定义的@Autowired注解,还支持几个由JSR-250规范定义的注解,它们分别是@Resource、@PostConstruct以及@PreDestroy。
WindWant
2020/09/11
9840
Spring注解@Component、@Repository、@Service、@Controller区别,Resource和Autowired区别对比
1、 @Autowired与@Resource都可以用来装配bean. 都可以写在字段上,或写在setter方法上。两者如果都写在字段上,那么就不需要再写setter方法。。
chenchenchen
2022/11/29
7810
Spring注解@Component、@Repository、@Service、@Controller区别,Resource和Autowired区别对比
@Resource与@Autowired注解的区别(转)
Spring不但支持自己定义的@Autowired注解,还支持由JSR-250规范定义的几个注解。如:@Resource、@PostConstruct及@PreDestroy
二十三年蝉
2018/08/01
6490
为什么 Spring和IDEA 都不推荐使用 @Autowired 注解
原因详情描述: Inspection info: Spring Team recommends: "Always use constructor based dependency injection in your beans. Always use assertions for mandatory dependencies". 译为: Spring 团队建议: 始终在您的 bean 中使用基于构造函数的依赖注入。始终对强制依赖项使用断言
时间静止不是简史
2022/04/02
1.7K0
为什么 Spring和IDEA 都不推荐使用 @Autowired 注解
spring 注解积累
用注解来向Spring容器注册Bean。        需要在applicationContext.xml中注册:   1:@Repository 标注在持久层,即dao,用于标注数据访问。        2:@Service 标注在业务层,即service,用于标注业务逻辑。        3:@Controller 标注在控制层。        4:@Component 当不明确这个类属于那个层的时候,可以使用@Component进行标注,但不建议使用        5:@Autowired 属性加上@
Java学习123
2018/05/16
6040
CTO 说了,不懂 @Autowired 和 @Resource 区别的人可以领盒饭了
点击上方“芋道源码”,选择“设为星标” 管她前浪,还是后浪? 能浪的浪,才是好浪! 每天 10:33 更新文章,每天掉亿点点头发... 源码精品专栏 原创 | Java 2021 超神之路,很肝~ 中文详细注释的开源项目 RPC 框架 Dubbo 源码解析 网络应用框架 Netty 源码解析 消息中间件 RocketMQ 源码解析 数据库中间件 Sharding-JDBC 和 MyCAT 源码解析 作业调度中间件 Elastic-Job 源码解析 分布式事务中间件 TCC-Transaction
芋道源码
2022/04/06
4670
CTO 说了,不懂 @Autowired 和 @Resource 区别的人可以领盒饭了
Spring注解笔记
一、使用postman,测试post请求,出现error,发现原因是content_type类型不对。
liliane
2022/07/17
3000
@Autowired依赖注入为啥不推荐了
这几天更新升级了一下java编码神器IDEA,升级完进行日常开发,可能是以前用的IDEA版本比较老旧,升级之后发现之前的日常写法有了个warning提醒。来看图:
botkenni
2022/09/07
1.6K0
@Autowired依赖注入为啥不推荐了
Spring 中 @Autowired 和 @Resource 的区别
@Autowired注解是由Spring提供的,它可以用来对构造方法、成员变量及方法参数进行标注,它能够根据对象类型完成自动注入,代码如下。
程序猿DD
2023/08/09
2520
Spring 中 @Autowired 和 @Resource 的区别
Spring 中的 18 个注解,你会几个?
标识一个该类是 Spring MVC controller 处理器,用来创建处理 http 请求的对象。
良月柒
2019/06/14
4010
Spring 中的 18 个注解,你会几个?
Spring中@Autowired和@Resource的区别
最近有非常多的小伙伴从大厂毕业了,导致招聘也卷得相当厉害,不管是应届生、中开、高开,都会问技术原理。还经常问一些日常开发不太需要了解的知识点对比。今天,就给大家分享一个应届生被问到的一道面试题,在Spring中,@Autowired注解和@Resource注解的区别。
Tom弹架构
2022/08/22
3410
Spring中@Autowired和@Resource的区别
Spring 中的自动装配
自动装配指使用 Spring 满足 Bean 依赖的一种方法,Spring 会在应用上下文中为某个 Bean 寻找其依赖的 Bean,主要有三种装配机制:
村雨遥
2020/08/18
1.1K0
Spring中的@Autowired注解详细讲解
@Autowired注解可以用于构造函数、setter方法、字段以及配置方法上,以指示Spring自动注入相应的bean。它的工作原理基于类型匹配,Spring容器会查找与所需类型匹配的bean,并自动注入。
祁画
2024/07/28
4690
16个Spring注解,你知道的有几个?
标识一个该类是Spring MVC controller处理器,用来创建处理http请求的对象.
程序员追风
2019/08/18
4270
16个Spring注解,你知道的有几个?
Spring为什么建议构造器注入?
本章的内容主要是想探讨我们在进行Spring 开发过程当中,关于依赖注入的几个知识点。感兴趣的读者可以先看下以下问题:
Java旅途
2021/07/13
1.7K0
Spring中的18个注解,你会几个?
https://m.toutiaocdn.com/i6693736960273416712
好好学java
2019/09/17
5030
Spring中的18个注解,你会几个?
SpringBoot学习资料
Spring的@Bean注解用于告诉方法,产生一个Bean对象,然后这个Bean对象交给Spring管理。产生这个Bean对象的方法Spring只会调用一次,随后这个Spring将会将这个Bean对象放在自己的IOC容器中。
用户6573135
2019/11/11
6520
SpringBoot学习资料
Spring中@Autowired、@Resource和@Inject注解的使用和区别
在使用Spring进行项目开发的时候,会大量使用到自动装配,那自动装配是什么呢?简单来说:Spring 利用依赖注入(DI)功能,完成SpringIOC容器中各个组件之间的依赖关系赋值管理。
全栈程序员站长
2022/07/20
5190
相关推荐
@Autowired和@Resource的使用
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验