IoC 是如何为 Spring 的其他核心功能(如 AOP、事务管理)提供基础支持的

一.工厂模式+Spring IOC spring IOC的概述 ,从工厂模式入手进而引入spring中的IOC 阅读详情

IoC 容器是 Spring 的“中央集权”系统。因为它完全控制了所有 Bean(对象)的创建、装配和生命周期,所以它获得了在一个“上帝视角”对这些 Bean 进行拦截、修改和增强的权力。AOP 和声明式事务管理,正是利用了这个权力。

我们用一个“汽车工厂”的比喻来剖析这个过程。

  • IoC 容器:一个高度自动化的汽车工厂。
  • Bean 定义:汽车的设计蓝图(比如:需要一个四缸引擎、四个轮子、一个车身)。
  • 原始 Bean 对象:按照蓝图组装好的、最基础的汽车。

现在,工厂(IoC 容器)在把这辆基础汽车交付给你(注入到其他 Bean)之前,可以做一些事情。


IoC 是如何为 AOP(面向切面编程)提供基础的

AOP 的目标是将横切关注点(如日志、安全、事务)从业务代码中分离出来。Spring AOP 的实现方式主要是动态代理。

这个过程在“汽车工厂”里是这样的:

  1. 识别需要增强的对象:工厂的“质量控制系统”(AOP 配置)发现,某些型号的汽车(比如所有标记了 @Service 的 Bean)在出厂前,需要加装一个“行车记录仪”(日志切面)。

  2. 创建代理(The Core Idea):工厂并不直接把那辆基础汽车交出去。相反,它做了一件非常聪明的事:

    • 它找来一个技术高超的“改装师”(Proxy Factory)。
    • 改装师以基础汽车为模型,造了一个外观一模一样的**“克隆车”**(代理对象)。
    • 这个克隆车内部,不仅包含了原车的所有功能,还在方向盘、油门、刹车等关键操作点安装了传感器和控制器(这就是 AOP 的“通知/Advice”)。
  3. 无缝替换和交付:

    • 现在,当另一个组件(比如 Controller)向工厂申请一辆 Service 汽车时,工厂交付给它的是这辆加装了行车记录仪的“克隆车”(代理对象),而不是那辆基础汽车。
    • Controller 根本不知道自己拿到的是一辆改装过的车。它像平常一样踩油门(调用业务方法)。
  4. AOP 生效:

    • 当 Controller 踩下油门时,首先触发的是“克隆车”上的传感器(@Before 通知)。行车记录仪开始录像(记录日志)。
    • 然后,传感器再把指令传递给真正的引擎,让汽车前进(调用原始的业务方法)。
    • 当驾驶结束时,传感器再次被触发(@After 通知),行车记录仪保存录像(日志记录结束)。

IoC 在这里的关键作用:

  • 拦截机会(Interception Point):因为 IoC 容器控制了 Bean 的创建过程,所以它有机会在返回 Bean 之前,判断是否需要创建代理来替换它。如果应用程序自己 new UserService(),Spring 就完全没有机会介入。
  • 依赖注入的无感知性(Seamless Injection):IoC 容器负责将这个代理对象注入到所有需要它的地方。调用方对此毫不知情,代码完全无侵入。这是 AOP 得以透明工作的基石。

IoC 和 AOP 是如何为事务管理提供基础的

声明式事务管理(@Transactional)是 AOP 的一个最经典、最重要的应用。

在“汽车工厂”的比喻中,@Transactional 就像是给汽车加装一个“自动安全驾驶系统”。

  1. 识别目标:工厂的“质量控制系统”发现,某个业务方法(比如 placeOrder())上标注了 @Transactional。这就像一个指令:“这辆车在执行‘下单’这个驾驶任务时,必须开启自动安全驾驶模式”。

  2. 创建事务代理:和上面的过程一样,IoC 容器会为这个 Service Bean 创建一个代理对象。这个代理对象就是加装了“自动安全驾驶系统”的克隆车。

  3. 事务的执行流程:

    • 当 Controller 调用 placeOrder() 方法时,它实际上是在调用代理对象的 placeOrder() 方法。
    • 代理的逻辑开始执行(@Before):
      • “自动安全驾驶系统”被激活。
      • 它检查当前是否有正在运行的安全模式(事务),如果没有,就开启一个新的安全模式(connection.setAutoCommit(false),开启事务)。
    • 调用原始方法:
      • 系统开始执行真正的 placeOrder() 业务逻辑(更新订单表、扣减库存……)。
    • 根据结果决定后续操作(@AfterReturning / @AfterThrowing):
      • 如果原始方法顺利完成:系统判断任务成功,发出“确认”指令(connection.commit(),提交事务)。
      • 如果原始方法中途抛出异常(比如库存不足):系统判断任务失败,发出“紧急撤销”指令(connection.rollback(),回滚事务),将所有已经做的操作恢复到任务开始前的状态。

