IOC(控制反转)和AOP(面向切面编程)区别

news/2025/4/2 6:00:35/文章来源:https://www.cnblogs.com/xh13k/p/18802151

1. 核心思想对比

对比维度 IOC(控制反转 / 依赖注入) AOP(面向切面编程)
目标 解耦对象间的依赖关系 解耦横切关注点(如日志、事务、权限)
实现方式 由容器管理对象的创建和依赖注入 通过动态代理或字节码增强实现功能增强
关注点 对象生命周期和依赖关系 跨越多个模块的公共行为
代码侵入性 低侵入性(通过配置或注解声明依赖) 无侵入性(功能增强不影响原始代码逻辑)
典型应用场景 管理 Service、DAO 层的依赖关系 日志记录、事务管理、权限校验、性能监控等

2. 具体实现原理

(1) IOC(控制反转)

  • 核心机制:将对象的创建、依赖关系的管理交给容器(如 Spring IoC 容器),而不是由开发者直接通过 new 实例化对象。
  • 依赖注入(DI):通过构造函数、Setter 方法或注解(如 @Autowired)自动注入依赖对象。
  • 示例
    @Service
    public class UserService {// 由容器自动注入 UserDao 的实例@Autowiredprivate UserDao userDao;
    }
    

(2) AOP(面向切面编程)

  • 核心机制:通过动态代理(JDK Proxy 或 CGLIB)在目标方法执行前后插入横切逻辑(如日志记录)。
  • 关键概念
    • 切面(Aspect):封装横切逻辑的模块(如日志切面)。
    • 通知(Advice):定义在何时执行逻辑(如 @Before@After@Around)。
    • 连接点(Join Point):可插入横切逻辑的点(如方法调用)。
    • 切点(Pointcut):定义哪些连接点会被拦截。
  • 示例
    @Aspect
    @Component
    public class LogAspect {// 拦截所有 Service 层的 public 方法@Pointcut("execution(public * com.example.service.*.*(..))")public void serviceLayer() {}@Before("serviceLayer()")public void logBefore(JoinPoint joinPoint) {System.out.println("方法执行前记录日志: " + joinPoint.getSignature());}
    }
    

3. 解决的问题对比

问题类型 IOC 的解决方案 AOP 的解决方案
对象依赖管理 避免硬编码依赖,实现松耦合 不直接解决依赖问题
代码重复 无法解决跨模块的重复代码 将重复代码抽取为切面,统一维护
业务逻辑与非功能逻辑混合 无法分离(如业务代码中嵌入事务控制代码) 将非功能逻辑(如事务)剥离到切面中
可维护性 通过依赖管理提升可维护性 通过模块化横切逻辑提升可维护性

4. 实际应用场景对比

(1) IOC 的典型场景

  • 依赖管理:Service 层依赖 DAO 层对象。
  • 单例模式:通过容器管理单例 Bean,避免重复创建对象。
  • 配置解耦:通过 @Configuration@Bean 集中管理配置。

(2) AOP 的典型场景

  • 日志记录:统一记录方法的入参、出参和执行时间。
  • 事务管理:通过 @Transactional 注解实现声明式事务。
  • 权限校验:在方法执行前检查用户权限。
  • 性能监控:统计方法耗时,优化性能瓶颈。

5. 协同工作示例

IOC 和 AOP 通常结合使用,例如:

  • IOC 管理对象:Service 和 DAO 的 Bean 由容器创建和注入。
  • AOP 增强功能:通过切面为 Service 层的方法添加事务控制。
@Service
public class OrderService {@Autowiredprivate OrderDao orderDao;// 通过 AOP 自动添加事务管理@Transactionalpublic void createOrder(Order order) {orderDao.save(order);}
}

6. 总结

维度 IOC AOP
核心目标 管理对象的生命周期和依赖关系 解耦横跨多个模块的公共行为
代码影响 影响对象创建和依赖注入方式 不影响原始代码,通过代理增强功能
适用场景 对象间的依赖解耦 非功能性需求的统一处理(如日志、事务)
实现技术 BeanFactory、依赖注入、注解配置 动态代理、切面表达式(Pointcut)、通知

将 IOC 和 AOP 结合使用,可以大幅提升代码的模块化、可维护性和可扩展性。如果你希望补充具体代码示例或某个方向的深入分析,可以告诉我!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/908642.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【转载】golang内存分配

作者:钱文 同时 Go 对于 GC 后回收的内存页, 并不是马上归还给操作系统, 而是会延迟归还, 用于满足未来的内存需求.在 1.10 以前 go 的堆地址空间是线性连续扩展的, 比如在 1.10(linux amd64)中, 最大可扩展到 512GB. 因为 go 在 gc 的时候会根据拿到的指针地址来判断是否位于…

