论坛
潜水/灌水快乐,沉淀知识,认识更多同行。
ToB圈子
加入IT圈,遇到更多同好之人。
朋友圈
看朋友圈动态,了解ToB世界。
ToB门户
了解全球最新的ToB事件
博客
Blog
排行榜
Ranklist
文库
业界最专业的IT文库,上传资料也可以赚钱
下载
分享
Share
导读
Guide
相册
Album
记录
Doing
应用中心
搜索
本版
文章
帖子
ToB圈子
用户
免费入驻
产品入驻
解决方案入驻
公司入驻
案例入驻
登录
·
注册
账号登录
立即注册
找回密码
用户名
Email
自动登录
找回密码
密码
登录
立即注册
首页
找靠谱产品
找解决方案
找靠谱公司
找案例
找对的人
专家智库
悬赏任务
圈子
SAAS
qidao123.com技术社区-IT企服评测·应用市场
»
论坛
›
物联网
›
物联网
›
spring中的@Primary注解详解
spring中的@Primary注解详解
惊落一身雪
论坛元老
|
7 天前
|
显示全部楼层
|
阅读模式
楼主
主题
1849
|
帖子
1849
|
积分
5547
@Primary是Spring框架中用于解决依靠注入冲突的核心注解。当存在多个相同类型的Bean时,通过标记@Primary可指定优先注入的Bean,避免因类型冲突导致NoUniqueBeanDefinitionException非常。以下是其核心功能、使用场景及原理的详细分析:
一、核心功能与作用
解决Bean冲突
当Spring容器中存在多个相同类型的Bean时,@Primary标记的Bean会被优先注入,无需显式指定@Qualifier或Bean名称。
示例:
@Bean
public Employee zhangSan() { return new Employee("张三"); }
@Bean
@Primary
public Employee liSi() { return new Employee("李四"); } // 优先注入此Bean
复制代码
简化配置
在复杂场景(如多数据源、策略模式实现)中,@Primary可作为默认选择,淘汰@Qualifier的显式声明,提升代码简洁性。
松散绑定支持
结合Spring的松散绑定规则,即使Bean名称与字段名不匹配,也能通过类型优先注入@Primary标记的Bean。
二、使用场景与示例
配置类中的Bean定义
在@Configuration类中,通过@Bean方法定义多个同类型Bean时,标记@Primary指定默认实现:
@Configuration
public class DataSourceConfig {
@Bean
public DataSource mysqlDataSource() { /* ... */ }
@Bean
@Primary // 默认数据源
public DataSource postgresDataSource() { /* ... */ }
}
复制代码
组件类声明
在接口实现类上直接标记@Primary,实用于组件扫描场景:
@Component
public class EmailService implements NotificationService { /* ... */ }
@Component
@Primary // 优先注入此实现
public class SMSService implements NotificationService { /* ... */ }
复制代码
动态依靠选择
当需要根据环境动态切换默认实现时(如开发/生产环境),@Primary提供机动的默认配置能力。
三、底层实现原理
元数据处置处罚
在Bean定义阶段,Spring扫描@Primary注解,并在BeanDefinition中设置primary=true属性。
源码关键点:
// ClassPathBeanDefinitionScanner处理注解
if (metadata.isAnnotated(Primary.class.getName())) {
abd.setPrimary(true); // 标记为优先Bean
}
复制代码
依靠注入阶段
当存在多个候选Bean时,DefaultListableBeanFactory优先选择primary属性为true的Bean。若多个Bean均标记@Primary,仍会抛出非常。
四、注意事项与最佳实践
避免滥用
仅在明白需要默认实现时使用@Primary,避免因过度使用导致逻辑紊乱。
若需精确控制注入对象,应结合@Qualifier使用。
与@Qualifier对比
特性@Primary@Qualifier作用范围全局默认选择显式指定特定Bean名称或标识符实用场景简化配置、同一默认行为需要精确控制的复杂依靠场景冲突处置处罚多个@Primary会报错直接通过名称匹配,无冲突风险
测试验证
通过单位测试验证@Primary是否生效,确保注入逻辑符合预期:
@Test
public void testPrimaryBean() {
NotificationService service = context.getBean(NotificationService.class);
assertTrue(service instanceof SMSService); // 验证注入的是@Primary标记的Bean
}
复制代码
五、典型题目与解决
循环依靠题目
若@Primary标记的Bean参与循环依靠,需结合@Lazy耽误初始化或调整Bean定义顺序。
多模块冲突
在模块化项目中,若不同模块均定义@Primary的同类型Bean,需通过@Conditional或Profile控制激活条件。
总结
@Primary是Spring依靠注入中解决多Bean冲突的轻量级工具,通过标记默认实现简化配置逻辑。其核心价值在于降低代码复杂度与提升可维护性,实用于需要同一默认行为的场景。开发者需结合具体需求,在@Primary与@Qualifier间合理选择,并辅以测试保障注入逻辑的正确性。
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
本帖子中包含更多资源
您需要
登录
才可以下载或查看,没有账号?
立即注册
x
回复
使用道具
举报
0 个回复
倒序浏览
返回列表
快速回复
高级模式
B
Color
Image
Link
Quote
Code
Smilies
您需要登录后才可以回帖
登录
or
立即注册
本版积分规则
发表回复
回帖并转播
回帖后跳转到最后一页
发新帖
回复
惊落一身雪
论坛元老
这个人很懒什么都没写!
楼主热帖
看完这个,还不会DVMA,请你吃瓜 ...
腾讯叶聪:朋友圈爆款背后的计算机视觉 ...
聊一聊 TLS/SSL
数据湖选型指南|Hudi vs Iceberg 数据 ...
人工智能对软件测试的影响
rust中的超时处理
图文结合带你搞懂InnoDB MVCC
一个故事看懂CPU的SIMD技术
处理接口幂等性的两种常见方案 ...
Kubernetes(k8s)CNI(flannel)网络 ...
标签云
渠道
国产数据库
集成商
AI
运维
CIO
存储
服务器
快速回复
返回顶部
返回列表