当前位置: 首页 > news >正文

Spring 中的 @Autowired 和 @Resource

🧩 一、@Autowired 和 @Resource 的基本作用

注解来源作用
@AutowiredSpring 提供(org.springframework.beans.factory.annotation.Autowired按类型 自动注入
@ResourceJDK 提供(javax.annotation.Resource默认按名称 注入,找不到再按类型

🚦 二、核心区别详解

对比项@Autowired@Resource
注解来源Spring 框架JDK(JSR-250 规范)
默认注入方式类型注入(byType名称注入(byName
是否可选可以配合 @Autowired(required = false) 设置为可选默认必须有该 Bean
是否支持构造器✅ 支持构造器注入❌ 不支持构造器注入
是否支持 @Qualifier✅ 支持,用于指定具体 Bean 名称❌ 不支持 @Qualifier(直接用 name)
Spring 推荐✅ 是可以用但不推荐(除非兼容旧项目)

🔍 三、举例对比

✅ 1. 使用 @Autowired + @Qualifier(推荐方式)

@Component
public class MyService {@Autowired@Qualifier("userDaoImpl1")private UserDao userDao;
}

Spring 会按类型找,然后用 @Qualifier 精确到 Bean 名称。

✅ 2. 使用 @Resource

@Component
public class MyService {@Resource(name = "userDaoImpl1")private UserDao userDao;
}

Spring 会直接按照 name = "userDaoImpl1" 去找 Bean。

✅ 3. 构造器注入(只能用 @Autowired

@Component
public class MyService {private final UserDao userDao;@Autowiredpublic MyService(UserDao userDao) {this.userDao = userDao;}
}

💣 四、常见坑点

1. 多个实现类时,不指定名称会报错

public interface UserDao {}
@Component("userDaoImpl1") class UserDaoImpl1 implements UserDao {}
@Component("userDaoImpl2") class UserDaoImpl2 implements UserDao {}

注入时:

@Autowired // ❌ 报错:有两个实现不知道选哪个
private UserDao userDao;

✅ 用 @Qualifier@Primary 来指定

2. @Resource 默认按名称,字段名要一致!

@Resource
private UserDao userDaoImpl1; // ✅ 会去找名字叫 "userDaoImpl1" 的 Bean

🧠 五、一句话总结

@Autowired 是 Spring 原生推荐,默认按类型注入,配合 @Qualifier 使用最灵活;
@Resource 是 JDK 标准注解,默认按名称,适合兼容旧系统,但不如 @Autowired 强大。

实际开发建议:

  • Spring Boot 项目中:优先使用 @Autowired + 构造器注入
  • 多实现类时:使用 @Qualifier@Primary 明确指定

http://www.mrgr.cn/news/97317.html

相关文章:

  • 美国mlb与韩国mlb的关系·棒球9号位
  • 计算机系统---UEFI(统一可扩展固件接口)
  • 开源软件与自由软件:一场理念与实践的交锋
  • Spring 中有哪些设计模式?
  • QT6(9)2.4:用 cmake 构建项目:整体介绍与 cmake 语法,cmake 不支持中文,依据QT帮助为 cmake文件添加模块,ui_dialog.h 头文件的位置有变化,更改与完善代码
  • C# Winform 入门(13)之通过WebServer查询天气预报
  • 定时器的实现方案:红黑树、最小堆与时间轮
  • 自动化备份全网服务器数据平台
  • go简化版面试题
  • 蓝桥杯高频考点——经典01背包问题详解(附例题)
  • Java 常用数据结构详解
  • Business English Certificates (BEC) 高频词汇背诵
  • 【NLP 54、大模型训练相关知识】
  • Android学习总结之handler源码级
  • Android学习总结之Kotlin 协程
  • LeetCode算法题(Go语言实现)_31
  • C++自学笔记---数组和指针的异同点
  • 【计算机网络】Linux配置SNAT/DNAT策略
  • Android学习总结之算法篇五(字符串)
  • Java基础-设计模式详解