面向方面(AOP)的一些基本概念

1、什么是面向方面(AOP)?

原文网址:http://www.sodii.com/text/viewFAQ.htm?id=7

AOP是Aspect Oriented Program的首字母缩写,是面向切面编程的意思。我们知道,面向对象的特点是继承、多态和封装。而封装就要求将功能分散到不同的对象中去,这在软件设计中往往称为职责分配。实际上也就是说,让给不同的类设计不同的方法。这样代码就分散到一个个的类中去了。这样做的好处是降低了代码的复杂程度,使类可重用。

  但是人们也发现,在分散了代码的同时,也增加了代码的重复性。什么意思呢?比如说,我们在两个类中,可能都需要在每个方法中做日志。按面向对象的设计方法,我们就必须在两个类的方法中都加入日志的内容。也许他们是完全相同的,但就是因为面向对象的设计让类与类之间无法联系,而不能将这些重复的代码统一起来。

  有人也许会说,那好办啊,我们可以将这段代码写一个独立的类独立的方法里,然后再在这两个类中调用。但是,这样一来,这两个类跟我们上面提到的独立的类就有耦合了,它的改变会影响这两个类。那么,有没有什么办法,能让我们在需要的时候,随意地加入代码呢?这种在运行时,动态地将代码切入到类的指定方法、指定位置上的编程思想就是面向切面的编程。

  一般而言,我们管切入到指定类指定方法的代码片段称为切面,而切入到哪些类、哪些方法则叫切入点。有了AOP,我们就可以把几个类共有的代码,抽取到一个切片中,等到需要时再切入对象中去,从而改变其原有的行为。

  这样看来,AOP其实只是OOP的补充而已。OOP从横向上区分出一个个的类来,而AOP则从纵向上向对象中加入特定的代码。有了AOP,OOP变得立体了。如果加上时间维度,AOP使OOP由原来的二维变为三维了,由平面变成立体了。从技术上来说,AOP基本上是通过代理机制实现的。

  AOP在编程历史上可以说是里程碑式的,对OOP编程是一种十分有益的补充。

2、什么是面向方面的程序设计?

原文网址:http://www.shenmeshi.com/Computer/Computer_20070522221632.html

面向方面的程序设计(Aspect-Oriented Programming,AOP,又译作面向侧面的程序设计、观点导向编程)是计算机科学中的一个术语,指一种程序设计范型。该范型以一种称为方面(aspect,又译作侧面)的语言构造为基础,侧面是一种新的模块化机制,用来描述分散在对象、类或函数中的横切关注点(crosscutting concern)。

面向对象的程序设计的手段是继承、封装和多态性,而面向方面的程序设计的组件是通知/监听器(advice/interceptor)、引入(introduction)、元数据(metadata)和切入点(pointcut) 。

通知/监听器(advice/interceptor)

一个通知是被某一事件触发的程序逻辑。 它是可以被插入一个方法调用者和实际的方法之间的行为。 通知实际上是面向方面的程序设计的关键。这些构造允许你定义横切(cross-cutting)行为。通知允许你透明地应用象记录和度量这样的事到现有的对象模型中。

在JBoss AOP中,我们使用监听器实现通知。你可以定义监听器监听方法调用、构造器调用和字段访问。稍后,我们将研究如何应用这些监听器到一个现有的对象模型中。

引入

引入是一种添加方法或者字段到一个现有类的方法。它们甚至允许你改变一个现有类目前实现的接口并且引入一个混合类实现这些新接口。

引入允许你把多继承带到简单的Java类中。引入的一个重要的使用实例就是你有一个想有运行时间接口的方面。你想跨不同的对象层次应用你的方面,但是你仍然想应用程序开发者能够调用指定方面API。

Apple apple = new Apple();

LoggingAPI logging = (LoggingAPI)apple;

Apple.setLoggingLevel(VERBOSE);

引入可以是一个把新API附加于一个现有对象模型的方法。

元数据

