@Autowired按类型注入,需@Qualifier或@Primary解决多实例歧义;@Resource优先按名称注入,名称不匹配时按类型,更利于名称明确的场景。

@Autowired 侧重于按类型进行依赖注入,是 Spring 框架特有的;而 @Resource 则优先按名称进行注入,是 Java EE 规范的一部分,可以脱离 Spring 独立使用。
理解
@Autowired
@Resource
@Autowired:Spring 的类型优先策略
@Autowired
@Autowired
例如:
@Component
public class MyService {
@Autowired
private MyRepository myRepository; // Spring会寻找MyRepository类型的Bean
// ...
}这里,Spring 会在容器中查找
MyRepository
MyRepository
MyRepository
MyRepositoryImplA
MyRepositoryImplB
MyRepository
NoUniqueBeanDefinitionException
为了解决这种歧义,你可以配合
@Qualifier
@Component
public class MyService {
@Autowired
@Qualifier("myRepositoryImplA") // 明确指定Bean的名称
private MyRepository myRepository;
// ...
}或者,你也可以将其中一个实现类标记为
@Primary
@Component
@Primary
public class MyRepositoryImplA implements MyRepository { /* ... */ }
@Component
public class MyRepositoryImplB implements MyRepository { /* ... */ }
// MyService中无需@Qualifier,Spring会默认注入MyRepositoryImplA
@Component
public class MyService {
@Autowired
private MyRepository myRepository;
// ...
}@Resource:Java EE 的名称优先策略
@Resource
当你在一个字段或 Setter 方法上使用
@Resource
@Resource
@Component
public class MyService {
@Resource
private MyRepository myRepositoryImplA; // 会尝试查找名为"myRepositoryImplA"的Bean
// ...
}如果找到了,就注入。
@Resource
你也可以通过
@Resource
name
@Component
public class MyService {
@Resource(name = "myRepositoryImplA") // 明确指定Bean的名称
private MyRepository myRepository;
// ...
}或者通过
type
name
@Component
public class MyService {
@Resource(type = MyRepository.class) // 按类型查找
private MyRepository someRepository;
// ...
}总结来说,核心差异是:
@Autowired
Qualifier
@Resource
在 Spring Boot 的日常开发中,选择
@Autowired
@Resource
我个人在多数情况下会更倾向于使用
@Autowired
@Autowired
@Autowired
@Autowired
@Qualifier
然而,在某些特定的场景下,我会发现
@Resource
@Resource
再比如,如果我需要在代码中显式地通过一个字符串名称来引用一个 Bean(这在某些动态配置或工厂模式中可能会出现),那么
@Resource(name="beanName")
@Autowired
@Qualifier("beanName")另外,从代码的可移植性角度看,
@Resource
@Resource
所以,我的经验是:对于大多数 Spring Boot 应用的内部组件依赖,
@Autowired
@Resource
处理多个相同类型的 Bean,是我们在 Spring 开发中经常会遇到的一个挑战,也是区分
@Autowired
@Resource
@Autowired 的处理方式:
当 Spring 容器中存在多个类型相同的 Bean,而你又使用了
@Autowired
NoUniqueBeanDefinitionException
为了解决这个问题,通常有以下几种方法:
使用 @Qualifier
@Autowired
@Qualifier("beanName")@Service("smsSender")
public class SmsSender implements MessageSender { /* ... */ }
@Service("emailSender")
public class EmailSender implements MessageSender { /* ... */ }
@Component
public class NotificationService {
@Autowired
@Qualifier("emailSender") // 明确指定注入名为 "emailSender" 的Bean
private MessageSender messageSender;
}使用 @Primary
@Primary
@Primary
@Service
@Primary // 优先选择这个发送器
public class DefaultSmsSender implements MessageSender { /* ... */ }
@Service
public class BackupEmailSender implements MessageSender { /* ... */ }
@Component
public class NotificationService {
@Autowired // 会自动注入 DefaultSmsSender
private MessageSender messageSender;
}通过参数名匹配(作为后备): 如果没有
@Qualifier
@Primary
@Resource 的处理方式:
@Resource
优先按名称查找: 当你使用
@Resource
@Service("smsSender")
public class SmsSender implements MessageSender { /* ... */ }
@Service("emailSender")
public class EmailSender implements MessageSender { /* ... */ }
@Component
public class NotificationService {
@Resource // 尝试查找名为 "smsSender" 的Bean
private MessageSender smsSender;
@Resource // 尝试查找名为 "emailSender" 的Bean
private MessageSender emailSender;
}如果按名称未找到,再按类型查找: 如果
@Resource
@Resource
@Resource
所以,从处理多 Bean 的角度看,
@Resource
@Autowired
@Qualifier
@Primary
谈到代码的可移植性和规范性,
@Autowired
@Resource
@Autowired:Spring 框架的深度整合与便捷性
@Autowired
@Autowired
@Autowired
@Autowired
@Autowired
@Autowired
@Qualifier
@Primary
@Resource:Java EE 标准的通用性与规范性
@Resource
@Resource
@Resource
@Resource
@Autowired
@Resource
@Autowired
@Resource
我的看法:
在我的实际开发经验中,如果项目是全新的 Spring Boot 应用,且不预期有任何脱离 Spring 框架的可能,我通常会选择
@Autowired
@Resource
以上就是@Autowired 和 @Resource 注解的区别是什么?的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号