Spring 中的 @Autowired 和 @Resource

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

注解 来源 作用
@Autowired Spring 提供(org.springframework.beans.factory.annotation.Autowired 按类型 自动注入
@Resource JDK 提供(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;

    @Autowired
    public 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 明确指定

你可能感兴趣的:(spring,python,java)