首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >SpringBoot @Autowired与@Resource注解详解与对比

SpringBoot @Autowired与@Resource注解详解与对比

作者头像
varin
发布2025-09-28 13:14:56
发布2025-09-28 13:14:56
2550
举报
文章被收录于专栏:/root/root
一、注解基础解释

1. @Autowired
  • 来源:Spring 框架提供的注解(org.springframework.beans.factory.annotation.Autowired),依赖 Spring 环境。
  • 核心作用:实现 Bean 的自动装配,默认按类型(Type) 匹配容器中的 Bean。
2. @Resource
  • 来源:JDK 自带注解(javax.annotation.Resource),属于 Java EE 标准,不依赖 Spring。
  • 核心作用:同样实现 Bean 的自动装配,默认按名称(Name) 匹配,名称不存在时再按类型匹配。
二、具体用法与实例

假设存在以下基础类(用于注入场景):

代码语言:javascript
复制
// 接口

public interface UserDao {

      void query();

}

// 实现类1

@Repository("userDaoMysql") // 指定Bean名称为userDaoMysql

public class UserDaoMysql implements UserDao {

      @Override

      public void query() {

              System.out.println("Mysql查询用户");

          }

}

// 实现类2

@Repository("userDaoOracle") // 指定Bean名称为userDaoOracle

public class UserDaoOracle implements UserDao {

      @Override

      public void query() {

              System.out.println("Oracle查询用户");

          }

}
1. @Autowired 用法

支持字段注入、构造器注入、setter 注入,需搭配@Qualifier指定名称(当同类型 Bean 多个时)。

(1)字段注入(最简但不推荐,不利于测试)
代码语言:javascript
复制
@Service

public class UserService {

      // 同类型Bean多个,必须用@Qualifier指定名称,否则报错

      @Autowired

      @Qualifier("userDaoMysql");

      private UserDao userDao;

      public void getUsers() {

              userDao.query(); // 输出:Mysql查询用户

          }

}
(2)构造器注入(Spring 推荐,支持依赖注入和测试)
代码语言:javascript
复制
@Service

public class UserService {

    private UserDao userDao;

    // 构造器注入,同类型多个时加@Qualifier

    @Autowired

    public UserService(@Qualifier("userDaoOracle") UserDao userDao) {

        this.userDao = userDao;

    }

    public void getUsers() {

        userDao.query(); // 输出:Oracle查询用户

    }

}
(3)setter 注入
代码语言:javascript
复制
@Service

public class UserService {

    private UserDao userDao;

    @Autowired

    @Qualifier("userDaoMysql")

    public void setUserDao(UserDao userDao) {

        this.userDao = userDao;

    }

    public void getUsers() {

        userDao.query(); // 输出:Mysql查询用户

    }

}
(4)`required`属性(默认 true,必须注入 Bean;设为 false 可允许空值)
代码语言:javascript
复制
@Service

public class UserService {

    // 若容器中无UserDao类型Bean,不会报错(userDao为null)

    @Autowired(required = false)

    private UserDao userDao;

}
2. @Resource 用法

仅支持字段注入和 setter 注入,可通过nametype属性指定匹配规则。

(1)默认装配(先按名称,再按类型)
代码语言:javascript
复制
@Service

public class UserService {

    // 字段名=Bean名称(userDaoMysql),直接匹配

    @Resource

    private UserDao userDaoMysql;

    public void getUsers() {

        userDaoMysql.query(); // 输出:Mysql查询用户

    }

}
(2)指定`name`属性(强制按名称匹配)
代码语言:javascript
复制
@Service

public class UserService {

    // 明确指定Bean名称,与字段名无关

    @Resource(name = "userDaoOracle")

    private UserDao userDao;

    public void getUsers() {

        userDao.query(); // 输出:Oracle查询用户

    }

}
(3)指定`type`属性(强制按类型匹配,同类型多个时报错)
代码语言:javascript
复制
@Service

public class UserService {

    // 按类型匹配,若存在多个UserDao实现类则报错

    @Resource(type = UserDaoMysql.class)

    private UserDao userDao;

