Spring 中的 @Autowired 和 @Resource

[复制链接]
发表于 2025-10-1 10:25:07 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
🧩 一、@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(保举方式)
  1. @Component
  2. public class MyService {
  3.     @Autowired
  4.     @Qualifier("userDaoImpl1")
  5.     private UserDao userDao;
  6. }
复制代码
Spring 会按范例找,然后用 @Qualifier 准确到 Bean 名称。
✅ 2. 利用 @Resource
  1. @Component
  2. public class MyService {
  3.     @Resource(name = "userDaoImpl1")
  4.     private UserDao userDao;
  5. }
复制代码
Spring 会直接按照 name = "userDaoImpl1" 去找 Bean。
✅ 3. 构造器注入(只能用 @Autowired)
  1. @Component
  2. public class MyService {
  3.     private final UserDao userDao;
  4.     @Autowired
  5.     public MyService(UserDao userDao) {
  6.         this.userDao = userDao;
  7.     }
  8. }
复制代码
💣 四、常见坑点

1. 多个实现类时,不指定名称会报错
  1. public interface UserDao {}
  2. @Component("userDaoImpl1") class UserDaoImpl1 implements UserDao {}
  3. @Component("userDaoImpl2") class UserDaoImpl2 implements UserDao {}
复制代码
注入时:
  1. @Autowired // ❌ 报错:有两个实现不知道选哪个
  2. private UserDao userDao;
复制代码
✅ 用 @Qualifier 或 @Primary 来指定
2. @Resource 默认按名称,字段名要划一!
  1. @Resource
  2. private UserDao userDaoImpl1; // ✅ 会去找名字叫 "userDaoImpl1" 的 Bean
复制代码
🧠 五、一句话总结

@Autowired 是 Spring 原生保举,默认按范例注入,共同 @Qualifier 利用最机动;
@Resource 是 JDK 尺度注解,默认按名称,得当兼容旧体系,但不如 @Autowired 强大。
✅ 现实开发发起:

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

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表