AOP和IOC的区别

AOP和IOC的区别
二者没有联系。ioc是控制反转,aop是面向事务。

IOC就是一个生产和管理bean的容器就行了,原来需要在调用类中new的东西,现在都是通过容器生成,同时,要是产生的是单例的bean,他还可以给管理bean的生命周期。

AOP技术它利用一种称为"横切"的技术,剖解开封装的对象内部,并将那些影响了多个类的公共行为封装到一个可重用模块,并将其命名为"Aspect",即切面。所谓"切面",简单说就是那些与业务无关,却为业务模块所共同调用的逻辑或责任封装起来,便于减少系统的重复代码,降低模块之间的耦合度,并有利于未来的可操作性和可维护性。

1、定义不同

ioc:控制反转(Inversion of Control,缩写为IoC),是面向对象编程中的一种设计原则,可以用来减低计算机代码之间的耦合度。

aop:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。

2、功能不同

ioc:Class A中用到了Class B的对象b,一般情况下,需要在A的代码中显式的new一个B的对象。

采用依赖注入技术之后,A的代码只需要定义一个私有的B对象,不需要直接new来获得这个对象,而是通过相关的容器控制程序来将B对象在外部new出来并注入到A类里的引用中。而具体获取的方法、对象被获取时的状态由配置文件(如XML)来指定。

aop:将日志记录,性能统计,安全控制,事务处理,异常处理等代码从业务逻辑代码中划分出来,通过对这些行为的分离,我们希望可以将它们独立到非指导业务逻辑的方法中,进而改变这些行为的时候不影响业务逻辑的代码。
3、实现项目不同

ioc:现有的框架实际上使用以下三种基本技术的框架执行服务和部件间的绑定:

类型1 (基于接口): 可服务的对象需要实现一个专门的接口,该接口提供了一个对象,可以重用这个对象查找依赖(其它服务)。早期的容器Excalibur使用这种模式。

类型2 (基于setter): 通过JavaBean的属性(setter方法)为可服务对象指定服务。HiveMind和Spring采用这种方式。

类型3 (基于构造函数): 通过构造函数的参数为可服务对象指定服务。PicoContainer只使用这种方式。HiveMind和Spring也使用这种方式。

aop:AOP是一个概念,并没有设定具体语言的实现,它能克服那些只有单继承特性语言的缺点(如Java),AOP具体实现有以下几个项目:

AspectJ ™: 创建于Xerox PARC. 有近十年历史,成熟

缺点:过于复杂;破坏封装;需要专门的Java编译器。

动态AOP:使用JDK的动态代理API或字节码Bytecode处理技术。

基于动态代理API的具体项目有:

JBoss 4.0 JBoss 4.0服务器

基于字节码的项目有:

aspectwerkz ,spring
————————————————
版权声明:本文为优快云博主「‘安’」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.youkuaiyun.com/qq_48431032/article/details/120598901

### AOP IOC 的概念及其实现 #### 一、AOP(面向切面编程) AOP 是一种编程范式,旨在通过分离横切关注点来提高代码的模块化程度。在 Spring 中,AOP 主要用于处理那些跨越多个类的功能需求,比如日志记录、安全性验证事务管理等[^2]。 - **核心功能** AOP 将这些横切逻辑封装到独立的模块中,称为“切面”。这样可以减少重复代码并增强系统的可维护性。 - **实现机制** Spring 使用代理模式实现了 AOP 功能。对于目标对象,Spring 可以动态地生成一个代理对象,在调用实际方法之前或之后执行额外的操作。这种操作通常被称为“通知”(Advice)。常见的通知类型有前置通知(Before Advice)、后置通知(After Advice)环绕通知(Around Advice)。 - **配置方式** AOP 配置可以通过 XML 或基于注解的方式完成。例如,`@Aspect` 注解定义了一个切面,而 `@Pointcut` 定义了切入点表达式,指定哪些方法需要应用特定的通知[^3]。 ```java import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.Before; @Aspect public class LoggingAspect { @Before("execution(* com.example.service.*.*(..))") public void logMethodCall() { System.out.println("Logging method call..."); } } ``` --- #### 二、IOC(控制反转) IOC 是一种设计原则,其主要目的是降低组件间的耦合度。它将对象的创建权交给了容器,而不是由程序员手动实例化对象[^1]。 - **核心思想** 在传统的应用程序中,开发者负责管理初始化所有的依赖项。而在 Spring 中,这一职责被转移到了 IoC 容器上。容器会自动解析依赖并将它们注入到相应的组件中。 - **实现方式** DI(依赖注入)是 IoC 的具体实现形式之一。Spring 提供了多种注入方式,包括构造函数注入、Setter 方法注入以及字段注入。 ```java @Component public class MyService { private final Dependency dependency; // 构造函数注入 public MyService(Dependency dependency) { this.dependency = dependency; } public void performAction() { dependency.execute(); } } @Component class Dependency { public void execute() { System.out.println("Dependency executed."); } } ``` - **优势** 使用 IoC 后,组件之间不再直接相互引用,而是通过接口或者抽象类间接通信。这不仅增强了灵活性,还方便了单元测试。 --- #### 三、AOP IOC区别 | 特性 | AOP | IOC | |-----------------|------------------------------------------|-------------------------------------------| | **目的** | 处理横切关注点 | 解决组件间耦合 | | **作用范围** | 跨越多个业务逻辑 | 单个组件及其依赖 | | **实现手段** | 切入点与通知 | 容器管理对象生命周期 | | **典型场景** | 日志记录、性能监控 | 数据库连接池、服务层依赖 | 尽管两者的目标不同,但在实际项目中经常配合使用。例如,利用 AOP 实现统一的日志记录,同时借助 IoC 管理复杂的依赖关系。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值