    public void getUsers() {

        userDao.query(); // 输出:Mysql查询用户

    }

}
(4)同时指定`name`和`type`(必须同时匹配才注入)
代码语言:javascript
复制
@Service

public class UserService {

    // 仅注入名称为userDaoOracle、类型为UserDaoOracle的Bean

    @Resource(name = "userDaoOracle", type = UserDaoOracle.class)

    private UserDao userDao;

}
三、核心差异对比

对比维度

@Autowired

@Resource

来源

Spring 框架注解

JDK 标准注解(Java EE)

默认装配规则

按类型(Type)匹配

先按名称(Name),再按类型

支持的属性

仅required(控制是否必须注入)

name、type、lookup等

注入方式支持

字段、构造器、setter 注入

仅字段、setter 注入

跨框架兼容性

依赖 Spring,非 Spring 环境不可用

通用,支持 Spring、JPA 等多种框架

同类型多 Bean 处理

需搭配@Qualifier指定名称

直接通过name属性指定

异常处理

无匹配Bean时抛NoSuchBeanDefinitionException

名称不匹配时抛NoSuchBeanDefinitionException

处理器

AutowiredAnnotationBeanPostProcessor

CommonAnnotationBeanPostProcessor

四、适用场景与优缺点
1. @Autowired
适用场景
  • 纯 Spring 项目(如 Spring Boot、Spring MVC);
  • 需使用构造器注入(利于依赖管理和单元测试);
  • 依赖 Spring 生态的高级特性(如@Autowired(required = false))。
优点
  • 与 Spring 深度集成,支持 Spring 所有注入方式;
  • required属性可灵活控制 Bean 是否必须存在;
  • 构造器注入时支持自动类型推断。
缺点
  • 耦合 Spring 框架,切换到非 Spring 环境(如 Jakarta EE)需修改代码;
  • 同类型多 Bean 时需额外搭配@Qualifier,代码稍繁琐。
2. @Resource
适用场景
  • 跨框架项目(需兼容 Spring、JPA 等多种环境);
  • 明确按 Bean 名称装配(无需额外注解);
  • 避免依赖 Spring 框架的通用项目。
优点
  • 基于 JDK 标准,无框架依赖,兼容性强;
  • 直接通过name属性指定 Bean,无需搭配其他注解;
  • 支持更多装配属性(如lookup实现方法注入)。
缺点
  • 不支持构造器注入(无法用于构造器依赖注入场景);
  • 无类似required的属性,若注入失败直接抛出异常;
  • 名称匹配时依赖字段名或name属性,拼写错误易导致注入失败。
优缺点总结

注解

优点

缺点

@Autowired

深度集成Spring,支持构造器/方法注入

强依赖Spring,灵活性较低

@Resource

跨环境兼容性强,按名称注入更明确

功能单一,不支持required属性配置

五、总结
  • 若为纯 Spring 项目,优先选@Autowired(推荐构造器注入 +@Qualifier),享受 Spring 生态优势;
  • 若为跨框架或通用项目,优先选@Resource,保证兼容性和标准性;
  • 按名称装配用@Resource(name="xxx"),按类型装配用@Autowired(单 Bean)或@Autowired+@Qualifier(多 Bean)。
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2025-09-28,如有侵权请联系 cloudcommunity@tencent.com 删除

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

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、注解基础解释
    • 1. @Autowired
    • 2. @Resource
  • 二、具体用法与实例
    • 1. @Autowired 用法
      • (1)字段注入(最简但不推荐,不利于测试)
      • (2)构造器注入(Spring 推荐,支持依赖注入和测试)
      • (3)setter 注入
      • (4)`required`属性(默认 true,必须注入 Bean;设为 false 可允许空值)
    • 2. @Resource 用法
      • (1)默认装配(先按名称,再按类型)
      • (2)指定`name`属性(强制按名称匹配)
      • (3)指定`type`属性(强制按类型匹配,同类型多个时报错)
      • (4)同时指定`name`和`type`(必须同时匹配才注入)
  • 三、核心差异对比
  • 四、适用场景与优缺点
    • 1. @Autowired
      • 适用场景
      • 优点
      • 缺点
    • 2. @Resource
      • 适用场景
      • 优点
      • 缺点
    • 优缺点总结
  • 五、总结
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档