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

 

时间: 2025-02-01 14:45:58

AOP 专题的相关文章

Swift语法专题十二——方法

Swift讲解专题十二--方法 一.引言         方法只是一个术语,其实就是将函数与特定的类型结合,类.结构体.枚举都可以定义方法,方法又分为实例方法和类型方法,类型方法类似于Objective-C中的类方法.Swift和Objective-C的一大不同是,Objective-C只有在类中可以定义方法. 二.实例方法基础         实例方法的语法和函数完全一致,其和具体类型的实例所关联,实例方法在调用时由类型的实例点语法进行调用来完成一些功能模块.示例如下: class Math

SEO优化人员是否知道标签与栏目、专题、关键词之间的区别

摘要: 相比网站的关键词我们对文章标签的关注实在太少,不知道作为SEO优化人员的你是否知道标签与栏目.专题.关键词之间的区别?也许你会认为这是无关紧要的事情,如果是这样的话只能 相比网站的关键词我们对文章标签的关注实在太少,不知道作为SEO优化人员的你是否知道标签与栏目.专题.关键词之间的区别?也许你会认为这是无关紧要的事情,如果是这样的话只能说你是一个不善于思考问题的人,永远成不一个真正的SEO,因为SEO本身就是一个需要注重细节的职业.笔者发现现在几乎所有的文章都支持添加标签的功能,为什么一

J2EE中使用Spring AOP框架和EJB组件

j2ee 快速发展的开发人员社区.对各种后端技术(包括JMS.JTA.JDO.Hibernate.iBATIS等等)的支持,以及(更为重要的)非侵入性的轻量级IoC容器和内置的AOP运行时,这些因素使得Spring Framework对于J2EE应用程序开发十分具有吸引力.Spring托管的组件(POJO)可以与EJB共存,并允许使用AOP方法来处理企业应用程序中的横切方面--从监控和审计.缓存及应用程序级的安全性开始,直到处理特定于应用程序的业务需求. 本文将向您介绍Spring的AOP框架在

PS婚纱照处理 Photoshop婚片美化、效果渲染专题教程

 三联教程为大家整理PS婚纱照处理专题教程   PS婚纱照处理 Photoshop婚片美化.效果渲染专题教程:专题列表 Photoshop打造古典青绿色外景婚片教程 简介:图片色彩构成比较简单,以绿色和红色为主.调色也较为简单,可直接用调色工具调出自己想要的颜色.也可以用通道等来调色.主色调好后,局部再加上光晕,增强画面的高光.    PhotoShop调色教程:给外景婚纱片调出淡黄绿色调效果 简介:介绍用PhotoShop给外景婚纱照片调出淡黄绿色调效果,主要用曲线.色相饱和度.可选颜色.色彩

第三章 AOP 基于Schema的AOP

        基于Schema定义的切面和前现两种方式定义的切面,内容上都差不多,只是表现形式不一样而已. 3.7.1一般增强的使用 a.目标类 public class Target { public void say(){ System.out.println("say..."); } public String getName(int id,String name){ System.out.println("getName..."); return &quo

Alter dataSource in Spring By AOP And Annotation

Here is an article of how to use AOP and Annotation mechanism to alter dataSource elegantly. First, I want make sure that everyone knows how to build multiple dataSource. Please check this article Dynamic-DataSource-Routing After this, we will have a

Swift语法专题四——字符串与字符

Swift解读专题四--字符串与字符 一.引言         Swift中提供了String类型与Characters类型来处理字符串和字符数据,Swift中的String类型除了提供了许多方便开发者使用的方法外,还可以与Foundation框架的NSString类进行转换,使用起来十分方便. 二.String基础         在Swift中,使用双引号来定义字符串,开发者可以通过如下代码来创建一个字符串常量: let str = "Hello, playground" 可以通过

我要造轮子之基于JDK的AOP实现

1 前言 Aspect Oriented Programing,面向切面编程. 利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率. AOP主要用于日志记录,性能统计,安全控制(权限控制),事务处理,异常处理等.将日志记录,性能统计,安全控制,事务处理,异常处理等代码从业务逻辑代码中划分出来,通过对这些行为的分离,我们希望可以将它们独立到非指导业务逻辑的方法中,进而改变这些行为的时候不影响业务逻辑的代码. 像Spring

专题页设计技巧浅谈

  先以CP设计的的这个奥运专题为例分析专题设计中常遇到的一些问题. 这个页面存在的问题很多,我们来一个个分析. 首先第一个问题首屏高度: 分析一下常见分辨率及浏览器下高度数据: 在window XP常见分辨率1024×768下我们除掉任务栏,浏览器菜单栏以及状态栏后剩下的网页首屏高度平均值是584. Win7下是574.在window XP常见分辨率1440×900下我们除掉任务栏,浏览器菜单栏以及状态栏后剩下的网页首屏高度平均值是716.Win7下是706. 综合上面表中个分辨率及浏览器下的