什么是 Spring IOC?
Spring IOC控制反转详解一、什么是 IOCIOCInversion of Control控制反转是一种设计思想不是什么技术实现。它指的是将对象的创建、管理和依赖关系的控制权从程序代码本身转移到外部容器Spring 容器。传统方式 vs IOC传统方式程序控制publicclassUserService{privateUserDaouserDaonewUserDao();// 自己创建依赖对象publicvoidaddUser(){userDao.save();}}IOC 方式容器控制publicclassUserService{AutowiredprivateUserDaouserDao;// 容器注入依赖对象publicvoidaddUser(){userDao.save();}}二、IOC 的核心概念1. 控制反转控制指对象创建、依赖管理的控制权反转从程序代码反转到外部容器2. 依赖注入DIDependency InjectionDI 是 IOC 的实现方式指容器在创建对象时自动将依赖对象注入到目标对象中。3. IOC 容器Spring 提供的容器实现负责管理 Bean 的生命周期和依赖关系。三、Spring IOC 容器1. 两个核心接口// BeanFactory基础容器提供基本的 IOC 功能publicinterfaceBeanFactory{ObjectgetBean(Stringname);TTgetBean(ClassTrequiredType);booleancontainsBean(Stringname);// ...}// ApplicationContext高级容器扩展了更多功能publicinterfaceApplicationContextextendsBeanFactory{// 国际化支持StringgetMessage(Stringcode,Object[]args,Localelocale);// 资源加载ResourcegetResource(Stringlocation);// 事件发布voidpublishEvent(ApplicationEventevent);// ...}2. 常见的实现类// 1. ClassPathXmlApplicationContext从类路径加载配置ApplicationContextcontextnewClassPathXmlApplicationContext(applicationContext.xml);// 2. FileSystemXmlApplicationContext从文件系统加载配置ApplicationContextcontextnewFileSystemXmlApplicationContext(D:/config/applicationContext.xml);// 3. AnnotationConfigApplicationContext基于注解的配置ApplicationContextcontextnewAnnotationConfigApplicationContext(AppConfig.class);// 4. WebApplicationContextWeb 应用专用// 在 Spring Boot 中自动创建四、Bean 的定义方式1. XML 配置方式?xml version1.0 encodingUTF-8?beansxmlnshttp://www.springframework.org/schema/beansxmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexsi:schemaLocationhttp://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd!-- 定义 Bean --beaniduserServiceclasscom.example.UserService!-- 构造器注入 --constructor-argrefuserDao/!-- 属性注入 --propertynamenamevalue张三//beanbeaniduserDaoclasscom.example.UserDao//beans2. 注解方式推荐// 1. Component通用组件ComponentpublicclassUserService{AutowiredprivateUserDaouserDao;}// 2. Service服务层ServicepublicclassUserService{AutowiredprivateUserDaouserDao;}// 3. Repository数据访问层RepositorypublicclassUserDao{publicvoidsave(){// ...}}// 4. Controller控制层ControllerpublicclassUserController{AutowiredprivateUserServiceuserService;}// 5. Configuration配置类ConfigurationComponentScan(com.example)publicclassAppConfig{BeanpublicUserServiceuserService(){returnnewUserService(userDao());}BeanpublicUserDaouserDao(){returnnewUserDao();}}五、依赖注入的方式1. 构造器注入推荐ServicepublicclassUserService{privatefinalUserDaouserDao;// Spring 4.3 单个构造器可省略 AutowiredAutowiredpublicUserService(UserDaouserDao){this.userDaouserDao;}}优点保证依赖不可变final保证对象初始化完成更容易测试2. Setter 注入ServicepublicclassUserService{privateUserDaouserDao;AutowiredpublicvoidsetUserDao(UserDaouserDao){this.userDaouserDao;}}优点灵活可以在运行时修改适合可选依赖3. 字段注入ServicepublicclassUserService{AutowiredprivateUserDaouserDao;}缺点不能使用 final容易导致空指针不利于测试4. 方法注入ServicepublicclassUserService{privateUserDaouserDao;Autowiredpublicvoidinit(UserDaouserDao){this.userDaouserDao;}}六、Bean 的作用域// 1. singleton默认单例整个容器只有一个实例Scope(singleton)publicclassUserService{}// 2. prototype原型每次获取都创建新实例Scope(prototype)publicclassUserService{}// 3. requestWeb 应用每个请求一个实例Scope(valueWebApplicationContext.SCOPE_REQUEST,proxyModeScopedProxyMode.TARGET_CLASS)publicclassUserService{}// 4. sessionWeb 应用每个会话一个实例Scope(valueWebApplicationContext.SCOPE_SESSION,proxyModeScopedProxyMode.TARGET_CLASS)publicclassUserService{}// 5. applicationWeb 应用ServletContext 生命周期Scope(valueWebApplicationContext.SCOPE_APPLICATION,proxyModeScopedProxyMode.TARGET_CLASS)publicclassUserService{}七、Bean 的生命周期ComponentpublicclassUserServiceimplementsBeanNameAware,BeanFactoryAware,ApplicationContextAware,InitializingBean,DisposableBean{// 1. 实例化构造器publicUserService(){System.out.println(1. 实例化);}// 2. 设置属性AutowiredprivateUserDaouserDao;// 3. BeanNameAwareOverridepublicvoidsetBeanName(Stringname){System.out.println(3. BeanNameAware.setBeanName: name);}// 4. BeanFactoryAwareOverridepublicvoidsetBeanFactory(BeanFactorybeanFactory){System.out.println(4. BeanFactoryAware.setBeanFactory);}// 5. ApplicationContextAwareOverridepublicvoidsetApplicationContext(ApplicationContextapplicationContext){System.out.println(5. ApplicationContextAware.setApplicationContext);}// 6. BeanPostProcessor - 前置处理PostConstructpublicvoidpostConstruct(){System.out.println(6. PostConstruct);}// 7. InitializingBeanOverridepublicvoidafterPropertiesSet(){System.out.println(7. InitializingBean.afterPropertiesSet);}// 8. 自定义初始化方法Bean(initMethodinit)publicvoidinit(){System.out.println(8. 自定义初始化方法);}// Bean 可以使用了// 9. PreDestroyPreDestroypublicvoidpreDestroy(){System.out.println(9. PreDestroy);}// 10. DisposableBeanOverridepublicvoiddestroy(){System.out.println(10. DisposableBean.destroy);}// 11. 自定义销毁方法Bean(destroyMethodcleanup)publicvoidcleanup(){System.out.println(11. 自定义销毁方法);}}八、IOC 容器启动流程// 1. 创建容器ApplicationContextcontextnewAnnotationConfigApplicationContext(AppConfig.class);// 内部流程// 1.1 扫描配置类解析 Bean 定义// 1.2 注册 Bean 定义到 BeanDefinitionRegistry// 1.3 实例化单例 Bean非懒加载// 1.4 执行依赖注入// 1.5 执行初始化回调// 1.6 容器启动完成九、自动装配Autowired1. 按类型装配AutowiredprivateUserDaouserDao;// 按类型查找2. 按名称装配AutowiredQualifier(userDaoImpl)// 指定 Bean 名称privateUserDaouserDao;3. 可选依赖Autowired(requiredfalse)// 不存在也不报错privateUserDaouserDao;4. 集合注入AutowiredprivateListUserDaouserDaoList;// 注入所有 UserDao 类型AutowiredprivateMapString,UserDaouserDaoMap;// Bean名称 - Bean实例十、条件化注册 Bean// 1. ConditionalConfigurationpublicclassAppConfig{BeanConditional(WindowsCondition.class)// 满足条件才注册publicUserServicewindowsService(){returnnewWindowsService();}BeanConditional(LinuxCondition.class)publicUserServicelinuxService(){returnnewLinuxService();}}// 2. 常用条件注解ConditionalOnClass(DataSource.class)// 类路径存在ConditionalOnMissingBean(DataSource.class)// 容器中不存在ConditionalOnProperty(nameapp.enabled,havingValuetrue)// 配置属性ConditionalOnExpression(${app.enabled:true})// SpEL 表达式十一、IOC 的优势1. 解耦// 不再需要手动创建和管理对象// 对象之间的关系由容器维护2. 便于测试// 可以轻松注入 Mock 对象TestpublicvoidtestUserService(){UserDaomockDaomock(UserDao.class);UserServiceservicenewUserService(mockDao);// 测试...}3. 配置化管理// 通过配置文件或注解管理对象// 便于维护和修改4. AOP 支持// IOC 容器管理对象便于实现 AOPAspectComponentpublicclassLoggingAspect{Before(execution(* com.example.*.*(..)))publicvoidlogBefore(){// ...}}十二、总结Spring IOC 的核心价值控制反转将对象创建和依赖管理的控制权交给容器依赖注入容器自动将依赖注入到目标对象松耦合对象之间通过接口依赖降低耦合度易测试便于单元测试和集成测试易维护集中管理对象便于配置和修改最佳实践优先使用构造器注入使用注解配置Component、Service 等合理使用 Bean 的作用域理解 Bean 的生命周期合理使用初始化和销毁回调避免循环依赖必要时使用 LazySpring IOC 是 Spring 框架的基石理解它对于掌握 Spring 至关重要

相关新闻

Spring 如何解决循环依赖?

Spring 如何解决循环依赖?

2026/7/5 15:02:20 阅读更多 →
Java计算机毕设之基于springboot的种植基地农业信息管理系统的设计与实现基于springboot的农企信息管理平台设计与开发(完整前后端代码+说明文档+LW,调试定制等)

Java计算机毕设之基于springboot的种植基地农业信息管理系统的设计与实现基于springboot的农企信息管理平台设计与开发(完整前后端代码+说明文档+LW,调试定制等)

2026/7/5 19:08:01 阅读更多 →
【课程设计/毕业设计】基于SpringBoot+Vue农企信息管理平台设计与开发基于springboot的农企信息管理平台设计与开发【附源码、数据库、万字文档】

【课程设计/毕业设计】基于SpringBoot+Vue农企信息管理平台设计与开发基于springboot的农企信息管理平台设计与开发【附源码、数据库、万字文档】

2026/7/3 20:53:22 阅读更多 →

最新新闻

PyTorch 2.x 模型量化实战:3种模式(动态/静态/QAT)精度与速度对比

PyTorch 2.x 模型量化实战:3种模式(动态/静态/QAT)精度与速度对比

PyTorch 2.x 模型量化实战:动态/静态/QAT模式精度与速度深度评测在移动端和边缘计算场景中,模型部署常面临算力与内存的双重约束。PyTorch 2.x提供的量化工具链能将FP32模型压缩为INT8格式,实现4倍存储节省和2-4倍推理加速。本文将基于ResNet…

2026/7/7 7:03:54 阅读更多 →
Day 003:Prompt 不是玄学,写好工业级 Agent 指令的稳定框架

Day 003:Prompt 不是玄学,写好工业级 Agent 指令的稳定框架

系列: 100 天系统学习 AI Agent 开发 当前阶段: 01 - Agent 基础与环境搭建 今日目标: 彻底搞懂 Agent System Prompt 的核心骨架(角色、目标、边界、工具规则、输出格式、异常处理)。 标签: AI Agent 大模…

2026/7/7 7:01:54 阅读更多 →
LED关键参数实战选型指南:5个核心指标决定照明质量与寿命

LED关键参数实战选型指南:5个核心指标决定照明质量与寿命

LED关键参数实战选型指南:5个核心指标决定照明质量与寿命1. 光通量与发光效率:照明效果的经济学光通量(单位:流明,lm)是衡量LED光源总发光量的基础指标。在商业照明项目中,我们曾遇到一个典型案…

2026/7/7 7:01:54 阅读更多 →
QQ音乐解析技术深度解析:逆向工程与API架构设计

QQ音乐解析技术深度解析:逆向工程与API架构设计

QQ音乐解析技术深度解析:逆向工程与API架构设计 【免费下载链接】MCQTSS_QQMusic QQ音乐解析 项目地址: https://gitcode.com/gh_mirrors/mc/MCQTSS_QQMusic 技术挑战与行业痛点 在数字音乐版权保护日益严格的今天,音乐平台API接口的封闭性给开发…

2026/7/7 6:55:51 阅读更多 →
06 Lottery Ticket Hypothesis 详解:稀疏子网络为何能中奖?

06 Lottery Ticket Hypothesis 详解:稀疏子网络为何能中奖?

一、论文基本信息 论文名称:The Lottery Ticket Hypothesis: Finding Sparse, Trainable Neural Networks 作者:Jonathan Frankle, Michael Carbin 会议:ICLR 2019 论文链接:https://openreview.net/forum?idrJl-b3RcF7 arXiv 链…

2026/7/7 6:53:51 阅读更多 →
腾讯云TBDS面向AI时代的多模态智算平台,助力企业AI转型

腾讯云TBDS面向AI时代的多模态智算平台,助力企业AI转型

// TBDS 多模智算平台系列 //随着多模态大模型快速演进,企业在AI基础设施层面面临异构算力管理复杂、数据处理链路冗长、训练推理资源割裂浪费等核心挑战。腾讯云TBDS基于Ray构建多模态数据智算平台,支持GPU/CPU等异构资源统一调度,把多模数…

2026/7/7 6:53:51 阅读更多 →

日新闻

鸿蒙新特性:图片画廊与轮播导航——构建沉浸式图片浏览体验

鸿蒙新特性:图片画廊与轮播导航——构建沉浸式图片浏览体验

图片浏览是移动应用中最高频的场景之一。从社交应用的照片流到电商平台的商品图集,从旅游应用的景点相册到摄影作品展示——用户对图片浏览的体验要求不断提高:流畅的切换动画、直观的缩略图导航、便捷的收藏操作、自动播放模式。HarmonyOS NEXT ArkUI 虽…

2026/7/7 0:05:16 阅读更多 →
24V DC-DC降压芯片PW2312B/PW2815,SOT23-6到SOP8-EP方案对比

24V DC-DC降压芯片PW2312B/PW2815,SOT23-6到SOP8-EP方案对比

24V稳压芯片完整选型指南 PW8600 PW75XX PW2815 PW2312B LDODC/DC全方案 一、24V稳压方案概述 24V直流电源在工业自动化、门禁系统、电梯控制、汽车电子、LED驱动、监控设备等场景中应用极广,是最常见的中压直流母线电压。要将24V母线稳定降压至下游MCU、传感器…

2026/7/7 0:05:16 阅读更多 →
RAG+知识图谱混合检索与Graph RAG核心对比

RAG+知识图谱混合检索与Graph RAG核心对比

做企业RAG落地的团队,往往容易卡在一容易踩坑的选型难题: 当需求单纯靠向量RAG搞不定、单纯靠知识图谱也搞不定,必须同时依赖「文本语义理解 实体关系推理」时,到底是做「向量图谱混合检索」就够了,还是必须上「Grap…

2026/7/7 0:07:19 阅读更多 →

周新闻

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容 【免费下载链接】BiliTools A cross-platform bilibili toolbox. 跨平台哔哩哔哩工具箱,支持下载视频、番剧等等各类资源 项目地址: https://gitcode.com/GitHub_Trending/bilit/BiliTools …

2026/7/6 8:11:50 阅读更多 →
威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型的陌生现状在忙碌疲惫的一天里,参与了关于混合后量子密码学的讨论,应付端点攻击找茬的人,还参与留言板讨论后,发现“威胁模型”对多数人仍是陌生概念,且多被当作时髦用语。有趣的相关画作有一幅由 Embyr 创作的…

2026/7/6 8:11:52 阅读更多 →
渗透测试入门指南:从零基础到实战环境搭建

渗透测试入门指南:从零基础到实战环境搭建

1. 从“看热闹”到“入门”:我理解的渗透测试到底是什么?每次看到新闻里说某个大公司的数据被“黑”了,或者某个网站被攻击导致服务瘫痪,你是不是和我一样,心里会冒出两个念头:一是“这黑客真厉害”&#x…

2026/7/6 6:52:56 阅读更多 →

月新闻