当前位置: 首页 > news >正文

Spring 框架中@Resource和@Autowired是用于实现依赖注入的两个重要注解,及@Primary注解

目录

一、主要区别和简单使用场景

1. @Resource

2. @Autowired

3. @Primary

二、项目工程简单实例

三种处理方案:

三、总结

四、拓展知识


一、主要区别和简单使用场景

1. @Resource

来源:JSR-250 规范(Java 标准注解),属于 Java EE的一部分。

依赖查找方式:默认按名称(name)查找 Bean,若找不到则按类型(type)匹配。

常用属性:

name:指定要注入的 Bean 名称。

type:指定要注入的 Bean 类型。

简单实例:

@Resource(name = "userService")  // 按名称注入名为"userService"的Bean
private UserService userService;@Resource(type = UserRepository.class)  // 按类型注入UserRepository类型的Bean
private UserRepository repository;

特点:

支持更细粒度的名称控制,适合明确指定依赖名称的场景。

若未指定name,则默认以字段名或方法名作为查找名称。

2. @Autowired

来源:Spring 框架自定义注解

依赖查找方式:默认按类型(type)匹配,若存在多个同类型 Bean,则需结合@Qualifier指定名称。

常用搭配:

@Qualifier:指定具体的 Bean 名称。

required = false:允许依赖为null(默认为true)。

简单实例:

@Autowired
private UserService userService;  // 按类型注入UserService的实现类@Autowired
@Qualifier("primaryUserService")  // 存在多个UserService实现时,指定注入名为"primaryUserService"的Bean
private UserService userService;

特点:

更符合 Spring 的依赖注入理念(基于类型)。

支持构造函数、字段、Setter 方法等多种注入方式。

3. @Primary

作用:在存在多个相同类型的 Bean 时,指定首选的 Bean。

场景:当自动装配(如 @Autowired)遇到多个候选 Bean 时,Spring 会优先选择被 @Primary 标注的 Bean。

@Primary  // 当存在多个EmpService类型的Bean时,优先使用此类
@Service  // 将此类标记为Spring管理的Service Bean
public class EmpServiceA implements EmpService {// 实现接口方法@Overridepublic void doSomething() {System.out.println("使用EmpServiceA的实现");}
}

注意事项

唯一性:同一类型的 Bean 中只能有一个被 @Primary 标注,否则会导致冲突。

优先级:@Primary 的优先级高于 @Qualifier,但低于通过 @Qualifier 直接指定名称。

二、项目工程简单实例

service包下面的接口EmpService分别被EmpServiceA和EmpServiceB两个实现类实现,且使用@Service注解交给IOC容器管理,此时存在多个同类型的Bean

此时编译器就会提示这个错误:Could not autowire. There is more than one bean of 'EmpService' type.也就是这个类型的bean超过了一个。

三种处理方案:

//方案一:使用JDK提供的Resource注解指定bean名称@Resource(name = "empServiceB")private EmpService empService;
//方案二:使用Autowired注解+@Qualifier注解指定bean名称@Qualifier("empServiceA")@Autowiredprivate EmpService empService;
//方案三: 当存在多个EmpService类型的Bean时,优先使用此类
@Primary
@Service
public class EmpServiceA implements EmpService {
}

三、总结

四、拓展知识

@Autowired(required = false) 和@Autowired(required = true)

基础作用

默认行为(required = true)

当容器中找不到匹配类型的 Bean 时,Spring 会抛出 NoSuchBeanDefinitionException,强制依赖必须存在,否则启动报错。

required = false 效果:

允许依赖 “可选”,若容器中无匹配 Bean,不会抛异常,而是将字段置为 null(普通类型)或空集合(集合类型,如 List/Set 等),让程序在缺少依赖时仍能启动。

示例:

@Autowired(required = false)
@Nullable
private EmpService empService;

http://www.lqws.cn/news/540325.html

相关文章:

  • 代码随想录|图论|09沉没孤岛
  • vue项目中纯前端实现导出pdf文件,不需要后端处理。
  • 论基于架构的软件设计方法(ABSD)及应用
  • Ehcache、Caffeine、Spring Cache、Redis、J2Cache、Memcached 和 Guava Cache 的主要区别
  • 【ubuntu24.04】忘了自己把开机samba挂载的脚本放哪里了
  • 【C++特殊工具与技术】固有的不可移植的特性(3)::extern“C“
  • Python实例题:文件内容搜索工具
  • 学习记录:DAY34
  • 树的重心(双dfs,换根)
  • 目标跟踪存在问题以及解决方案
  • 算法第54天| 并查集
  • 【Redis】解码Redis中的list类型,基本命令,内部编码方式以及适用的场景
  • 分布式ID生成SnowflakeId雪花算法和百度UidGenerator工具类
  • 深入解析:Vue 中的 Render 函数、JSX 与 @vitejs/plugin-vue-jsx 实践指南
  • DeepSeek 部署中的常见问题及解决方案:从环境配置到性能优化的全流程指南
  • Merkle Tree原理与Python实现
  • RabbitMQ RPC模式Python示例
  • 【RabbitMQ】基于Spring Boot + RabbitMQ 完成应用通信
  • Idea中Docker打包流程记录
  • C++11 <chrono> 库特性:从入门到精通
  • 线程与协程的比较
  • 【机器学习与数据挖掘实战 | 医疗】案例18:基于Apriori算法的中医证型关联规则分析
  • 《表白模版之聊天记录,前端js,html学习》
  • 2025暑期学习计划​参考
  • CPT204-Advanced OO Programming: Lists, Stacks, Queues, and Priority Queues
  • 026 在线文档管理系统技术架构解析:基于 Spring Boot 的企业级文档管理平台
  • Moxa 加入 The Open Group 的开放流程自动化™论坛,推动以开放、中立标准强化工业自动化
  • AI优化SEO关键词精进
  • 工作台-01.需求分析与设计
  • Django ORM 1. 创建模型(Model)