IoC 在这里的关键作用:

  • 提供了代理创建的平台:同上,IoC 容器是创建和管理这个“事务代理”的唯一场所。
  • 保证了事务的边界:因为代理包裹了原始方法,所以它能够在方法开始前开启事务,在方法结束后(无论成功还是失败)提交或回滚事务,从而完美地控制了事务的边界。如果没有 IoC 和 AOP,你就必须在每个业务方法里手动编写 try-catch-finally 块来管理数据库连接和事务,代码会变得极其冗长和脆弱。

总结

概念角色作用
Spring IoC 容器中央工厂和管理者提供了一个拦截和替换 Bean 的机会点。它是所有高级功能的基础平台。
Spring AOP智能改装师 (Proxy Factory)利用 IoC 提供的机会,在不修改源码的情况下,为原始 Bean 创建一个功能增强的代理 Bean。
声明式事务一种具体的改装方案AOP 的一个具体应用。通过代理,为业务方法自动包裹上事务开启、提交、回滚的逻辑。

这个关系链是:IoC 赋予了 Spring 控制权 -> Spring 利用这个控制权实现了 AOP -> AOP 成为了实现声明式事务等横切关注点的强大工具。

Spring入门到精通:第一章 基础入门:1.Spring框架概述 前言:为什么要学习Spring框架? 为什么要学习Spring框架呐? (1)使用广泛:现在很多的企业都有Spring的影子,不管是SSM、SSH,还是特别流行的Spring Boot都有它美丽的影子。 (2)基于设施:Spring已经成为和Java核心库一样的基础设施,如果想成为一个合格的Java程序员,Spring肯定绕不开。 (3)整合其它的框架:可以方便的整合其它的框架,比如:MyBatis、Hibernate。 (4)学习Spring优雅的设计理念:对于java特性接口、抽... 阅读详情

相关推荐

VMFS数据存储(datastore)丢失后恢复步骤

vmfs datastore恢复步骤

jetliu05的博客 3267

spring框架

为什么要使用spring框架? spring 是一个开源的轻量级 JavaBean 容器框架。使用 JavaBean 代替 EJB ,并提供了丰富的企业应用功能,降低应用开发的复杂性。 轻量:非入侵性的、所依赖的东西少、资源占用少、部署简单,不同功能选择不同的 jar 组合 容器:工厂模式实现对 JavaBean 进行管理,通过控制反转(IOC)将应用程序的配置和依赖性与应用代码分开 松耦合:通过 xml 配置或注解即可完成 bean 的依赖注入 AOP:通过 xml 配置 或注解即可加入面向切面编程的能

m0_48028855的博客 229

大厂面试题-为什么要使用Spring框架

2、IOC/DI:Spring通过IOC容器实现了Bean的生命周期的管理,以及通过DI实现依赖注入,从而实现了对象依赖的松耦合管理。5、事务管理:Spring通过AOP实现了事务的统一管理,对应用开发中的事务处理提供了非常灵活的支持。3、面向切面的编程(AOP):Spring 支持面向切面的编程,从而把应用业务逻辑和系统服务分开。它的核心目的是为了简化企业级应用程序的开发,使得开发者只需要关心业务需。非常完善的支持,更重要的是社区的活跃度和技术的成熟度。版本发布到现在,它的生态已经非常庞大了。

gnwu1111的专栏 582

GPS从入门到放弃(十七) --- 对流层延时

GPS从入门到放弃(十七) — 对流层延时 对流层概念 对流层(Troposphere)地球大气层靠近地面的一层。它同时是地球大气层里密度最高的一层,它蕴含了整个大气层约75%的质量,以及几乎所有的水蒸气及气溶胶。 对流层的下界与地面相接,上界高度随地理纬度和季节而变化,在低纬度地区平均高度为1718公里,在中纬度地区平均为1012公里,在高维度地区平均为8~9公里,并且夏季高于冬季。 卫星导航...

tyst08的专栏 1万+

AD9361数字调制入门:从IQ调制原理到动手实现第一个ASK信号(Vivado工程详解)

本文详细介绍了如何使用AD9361射频收发器实现ASK数字调制,从IQ调制原理到Vivado工程实现。通过Verilog代码示例和FPGA架构设计,帮助开发者理解纯逻辑实现数字调制解调的关键技术,特别适合软件无线电(SDR)初学者入门实践。

weixin_29158047的博客 374

