news 2026/4/18 8:27:20

【Spring 核心: IoCDI】从原理到注解使用、注入方式全攻略

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【Spring 核心: IoCDI】从原理到注解使用、注入方式全攻略

Spring 核心:IoC & DI 从原理到注解使用、注入方式全攻略(2026 最新版)

Spring 框架最核心、最闪耀的部分就是IoC(Inversion of Control,控制反转)DI(Dependency Injection,依赖注入)。它们是 Spring 实现“低耦合、高可维护、可测试”代码的基石。掌握 IoC & DI,你就真正掌握了 Spring 的灵魂。

1. IoC 与 DI 的核心概念与原理

IoC(控制反转)
传统方式:程序主动创建依赖对象(new)。
Spring 方式:控制权反转给容器,由 Spring IoC 容器负责对象的创建、装配和管理。

DI(依赖注入)
IoC 的具体实现方式:容器在创建对象时,自动将它所依赖的对象“注入”进来。

经典比喻

  • 传统:你饿了自己去厨房做饭(主动 new 依赖)。
  • Spring:你坐在餐厅,服务员(IoC 容器)把菜(依赖对象)端给你(DI)。

IoC 容器做了什么?

  1. 创建对象(Bean)
  2. 管理对象生命周期(singleton/prototype 等)
  3. 装配对象之间的依赖关系
  4. 提供查找、AOP、事务等高级功能
2. Spring IoC 容器的两种主要实现
容器类型接口/类特点使用场景
BeanFactoryorg.springframework.beans.factory.BeanFactory基础容器,提供最基本的 IoC 功能资源极度受限的环境
ApplicationContextorg.springframework.context.ApplicationContextBeanFactory 的子接口,扩展了国际化、事件发布、AOP 等几乎所有项目都用这个

常用实现类:

  • AnnotationConfigApplicationContext(注解配置,推荐)
  • ClassPathXmlApplicationContext(XML 配置,已过时)
3. 依赖注入的三种方式(重点掌握)

Spring 支持三种注入方式,推荐优先级:构造器 > Setter > 字段

注入方式实现方式推荐度优点缺点示例代码
构造器注入通过构造函数参数注入★★★★★依赖强制、不可变、便于测试、支持循环依赖解决参数多时构造函数臃肿最推荐
Setter 注入通过 setter 方法注入★★★☆☆支持可选依赖、灵活依赖可变、运行时可能被修改适合可选依赖
字段注入直接 @Autowired 到字段★☆☆☆☆代码简洁隐藏依赖、难以单元测试、违反封装原则不推荐

构造器注入示例(推荐写法)

