AOP(Aspect-Oriented Programming):
面向切面编程,它利用一种称为“横切”的技术,剖解开封装的对象内部,并将那些影响了多个类的公共行为封装到一个可重用模块;就是将那些与业务无关,却为业务模块所共同调用的逻辑或责任封装起来,便于减少系统的重复代码,降低模块间的耦合度,并有利于未来的可操作性和可维护性。
例如日志功能。日志代码往往水平地散布在所有对象层次中,而与它所散布到的对象的核心功能毫无关系。对于其他类型的代码,如安全性、异常处理和透明的持续性也是如此。这种散布在各处的无关的代码被称为横切(cross-cutting)代码,这导致了大量代码的重复,而不利于各个模块的重用。
使用“横切”技术,AOP把软件系统分为两个部分:核心关注点和横切关注点。业务处理的主要流程是核心关注点,与之关系不大的部分是横切关注点。横切关注点的一个特点是,他们经常发生在核心关注点的多处,而各处都基本相似。比如权限认证、日志、事务处理。Aop 的作用在于分离系统中的各种关注点,将核心关注点和横切关注点分离开来。
AOP的核心思想就是“将应用程序中的商业逻辑同对其提供支持的通用服务进行分离。”
IOC(Inversion of Control):
控制反转的技术促进了松耦合。当应用了IoC,一个对象依赖的其它对象会通过被动的方式传递进来,而不是这个对象自己创建或者查找依赖对象。即:不是对象从容器中查找依赖,而是容器在对象初始化时不等对象请求就主动将依赖传递给它。
IOC理论提出的观点大体是这样的:借助于“第三方”实现具有依赖关系的对象之间的解耦。
控制反转(IOC)到底为什么要起这么个名字?
软件系统在没有引入IOC容器之前,对象A依赖于对象B,那么对象A在初始化或者运行到某一点的时候,自己必须主动去创建对象B或者使用已经创建的对象B。无论是创建还是使用对象B,控制权都在自己手上。
软件系统在引入IOC容器之后,这种情形就完全改变了,由于IOC容器(中间位置的“第三方”,整个系统的关键核心,它起到了一种类似“粘合剂”的作用)的加入,对象A与对象B之间失去了直接联系,所以,当对象A运行到需要对象B的时候,IOC容器会主动创建一个对象B注入到对象A需要的地方。
示例简单说明
公司开发系统要将放假信息通过短信和邮箱两种方式发送给员工
分析:a、业务逻辑控制模块(使用什么方式发送);b、消息管理类(判断发送方式,并请求对应功能模块);c、功能模块(短信telephone和邮箱email两个发送方式的处理,并发送信息)。
1、未使用IOC:a根据发送方式(发送信息内容)传承访问b,b获取发送方式,判断发送方式,并实例化对应方式的功能模块类,b通过实例化的类访问c,c做出功能处理并发送信息给员工。
2、使用IOC,c创建核心接口类Send,并完成telephone和email的实现Send;此时a的发送方式直接通过Send进行对应功能模块类的实例化(Send s = New Email()
),a根据实例化的类传参访问b,Send直接将c的功能模块映射给了b,c做出功能处理并发送信息给员工。
拓展:IOC反转控制常见的实现手段之一就是DI依赖注入,而依赖注入的方式通常有:接口注入、Setter注入和构造函数注入。本次示例给出的具备“接口注入”的特征。
引用:
资料1:AOP和IOC的解析
资料2:IOC实例讲解