Spring的下载及基础知识

Spring 1. 下载: https://repo.spring.io/simple/libs-release-local/org/springframework/spring/4.3.6.RELEASE/ 2. 4个核心包: *spring-core-4.3.6.RELEASE.jar Spring框架基本的核心工具类 *spring-beans-4.3.6.RELEASE.jar 所有应用都要用到的jar包, 访问配置文件、创建和管理Bean以及进行Io...

h2017010687的博客 274

LaTeX公式转Word竟这么简单?Python三行代码实现学术论文格式无忧

本文介绍如何利用Python的latex2word库,仅需三行代码即可将LaTeX数学公式精准转换为Word原生Office Math对象,解决学术写作中LaTeX与Word格式割裂的难题。该方法支持批量处理、格式保真,并能与Markdown、Jupyter Notebook等工具集成,构建自动化写作流程,实现学术论文格式无忧。

qsc90123456的博客 295

Spring框架的核心技术

Spring概述  Spring是一个分层的Java SE/EE应用一站式的轻量级开源框架。Spring核心是IOC和AOP。 Spring主要优点包括: 方便解耦,简化开发,通过Spring提供的IoC容器,我们可以将对象之间的依赖关系交由Spring进行控制,避免硬编码造成的程序耦合度高。 AOP编程的支持,通过Spring提供的AOP功能,方便进行面向切面编程。 声明式事务的支持,在Spr...

匆匆321 1248

【低空经济】低空无人机公共测试场与验证基地设计方案

公共测试场与验证基地是为低空无人机相关技术的研发、测试与应用提供一个系统性的平台。在无人机产业蓬勃发展的背景下,建设一个配备完善、功能齐全的公共测试场与验证基地显得尤为重要。该基地不仅可以作为无人机的测试和验证场地,还可以为相关企业、科研机构以及政府部门提供技术支持和服务。因此,为此基地的设计方案必须综合考虑功能性、安全性、灵活性与可持续性等多方面的因素。首先,公共测试场需划分为多个专用区域,以便满足不同类型无人机的测试需求。这包括低空飞行区域、紧急着陆区、操控模拟区和监测与数据采集区等。

2502_92579126的博客 1596

DBeaver连接ClickHouse保姆级教程:从安装到成功测试(附驱动下载问题解决)

本文提供了一份详细的DBeaver连接ClickHouse实战指南,重点解决了驱动下载失败等常见问题。文章从环境准备、DBeaver安装讲起,详细阐述了手动配置ClickHouse驱动的可靠方案,并逐步指导完成连接配置与测试,最后介绍了基础操作与查询优化技巧,旨在帮助用户高效完成连接并快速上手使用。

pink的博客 877

Spring简介

1.什么是SpringSpring是分层的Java EE 应用轻量级开源框架,以IOC(控制反转)和AOP(切面编程)为内核,提供了展现层Spring MVC、持久层Spring JDBC以及业务层事物管理等企业级应用技术。此外,Spring整合了许多著名的第三方框架和类库,逐渐成为使用最多的轻量级Java EE开源框架2.Spring的优势(1)方便解耦,简化开发。Spring提供Ioc容器,用...

zzy296753977的博客 190

【微服务】SpringBoot 整合Kafka 项目实战操作详解

SpringBoot 整合Kafka 实战操作详解

congge 5570

Spring框架 功能速览

Spring框架是一个开源的Java企业级开发平台,其核心功能包括IoC容器(依赖注入与控制反转)和AOP支持,通过模块化结构提供全面开发支持。主要模块涵盖Spring Core(基础功能)、Spring MVC(Web开发)、Spring Data(数据访问)、Spring Security(安全控制)和Spring Boot(简化配置)。关键特性表现为灵活的依赖注入方式、声明式事务管理以及强大的第三方框架集成能力。该框架广泛应用于企业系统、Web服务、微服务架构和大数据处理等领域,因其组件化设计、低耦合

csdn_tom_168的博客 696

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

spring总结

什么是spring? spring是目前最为流行的一种、轻量级的JAVAEE开源框架之一。创造出spring的目的是为了简化企业应用程序的开发,它使得开发者只需要关注业务需求本身。它的核心功能是IoC(控制反转)和AOP(面向切面编程),除此之外,它还提供了springmvc、spring jdbc以及业务层事务管理等众多出色的企业级应用技术,还能整合众多开源的第三方框架和类库。 spring主要...

weixin_44042996的博客 204

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

《转载》跟我学spring3

 一、《跟我学spring3》电子书下载地址: 《跟我学spring3》  (1-7 和 8-13) http://jinnianshilongnian.iteye.com/blog/pdf   跟我学spring3系列 word原版 下载 二、源代码下载 最新依赖地址: http://docs.spring.io/downloads/nightly/snapshot-download.php?p...

