Spring自动装配(@Autowired、@Resource)

通俗易懂!2025 年最新 @Autowired 和 @Resource 完全对比 + 避坑指南(面试 100% 会问,背完直接满分)

项目@Autowired(Spring 自己的)@Resource(JDK 自带的,Spring 也支持)谁才是 2025 年主流?
来源Spring 框架JSR-250 规范(Java 标准)@Autowired 完胜
注入方式(默认)byType(先按类型找)byName(先按名字找)——
有多个 Bean 时报错!必须配合 @Qualifier 或 @Primary先按 name 找,找不到再按 type 找——
可以不写在字段上可以写在字段、Setter、构造器上只能写在字段或 Setter 上(不能写构造器)——
是否支持 @Primary支持不支持——
是否支持 required=false支持 @Autowired(required=false)不支持(只能用 @Autowired 实现可选注入)——
2025 项目使用频率99.9%不到 1%(基本绝迹)@Autowired 统治世界

@Autowired 2025 年最常用 5 种写法(直接抄)

@Service
public class UserService {

    // 1. 字段注入(最常见,最简洁,90%代码这样写)
    @Autowired
    private UserMapper userMapper;

    // 2. 构造器注入(大厂最推荐!支持 final + 可省略 @Autowired)
    private final OrderService orderService;
    public UserService(OrderService orderService) {  // 只有一个构造器,@Autowired 可省!
        this.orderService = orderService;
    }

    // 3. Setter 注入(偶尔用在可选依赖)
    private PaymentService paymentService;
    @Autowired
    public void setPaymentService(PaymentService paymentService) {
        this.paymentService = paymentService;
    }

    // 4. 可选注入(找不到 Bean 也不报错,给 null)
    @Autowired(required = false)
    private SomeOptionalService optionalService;

    // 5. 集合注入(自动把所有实现类装进来)
    @Autowired
    private List<PayStrategy> payStrategyList;   // 会注入所有 PayStrategy 的实现
}

当有多个相同类型 Bean 时怎么选?(面试必考)

// 场景:有两个 UserService 实现
@Qualifier("aliyunSmsService")   // 精确指定名字(最常用)
@Autowired
private SmsService smsService;

// 或者在实现类上加 @Primary(主候选)
@Primary
@Service
public class AliyunSmsService implements SmsService {}

// 或者用 @Order 排序(集合注入时生效)
@Order(1)
@Service
public class TencentSmsService implements SmsService {}

@Resource 基本可以埋了,但面试还是会问(记住这三句话就够)

  1. @Resource(name = “xxx”) → 先按名字找
  2. 没写 name → 先按字段名找 → 再按类型找
  3. 找不到直接报错(没有 required=false)
@Resource(name = "userMapper")   // 基本没人这么写
private UserMapper userMapper;

2025 年真实项目建议(直接照做)

场景推荐写法
必填依赖(Service、Mapper)构造器注入(可省略 @Autowired)
简单工具类、配置类字段注入 @Autowired(最快)
可选依赖@Autowired(required = false)
策略模式、插件系统@Autowired List 或 Map
老项目还在用 @Resource建议全部替换成 @Autowired(更现代、更灵活)

面试终极 6 连问 + 标准答案(直接背)

  1. @Autowired 和 @Resource 区别?
    → @Autowired byType,@Resource byName;@Autowired 支持构造器和 required=false,@Resource 不支持。
  2. 有两个实现类怎么注入?
    → 用 @Qualifier(“beanName”) 或 @Primary。
  3. 只有一个构造器需要写 @Autowired 吗?
    → 不需要!Spring Boot 2.6+ 自动识别(官方推荐省略)。
  4. @Autowired 注入 List 会怎样?
    → 自动注入该接口的所有实现,按 @Order 排序。
  5. 想注入 Map 呢?
    → 自动把所有实现放进去,key 是 beanName。
  6. @Resource 还有人用吗?
    → 基本没人用了,Spring 团队自己都不推荐,新项目直接 @Autowired。

背完这张表 + 5 种写法 + 6 个答案,
下次面试官问“Spring 自动装配怎么用”,你 1 分钟甩完代码 + 画表,直接拿下 100 分!冲!

文章已创建 3017

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

相关文章

开始在上面输入您的搜索词,然后按回车进行搜索。按ESC取消。

返回顶部