@ServicepublicclassUserService{privatefinalUserRepositoryuserRepository;// Spring Boot 3 + 单构造器可省略 @AutowiredpublicUserService(UserRepositoryuserRepository){this.userRepository=userRepository;}publicvoidsave(Useruser){userRepository.save(user);}}

Setter 注入示例

@ServicepublicclassEmailService{privateMailSendermailSender;@AutowiredpublicvoidsetMailSender(MailSendermailSender){this.mailSender=mailSender;}}

字段注入示例(不推荐)

@ServicepublicclassOrderService{@AutowiredprivatePaymentServicepaymentService;// 隐藏依赖,测试麻烦}
4. 注解驱动的 IoC & DI(现代 Spring 主流方式)

Spring 4+ 推荐完全基于注解配置,XML 已基本淘汰。

核心注解一览表

注解作用位置功能示例
@Component标记为 Spring 管理的 Bean(通用)@Component public class MyService {}
@Service服务层类@Component 的语义化别名业务逻辑层
@Repository持久层类@Component + 异常翻译(持久层异常转 Spring 异常)DAO/Repository
@ControllerWeb 层类@Component + MVC 支持传统 MVC
@RestControllerREST API 类@Controller + @ResponseBody返回 JSON
@Configuration配置类标记为配置类,通常配合 @Bean替代 XML 配置
@Bean方法方法返回值作为 Bean 交给容器管理第三方类无法加 @Component 时使用

组件扫描

@SpringBootApplication// 包含 @ComponentScanpublicclassApplication{publicstaticvoidmain(String[]args){SpringApplication.run(Application.class,args);}}

默认扫描主类同包及其子包下的组件。

@Autowired 注入注解

注解作用位置功能
@Autowired字段、构造器、Setter按类型自动注入(byType)
@Qualifier与 @Autowired 配合指定 Bean 名称注入(解决同类型多个 Bean)
@Primary类上同类型多个 Bean 时优先注入此 Bean
@Resource字段、SetterJSR-250 注解,按名称注入(byName)
@Inject字段、构造器、SetterJSR-330 标准注解,按类型注入

解决同类型多个 Bean 示例

// 方案1:@Primary@Primary@RepositorypublicclassMySqlUserDaoimplementsUserDao{}// 方案2:@Qualifier@Autowired@Qualifier("mySqlUserDao")privateUserDaouserDao;
5. Bean 的作用域(Scope)
作用域注解/配置说明
singleton默认 / @Scope(“singleton”)容器中只有一个实例(最常用)
prototype@Scope(“prototype”)每次注入或获取都创建新实例
request@Scope(“request”)Web 项目中,每个 HTTP 请求一个实例
session@Scope(“session”)每个 HTTP Session 一个实例
6. 生命周期回调
@ComponentpublicclassMyBeanimplementsInitializingBean,DisposableBean{@PostConstruct// 初始化后调用(推荐)publicvoidinit(){System.out.println("Bean 初始化完成");}@PreDestroy// 销毁前调用(推荐)publicvoiddestroy(){System.out.println("Bean 即将销毁");}@OverridepublicvoidafterPropertiesSet()throwsException{/* InitializingBean */}@Overridepublicvoiddestroy()throwsException{/* DisposableBean */}}
7. 最佳实践总结
建议原因
优先使用构造器注入依赖明确、对象不可变、支持循环依赖
接口编程 + DI松耦合,便于测试和切换实现
避免字段注入隐藏依赖、难以单元测试
使用 @Primary 或 @Qualifier优雅解决同类型 Bean 冲突
配置类用 @Configuration + @Bean管理第三方库 Bean
Lombok @RequiredArgsConstructor简化构造器注入代码

Lombok 优化示例

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

IoC 是设计思想:控制权从代码交给容器。
DI 是实现手段:容器把依赖“注入”给对象。
注解 + 构造器注入是现代 Spring 的最佳实践。

掌握了 IoC & DI,你就拥有了编写优雅、可维护 Spring 应用的超级能力!

如果想深入探讨循环依赖原理、@Configuration 代理机制、手写简易 IoC 容器,或者结合 Spring Boot 的自动配置源码分析,随时告诉我,我继续带你飞!🚀

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

Sambert-HifiGan语音合成加速:GPU与CPU性能对比

Sambert-HifiGan语音合成加速:GPU与CPU性能对比 引言:中文多情感语音合成的现实需求 随着智能客服、虚拟主播、有声阅读等应用场景的普及,高质量的中文多情感语音合成(Text-to-Speech, TTS) 成为AI落地的关键能力之一。…

作者头像 李华
网站建设 2026/4/13 18:47:07

GPU算力不够用?开源镜像优化让显存利用率翻倍

GPU算力不够用?开源镜像优化让显存利用率翻倍 Image-to-Video图像转视频生成器 二次构建开发by科哥 在AIGC(人工智能生成内容)领域,图像到视频(Image-to-Video, I2V)生成技术正迅速成为创意生产的核心工具…

作者头像 李华
网站建设 2026/4/17 19:41:07

中文多情感语音合成能力全面测试:愤怒、快乐、悲伤样样精通

中文多情感语音合成能力全面测试:愤怒、快乐、悲伤样样精通 📌 引言:让AI声音拥有“情绪”的时代已来 在智能客服、虚拟主播、有声读物等应用场景中,传统语音合成(TTS)系统往往只能输出单调、机械的语调&…

作者头像 李华
网站建设 2026/4/18 8:18:40

基于I2VGen-XL的图像转视频系统搭建全流程

基于I2VGen-XL的图像转视频系统搭建全流程 📌 项目背景与技术选型 随着多模态生成模型的快速发展,图像到视频(Image-to-Video, I2V) 技术正成为内容创作、影视特效和虚拟现实领域的重要工具。传统视频生成依赖大量帧间插值与人工动…

作者头像 李华