weixin_34337265的博客 139

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

Spring框架—控制反转(IOC)

Spring框架概述 1 什么是Spring Spring是一个开源框架,Spring是于2003 年兴起的一个轻量级的Java 开发框架,由Rod Johnson 在其著作Expert One-On-One J2EE Development and Design中阐述的部分理念和原型衍生而来。它是为了解决企业应用开发的复杂性而创建的。框架的主要优势之一就是其分层架构,分层架构允许使用者选择使用哪...

zhaochen_2002的博客 360

Spring体系结构介绍

1.认识Spring     Spring是分层的Java Se/EE轻量级开源框架,以Ioc和Aop为核心,提供了展现层Spring MVC和持久层Spring JDBC以及业务层事务管理等众多企业级应用技术,逐渐成为使用最多的J2EE企业应用开源框架。 2.Spring带给我们什么     (1)方便解耦,简化开发     (2)AOP编程支持     (3)声明式事务的支持 ...

iteye_17677的博客 258

spring

1、Spring 1.1、简介 Spring是一个轻量级控制反转(loC)和面向切面(AOP)的容器框架 解决了企业级开发的复杂性,适用于任何java应用 2002,首次推出Spring框架的雏形:interface21 框架 Spirng框架即以interface21为框架为基础,经过重新设计,并不断丰富其内涵于2004年3月24日发布了1.0正式版 解决企业企业应用开发的复杂性 Rod Johnson 创始人 专业居然不是计算机而是音乐学 非常牛逼 SSH: Strus2 + Spring

lyyibaobao的博客 184

整理一份详细的Spring 面试题,为明年跳槽做准备

基于Spring Framework 4.x 总结的常见面试题,系统学习建议还是官方文档走起:https://spring.io/projects/spring-framework#le...

weixin_45737309的博客 203

认识Spring

 Spring的核心是个轻量级(Lightweight)的容器(Container), 它是实现IoC(Inversion of Control)容器, 非侵入性(No intrusive)的框架, 并提供AOP(Aspect-oriented programming)概念的实现方式, 提供对持久层(Persistence), 事务(Transaction)的支持, 提供MVC Web框架的实现,...

SCliu123的专栏 234

一、Spring框架的概述

轻量级jar数量比较少,体积较小,可以使用Spring独立完成项目的开发,不需要依赖于其它的组件.有的框架运行必须引入其它的第三方的组件。支持面向桌面级应用(Windows下的应用程序)的Java平台,提高平了完成的Java核心API,此版本以前称为J2SE。Spring是轻量级的开源的JavaEE的框架。2.Spring的两个核心部分。4.Spring的体系结构。3.Spring的特点。1.Spring介绍。...

大武不想当菜鸟的博客 382

Spring笔记(一)-------Spring框架简介

简介 主要发明者:Rod Johnson 轮子理论推崇者: 轮子理论:不重复发明轮子 IT行业:直接使用写好的代码 Spring框架宗旨:不重新发明技术,让原有技术使用起来更加方便。 Spring三大核心功能: IoC/DI (控制反转/依赖注入) AOP (面向切面编程) 声明式事务 Spring框架runtime test:spring提供的测试功能 Core Container:核心容器,Spring启动最基本条件 Beans:Sprin

qq_42765393的博客 163

Spring核心技术

Spring的概述 Spring框架,可以解决对象创建以及对象之间依赖关系的一种框架。 且可以和其他框架一起使用;Spring与Struts, Spring与hibernate (起到整合(粘合)作用的一个框架) Spring提供了一站式解决方案: 1) Spring Core spring的核心功能: IOC容器, 解决对象创建及依赖关系 2) Spring Web Spring对web模...

JavaAlliance 948

Spring框架快速入门之简介

v/:* {behavior:url(#default#VML);}o/:* {behavior:url(#default#VML);}w/:* {behavior:url(#default#VML);}.shape {behavior:url(#default#VML);} Normal 0 7.8 磅 0 2

忆年--尘封的记忆 1039

Spring概述

部分转载来自:w3cschool 一、程序间的依赖关系 1、程序的耦合:调用者或被调用者的依赖关系 2、耦合的缺点:      1、维护不方便      

m0_37898659的博客 353
上一篇: 在Spring Boot 开发中 Bean 的声明和依赖注入最佳的组合方式是什么?
下一篇: 计算机如何存储信息?python 变量(Variable)和对象(Object)在内存中是什么关系?
冰糖心书房
博客等级 码龄15年 6014粉丝 690原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

冰糖心书房

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值