Spring 两大核心:IOC 与 AOP,看懂框架设计本质
日常开发中我们天天在用Spring框架,不管是写业务接口、操作数据库,还是管控事务日志,底层都离不开IOC和AOP两大核心思想。这两个概念也是Spring的立身之本,弄懂它们,才算真正入门Spring开发。

一、什么是IOC控制反转

先抛开专业名词,聊聊我们传统Java开发的写法。
以前编写业务代码时,需要使用别的类功能,都要手动通过new关键字创建对象。比如业务服务层要调用数据层查询数据,就得在服务类里直接new出Dao对象。
这种写法弊端很明显,类与类之间紧紧绑定在一起。后续如果想要更换Dao的实现类,就得修改业务层代码,改动一处就可能引发连锁问题,代码耦合度极高,后期维护和测试都特别麻烦。
而IOC控制反转,就是彻底改变对象的创建与管理方式。
原本由开发者主动创建、把控对象依赖关系的控制权,反转交给Spring容器全权管理。我们不再手动new对象,只需要声明当前类需要依赖哪些组件,Spring容器就会自动完成对象实例化、依赖装配、生命周期管理整套流程。
IOC的落地实现就是依赖注入,平时项目里常用的构造器注入、@Autowired注解注入,都是依赖注入的具体形式。容器根据规则,自动把所需对象注入到当前类中,全程无需开发者手动干预。
二、IOC带来的实际开发好处
- 彻底解耦,业务代码更灵活
类之间不再硬编码绑定具体实现,只依赖抽象接口。后续迭代升级、替换底层实现类,上层业务代码完全不用改动,大大降低代码改动风险。 - 单元测试更加便捷
脱离固定对象依赖,测试时可以轻松注入模拟测试对象,不用搭建完整业务环境,就能单独测试某一段逻辑,测试效率大幅提升。 - 统一管控对象生命周期
所有交给Spring管理的Bean,从创建、初始化到销毁,全部由容器统一调度,不用开发者单独维护对象状态,减少冗余代码。 - 代码结构整洁规范
对象依赖配置统一管理,业务代码只专注核心业务逻辑,不用掺杂对象创建逻辑,可读性和规范性都更好。
三、什么是AOP面向切面编程

开发过程里能发现很多重复通用逻辑:接口请求日志记录、数据库事务管控、接口权限校验、方法执行耗时统计……这些功能不属于核心业务,但几乎每个业务方法都要用到。
如果把这些通用代码挨个写进业务方法里,不仅代码臃肿杂乱,还会大量重复编写,后续修改维护也要逐个改动,效率极低。
AOP面向切面编程,就是把这些和核心业务无关、多处复用的通用功能,单独抽取出来形成切面。在不修改原有业务代码的前提下,将切面逻辑动态嵌入到指定方法执行前后。
举个最贴合日常的例子:我们编写下单付款核心业务,只专注编写订单创建、金额扣减、库存变动这些核心逻辑。事务开启提交、接口入参日志、异常拦截回滚,全部通过AOP切面自动植入,不会侵入下单业务代码,各司其职互不干扰。
四、AOP常用业务场景
- 事务管理:项目中
@Transactional注解,依靠AOP实现方法事务自动开启、提交、异常回滚,保障数据安全。 - 日志统一处理:记录接口调用参数、返回结果、报错信息,方便线上问题排查。
- 权限拦截校验:方法执行前判断用户权限,无权限直接拦截请求。
- 性能监控统计:统计每个业务方法运行耗时,定位性能瓶颈。
- 接口缓存处理:查询接口优先读取缓存,减少数据库频繁访问压力。
五、AOP底层实现原理
AOP能够无侵入增强方法功能,核心依靠动态代理技术。
Spring会在程序运行阶段,自动为目标业务类生成代理对象,真正调用方法时,实际执行的是代理对象逻辑。
代理分为两种类型:
- JDK动态代理:目标类实现了接口,基于接口生成代理对象,仅能代理接口定义的方法;
- CGLIB代理:目标类没有接口,通过继承目标类生成子类作为代理,能够代理类中所有方法。
整体执行流程很简单:调用业务方法时,先执行切面里的通用逻辑,再放行执行原本的核心业务代码,以此实现功能增强。
六、Spring事务底层实现逻辑
我们日常使用的声明式事务,本质就是IOC容器管理Bean + AOP动态代理共同实现。
- 在业务方法上标注
@Transactional事务注解,Spring扫描识别后,会为当前类创建代理对象; - 外部调用带事务的方法时,请求先进入事务拦截器,不会直接执行业务代码;
- 方法执行前,拦截器自动获取数据库连接,关闭自动提交,正式开启事务;
- 业务代码正常执行完毕,拦截器自动提交事务,数据持久保存;
- 一旦代码运行抛出异常,拦截器立刻触发事务回滚,撤销本次所有数据库操作,避免脏数据产生。

更多推荐



所有评论(0)