AOP 专题

Spring框架有两个核心思想:IOC和AOP

Spring IOC指的是控制翻转,使用普通JAVA Bean,在运行时由Spring容器统一管理和串联,服务于不同的流程,在开发过程中对Spring 容器没有强依赖,便于开发、测试、验证和迁移。
开发业务逻辑时每个业务逻辑的服务组件都是独立的,而不依赖于Spring框架,借助Spring容器对单元测试的支持,通过对下层依赖服务进行Mock,每个业务组件都可以在一定范围内进行单元测试,而不需要启动重型的容器来测试

OOP和AOP都是为了解耦和模块化设计。

AOP通常适用于使用面向对象方法无法抽象的业务逻辑,
例如:日志、安全、事务、应用程序性能 管理(APM,Application Performance Monitoring)等,
使用它们的场景并不能用面向对象的方法来表达和实现,而需要使用切面来表达 ,因为它们可能穿插在程序的任何一个角落里。

AOP是分工细化的过程中,分离关注点,去除重复而提出的一个概念。 目标当然是去除重复解耦模块化设计
譬如开发人员负责开发功能,功能上线前需要负责安全的部门进行检查,需要网络的部门进行dns或域名的申请或更新配置

但这些东西每次发布都需要做,如果每个团队都有人专门负责安全、网络等这些与业务功能无关的事务,就有冗余。

所以把这些职责 分离出来,成立单独的部门(就是切点),这些部门的职责负责通用的职责(切面),按照约定这些部门会在系统上线前的某一个时机(通知)介入

 

AOP是Aspect Oriented Programming的缩写,意思是面向切面编程,是一种关注点分离的技术
代码主要就是实现某种特定的业务逻辑。
但是在实际写代码时,往往不能专注于业务逻辑,比如我们写业务逻辑代码的同时,还要写事务管理、缓存、日志等等通用化的功能,而且每个业务功能都要和这些业务功能混在一起,痛苦!
所以,为了将业务功能的关注点通用化功能的关注点分离开来,就出现了AOP技术。

其实这种模块化通用功能逻辑的做法,一直都在使用,只是没有系统的提出AOP的概念:
譬如Java Web开发中最基本的Filter就是一层一层的切面,突破了之后才能触及Servlet这内核。
但Filter过于简单粗放,只能运行在Servlet之外而不能在之内,能上不能下,稍微细一点的批处理它就不行了,而Spring的AOP可以。
从理论上说,Filter和Spring AOP前者是责任链模式(Intercepter也是),后者是代理模式,性质不同,但从「层层包裹核心」的共同特点看,是一致的。


AOP就是增加了一种解耦的实现方式。
解耦,这是OOP经常提到的词。为了让各个模块更加独立,有人通过面向对象设计出一堆模式剥离代码降低耦合。


AOP和OOP的区别及联系:
AOP是OOP的延续或者可以理解为是OOP编程方式的一种补充。AOP实际是GoF设计模式的延续,设计模式孜孜不倦追求的是调用者被调用者之间的解耦,AOP可以说也是这种目标的一种实现。
面向对象编程(OOP)是从静态角度考虑程序结构,面向切面编程(AOP)是从动态角度考虑程序运行过程。

AOP的作用:常常通过AOP来处理一些具有横切性质的系统性服务,如事物管理、安全检查、缓存、对象池管理等。这些配套服务和当前业务流程无关,但不可缺少。譬如员工获取办公资源的权限管理,工作区域的保洁问题,网络需要IT部门处理

AOP就是把这些代码与核心逻辑代码剥离,其实现方式就是在现有的类或方法的基础上通过"注解"(Java)、"特性"(C#)、"装饰器"(Python)把核心逻辑代码用各个"方面"的代码包裹起来。

面向切面的目标与面向对象的目标没有不同。
一是减少重复,二是专注业务。
相比之下,面向对象是细腻的,用继承和组合的方式,绵绵编织成一套类和对象体系。
而面向切面是豪放的,大手一挥:凡某包某类某开头的方法,一并如斯处理!

《Javascript DOM编程艺术》说,dom是绣花针,innerHTML是砍柴斧。
面向对象和面向切面,也可做如是观。
没有依赖注入,面向切面就失去立足之本。

没有面向切面,依赖注入之后也只好在各个方法里下死力气写重复代码,或者搞出来一个超级复杂的抽象基类。

同时有了这两者,才真正能履行拆分、解耦、模块化、约定优于配置的思想,才真正能实现合并重复代码、专注业务逻辑的愿望。

不过,如果能用「绣花针」OOP的设计模式实现,还是不建议轻易动用AOP这「劈柴刀」,不得已才用之

总结:
过程式编程是一维的,如果不通过文件名以及函数名分割,所有函数就毫无组织了;
面向对象编程是二维的,相比过程式增加了一个维度,可以从语言的层面通过“主语”组织代码;
而面向结合面向对象编程是三维的,相比单单的面向对象编程则又增加了“方面”维度。

AOP具体实现
AOP是一个概念,并没有设定具体语言的实现,它能克服那些只有单继承特性语言的缺点(如Java),目前AOP具体实现有以下几个项目:
AspectJ(TM):创建于Xerox PARC. 有近十年历史,成熟
缺点:过于复杂;破坏封装;需要专门的Java编译器。
动态AOP:使用JDK的动态代理API或字节码Bytecode处理技术。

程序需要状态,但对象不需要状态。
如果对象有了状态,就会引发烦人的多线程问题,在集群环境下更是麻烦。
程序的状态,统一由数据库,缓存,任务队列这些外部容器来容纳,在处理时,仅仅在对象的方法中以局部变量的面目偶尔出现,被封在线程内部,朝生夕灭,任由回收。

 


AOP是什么?
AOP(Aspect-Oriented Programming),面向切面编程,看着是跟OOP(面向对象编程)挺相近的,但实际上又有什么区别呢?
OOP具有封装,继承,多态等东西来定义从上到下这种层次关系(瀑布流式的),但要想实现从左到右的关系的话就开始有点水土不服了,例如用户的权限控制,操作日志等,这些与我们要实现的核心功能不大有关系的东西散布在我们代码的周边,显示十分不好看。
于是我们引入了AOP的模式。

 

 

我们通常在实现一个页面逻辑的时候,通常伴随着操作日志,安全监测,事务处理等几个逻辑,在实现逻辑的时候都要写一大堆这种代码。
而AOP就是将这些与主体业务无关,但又有为业务提供服务的逻辑代码封装起来,降低模块之间的耦合度。如图所示中的圆柱体好比如我们的业务流程,aop代表的是那个横向的操作,俗称切面编程。
或许上面的这些理论有点头疼,对于AOP我的大体理解是:将那些与业务核心不大相关的杂七杂八的东西独立开,每次实现了业务核心之前或之后,调用一下对应的方法。

AOP这种切面编程能干很多事情,例如验证登陆,权限,性能检测,错误信息记录等等,AOP的目的就是将这些东西分离开来,让开发人员专注与核心关注点

 

http://www.cnblogs.com/powerdk/p/4150112.html

 

转载于:https://www.cnblogs.com/softidea/p/4157351.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值