Linux权限之基础权限

介绍 Linux是多用户的操作系统,允许多个用户同时登录和工作,Linux权限是操作系统用来限制不同用户对资源的访问机制。这里暂且将Linux的权限分为三类:基本权限:给文件和目录的所属者、所属组、其他用户分配的读、写、执行的权限 ACL权限:ACL权限可以针对单一用户或者用户组…

《机器人SLAM导航核心技术与实战》第1季:第11章_自主导航中的数学基础

《机器人SLAM导航核心技术与实战》第1季:第11章_自主导航中的数学基础 视频讲解【第1季】11.第11章_自主导航中的数学基础-视频讲解【第1季】11.1.第11章_自主导航中的数学基础_自主导航-视频讲解【第1季】11.2.第11章_自主导航中的数学基础_环境感知-视频讲解【第1季】11.3.第…

31.3K star!开源免费本地AI神器,一键部署多模态大模型!

LocalAI 是一款革命性的开源AI框架,专为本地化部署设计。它完美复现了OpenAI的API接口,支持运行各类开源大模型(如LLaMA3、Phi-2、Stable Diffusion等),无需GPU即可在普通电脑上实现:嗨,大家好,我是小华同学,关注我们获得“最新、最全、最优质”开源项目和高效工作学习…

20241905 2024-2025-2 《网络攻防实践》 第5次作业

1. 实验内容 一、防火墙配置 任务要求:配置Linux操作系统平台上的iptables,或者Windows操作系统平台上的个人防火墙,完成如下功能,并进行测试: (1)过滤ICMP数据包,使得主机不接收Ping包; (2)只允许特定IP地址(如局域网中的Linux攻击机192.168.200.3),访问主机的某一网络…

纯干货 | Dolphinscheduler Master模块源码剖析

此前我们曾用万字长文解释了Apache DolphinScheduler的Worker模块源码,今天,我们再来一起看看Master模块源码的原理。 Master Slot计算核心代码逻辑: org.apache.dolphinscheduler.server.master.registry.MasterSlotManager.SlotChangeListener#notify public void notify(…

ZKmall模版商城前后端分离秒级响应架构深度解析

在当今的电商领域,用户体验和响应速度已成为决定平台竞争力的关键因素。ZKmall模版商城,作为一款高性能的电商平台解决方案,通过采用前后端分离架构,实现了秒级响应,为用户带来了极致的购物体验。本文将深度解析ZKmall模版商城的前后端分离秒级响应架构,探讨其背后的技术…

UESTC 23-th ACM-ICPC 初赛 Q. 校车

这东西其实蛮像最小斯坦纳树,不过我们通过状压DP的思想来讲一讲这个题。 形式化题意:考虑一共有 \(n\) 个点,\(m\) 条无向边,你需要从图中选出至多 \(K\) 条闭合路径,使得所有 \(w\) 个关键点都被覆盖,使得最长路径最小。 容易发现 \(n \le 500\),因此我们可以通过 Floy…

360度全景环视(AVM Around View Monitor)简介

AVM(Around View Monitor),中文:全景环视系统。 在自动驾驶领域,AVM属于自动泊车系统的一部分,是一种实用性极高、可大幅提升用户体验和驾驶安全性的功能。利用车身四周摄像头,拼接出以车身为中心的360环视画面,直接鸟瞰车身周边情况。支持多种车型,具有4路、6路、或前…

htb Code

先快速扫描 rustscan -a 10.10.11.62PORT STATE SERVICE REASON 22/tcp open ssh syn-ack ttl 63 5000/tcp open upnp syn-ack ttl 63 发现有一个5000端口 nmap扫描 nmap -sC -sV -p 5000 -v -Pn -T4 10.10.11.62发现是一个python的命令执行的环境 接下来进行沙…

敏捷开发的终极形态?2025年必试的5款集成混沌工程的项目管理黑科技

随着企业数字化转型的加速,敏捷开发已从单纯的高效迭代演变为融合混沌工程的“韧性敏捷”模式。混沌工程通过主动注入系统故障,验证系统在异常条件下的稳定性,成为保障敏捷开发持续交付的关键技术。据Gartner预测,到2025年,70%的企业将在敏捷流程中集成混沌工程以增强系统…

SQL SERVER日常运维巡检系列之-实例级参数

前言做好日常巡检是数据库管理和维护的重要步骤,而且需要对每次巡检日期、结果进行登记,同时可能需要出一份巡检报告。本系列旨在解决一些常见的困扰: 不知道巡检哪些东西不知道怎么样便捷体检机器太多体检麻烦生成报告困难,无法直观呈现结果 实例的参数对系统性能和稳定…