元数据是可以附属于一个类的附加信息,或者以静态方式或者在运行时间。当你可以动态地把元数据附上到一个对象给定的实例中的时候,它将更加有效。当你正在编写可用于任何对象的一般的方面的时候,元数据显得特别重要,但是程序逻辑必须知道指定类的信息。元数据被使用的一种很类似的情况是EJB规范。在EJB XML配置描述符中,你在一个每方法的基础上定义事务属性。应用程序服务器知道何时何地开始、暂停或者委托一个事务,因为你已经定义Required、RequiresNew、Supports等方法。在你的EJB类和事务管理程序绑定的元数据里,是bean的XML配置文件。

C#已经把元数据构建入语言中。XDoclet是另一个正在工作的很好的元数据的例子。如果你曾经用过XDoclet来生成EJB文件和配置描述符,你肯定知道元数据强大的功能。Java Community Process(JCP)达成协议,元数据被添加进JDK 1.5 (见JSR175)。直到JSR 175真正成为一种规范,一个好的AOP框架才能提供一个机制,声明在运行时间有效的类级元数据。

 

切入点

如果监听器,引入和元数据是面向方面的程序设计的特性,那么切入点就是把这些特性联系起来的纽带。切入点告诉面向方面的程序设计框架,哪个监听器将和哪个类捆绑在一起,哪些元数据将用于哪些类,或者引入将被导入到哪些类中。 切入点定义能够用于你的应用程序的类的各种面向方面的程序设计特性。

3、AOP:面向方面编程(Aspect Oriented Programming)

原文:http://www.networkdictionary.cn/software/aop.php

面向方面编程 AOP(Aspect Oriented Programming)是一种“关注点(Concern)”分离技术,通过运用“方面(aspect)”这种程序设计单元,允许开发者使用结构化的设计和编码,反映出其对系统的认识方式。AOP 使设计和编码更加模块化、更加具结构化,从而使关注点局部化而不是分散于整个系统中。同时,需要定义好关注点和系统其他部分的接口,从而真正达到“分离关注点,分而治之”的目的。

这里的关注点指的是一个特定的目标、概念或者兴趣域。从软件开发过程的角度来看,典型的软件开发关注点包括:需求分析、设计、编码、测试和维护。从技术的角度来看,一个典型的软件系统包含若干个核心级和系统级的关注点。核心级关注点是系统需要实现的业务功能;系统级关注点是实现核心级关注点所必需的配套设施,这些配套设施通常就认为是软件的系统特性,或者是业务功能的功能约束。

AOP 的方面从抽象意义上讲,是对软件系统构件的性能和语法产生一定影响的属性;从软件设计上讲是横切系统的一些软件系统级关注点;从实现上讲,是一种程序设计单元,它支持将横切系统的关注点封装在单独的模块单位中,是 AOP 将横切关注点局部化和模块化的实现机制。AOP 通过将横切关注点集中到方面中, 可以取得一种单一的结构化行为,该行为在传统程序中分布在整个系统代码中间。

从本质上来说,AOP 以一种松散耦合的方式实现某个系统关注点,然后用这些关注点的实现来组成最终的软件系统。与此相反,OOP 面向对象编程是利用对公共关注点的松散耦合及模块化的实现来创建一个新系统的。OOP 中一个公共关注点的实现叫作类,而 AOP 中的模块化单位就叫作方面。两者最大的不同之处就在于其处理横切关注点的方式上。对于 AOP 而言,任一关注点的实现对其他关注点而言是透明的。这一点相对于 OOP 而言,这是编程范式上的一个重大转变。

典型的 AOP 开发过程如下:

  1. 分解方面:分解系统需求以确定横切关注点和公共关注点
  2. 实现关注点:分别实现各个关注点
  3. 重组方面:方面集成器通过创建模块化单位,即方面来指定方面重组规则。方面重组,也叫编织或集成,最终的系统可以使用这些重组规则构建而成。

AOP的开发过程

AOP 的开发过程

另外,AOP 的具体实现可以采用另外一种编程范式作为其基础方法,这样就可以充分利用底层系统的诸多优势。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值