news 2026/6/15 19:38:48

spring-依赖注入

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
spring-依赖注入

Spring 中的依赖注入(Dependency Injection,DI)深度解析

依赖注入是 Spring 框架的核心机制,也是控制反转(Inversion of Control,IoC)的具体实现方式。它彻底改变了传统 Java 开发中“对象自己创建依赖对象”的方式,转而由 Spring IoC 容器负责创建、管理和注入对象之间的依赖关系,从而实现低耦合、高可维护性、可测试性

1. 什么是依赖注入?

传统方式(紧耦合)

publicclassUserService{privateUserDaouserDao=newUserDaoImpl();// 自己new依赖对象publicvoidsave(){userDao.save();}}

依赖注入方式(松耦合)

publicclassUserService{privateUserDaouserDao;// 只声明依赖,不负责创建// 通过构造器、Setter 或字段注入publicvoidsetUserDao(UserDaouserDao){this.userDao=userDao;}publicvoidsave(){userDao.save();}}

Spring 容器会在运行时把UserDao的实现对象自动“注入”到UserService中。

核心好处

  • 解耦:类不再依赖具体实现,只依赖抽象(接口)
  • 易测试:可以轻松注入 Mock 对象进行单元测试
  • 可配置:通过配置文件或注解灵活切换实现
  • 便于管理对象生命周期
2. Spring 支持的三种依赖注入方式
注入方式说明推荐程度示例代码
构造器注入通过构造函数参数注入依赖★★★★★最推荐(强制依赖、不可变、易测试)
Setter 注入通过 setter 方法注入★★★☆☆适合可选依赖
字段注入直接在字段上使用 @Autowired★☆☆☆☆不推荐(难以测试、隐藏依赖、违反封装原则)

构造器注入示例(推荐)

@ServicepublicclassUserService{privatefinalUserDaouserDao;// 构造器注入(Spring 4.3+ 单构造器可省略 @Autowired)publicUserService(UserDaouserDao){this.userDao=userDao;}publicvoidsave(){userDao.save();}}

Setter 注入示例

@ServicepublicclassUserService{privateUserDaouserDao;@AutowiredpublicvoidsetUserDao(UserDaouserDao){this.userDao=userDao;}}

字段注入示例(不推荐)

@ServicepublicclassUserService{@AutowiredprivateUserDaouserDao;// 隐藏依赖,单元测试麻烦}
3. @Autowired 的工作原理与注入点

@Autowired是 Spring 提供的最常用注解,可作用在:

  • 字段
  • 构造器
  • Setter 方法
  • 任意方法(带参数)

按类型自动注入(byType)
Spring 默认按照类型匹配 Bean。如果同类型有多个 Bean,会报错(NoUniqueBeanDefinitionException)。

解决多个同类型 Bean 的方案

  1. @Primary:标记首选 Bean
@Primary@ComponentpublicclassMySqlUserDaoimplementsUserDao{}
  1. @Qualifier:指定 Bean 名称
@Autowired@Qualifier("mySqlUserDao")privateUserDaouserDao;
  1. 按名称注入(字段名或参数名与 Bean 名一致)
4. 现代 Spring Boot 中的依赖注入实践

Spring Boot 进一步简化了 DI 配置:

// 接口publicinterfaceUserRepositoryextendsJpaRepository<User,Long>{}// 实现(Spring Data JPA 自动提供)@Repository// 可省略,Spring Boot 自动识别publicinterfaceUserRepository{...}// 服务层@ServicepublicclassUserService{privatefinalUserRepositoryuserRepository;publicUserService(UserRepositoryuserRepository){this.userRepository=userRepository;}publicUserfindById(Longid){returnuserRepository.findById(id).orElse(null);}}
5. 依赖注入的核心组件:IoC 容器

Spring 的 IoC 容器主要有两种:

  • BeanFactory:基础容器,提供基本的 DI 功能
  • ApplicationContext:增强版(推荐使用),支持国际化、事件发布、AOP 等

常用实现:

  • AnnotationConfigApplicationContext(注解配置)
  • ClassPathXmlApplicationContext(XML 配置,已过时)
6. Bean 的作用域(Scope)
作用域说明默认
singleton单例(容器中只有一个实例)
prototype每次注入或获取都创建新实例
requestWeb 项目中,每个 HTTP 请求一个实例
session每个 HTTP Session 一个实例
application整个 ServletContext 一个实例

使用方式:

@Component@Scope("prototype")publicclassPrototypeBean{}
7. 最佳实践总结
建议原因
优先使用构造器注入依赖明确、对象不可变、便于测试
接口编程 + DI松耦合,便于切换实现
避免字段注入隐藏依赖、难以单元测试
使用 @Primary 或 @Qualifier解决同类型多个 Bean 的冲突
结合 Lombok 的 @RequiredArgsConstructor简化构造器注入代码

Lombok 优化示例

@Service@RequiredArgsConstructor// 自动生成含 final 字段的构造器publicclassUserService{privatefinalUserRepositoryuserRepository;}
8. 一句话总结

依赖注入是 Spring 的灵魂:它把“谁依赖谁、谁创建谁”的控制权从代码中剥离,交给容器管理,让你的代码更干净、更灵活、更易维护。

掌握了 DI,你就真正掌握了 Spring 的精髓!如果想深入探讨循环依赖如何解决、@Configuration 的代理机制、或者手写一个简易 IoC 容器,欢迎继续问我!🚀

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/15 13:16:20

智能硬件搭档:音箱/机器人内置Sambert-Hifigan语音引擎

智能硬件搭档&#xff1a;音箱/机器人内置Sambert-Hifigan语音引擎 &#x1f4cc; 技术背景与应用价值 在智能音箱、服务机器人、车载语音助手等智能硬件快速普及的今天&#xff0c;自然、富有情感的中文语音合成&#xff08;TTS&#xff09;能力已成为提升用户体验的核心要素。…

作者头像 李华
网站建设 2026/6/15 12:38:25

火绒强力卸载工具Beta版发布:一款专注于纯净卸载的免费利器

在Windows系统日常使用中&#xff0c;软件卸载不彻底、残留文件注册表堆积、以及部分顽固软件难以清除是常见痛点。虽然市面上有GeekUninstaller、IObit Uninstaller等优秀工具&#xff0c;但免费版功能受限或伴有广告。火绒安全此次推出的独立工具&#xff0c;旨在为用户提供一…

作者头像 李华
网站建设 2026/6/15 13:34:56

吐血推荐8个AI论文网站,研究生轻松搞定毕业论文!

吐血推荐8个AI论文网站&#xff0c;研究生轻松搞定毕业论文&#xff01; AI 工具助力论文写作&#xff0c;高效又省心 对于研究生来说&#xff0c;撰写毕业论文是一项既繁琐又重要的任务。从选题、开题到资料收集、大纲搭建&#xff0c;再到初稿撰写和反复修改&#xff0c;每一…

作者头像 李华
网站建设 2026/6/15 12:38:37

vue+nodejs网络异常流量检测系统的可视化大屏系统_pr8y9d3i

文章目录系统概述技术架构核心功能可视化设计应用场景项目技术介绍开发工具和技术简介nodejs类核心代码部分展示结论源码文档获取/同行可拿货,招校园代理 &#xff1a;文章底部获取博主联系方式&#xff01;系统概述 VueNode.js网络异常流量检测系统的可视化大屏系统旨在通过实…

作者头像 李华
网站建设 2026/6/15 13:32:35

基于springboot线上兼职招聘信息管理系统

基于 SpringBoot 的线上兼职招聘信息管理系统是一款专注于连接兼职求职者与用工方的数字化平台&#xff0c;借助 SpringBoot 框架的高效后端处理能力&#xff0c;实现兼职信息发布、简历投递、用工匹配、流程管理等全流程线上化&#xff0c;旨在解决传统兼职招聘中信息分散、信…

作者头像 李华
网站建设 2026/6/15 15:33:24

跨平台实战:将M2FP服务集成到移动应用的完整流程

跨平台实战&#xff1a;将M2FP服务集成到移动应用的完整流程 作为移动应用开发者&#xff0c;如果你想在iOS/Android应用中集成M2FP的人体解析能力&#xff0c;但苦于不知如何将Python模型服务化并对外提供API接口&#xff0c;这篇文章正是为你准备的。M2FP&#xff08;Mask2Fo…

作者头像 李华