Java面向方面编程概述

概述

面向方面的程序设计(AOP)是一个激动人心的新规范,和已经有十几年历史的面向对象的程序设计(OOP)在软件开发上有相同的作用。 AOP和OOP不是相互竞争的技术,实际上它们相辅相成的十分融洽。面向对象的程序设计对于建模常见的对象等级体系非常有用。 它的不足之处在于处理跨多个非关联对象模型的常见情况;这时就有AOP的用武之地了。AOP允许你跨关联,使用单独的、彼此之间非常不同的对象模型。 它允许你层次化--而不是嵌入--函数,以便代码更易读、更便于维护。 我们喜欢把面向对象的程序设计想象成为自顶向下的软件开发,而面向方面的程序设计则是自左向右;它们是完全正交的技术,彼此之间相辅相成的十分融洽。

面向对象的程序设计的手段是继承、封装和多态性,而面向方面的程序设计的组件是通知/监听器(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框架才能提供一个机制,声明在运行时间有效的类级元数据。

切入点

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

时间: 2024-11-01 06:17:04

Java面向方面编程概述的相关文章

Java实现AOP面向切面编程的实例教程_java

介绍 众所周知,AOP(面向切面编程)是Spring框架的特色功能之一.通过设置横切关注点(cross cutting concerns),AOP提供了极高的扩展性.那AOP在Spring中是怎样运作的呢?当你只能使用core java,却需要AOP技术时,这个问题的解答变得极为关键.不仅如此,在高级技术岗位的面试中,此类问题也常作为考题出现.这不,我的朋友最近参加了一个面试,就被问到了这样一个棘手的问题--如何在不使用Spring及相关库,只用core Java的条件下实现AOP.因此,我将在

体验Java 1.5中面向(AOP)编程

AOP 对于一个能够访问源代码的经验丰富的Java开发人员来说,任何程序都可以被看作是博物馆里透明的模型.类似线程转储(dump).方法调用跟踪.断点.切面(profiling)统计表等工具可以让我们了解程序目前正在执行什么操作.刚才做了什么操作.未来将做什么操作.但是在产品环境中情况就没有那么明显了,这些工具一般是不能够使用的,或最多只能由受过训练的开发者使用.支持团队和最终用户也需要知道在某个时刻应用程序正在执行什么操作. 为了填补这个空缺,我们已经发明了一些简单的替代品,例如日志文件(典型

【Android】Android网络编程概述

Android网络编程概述 原文来自:http://blog.csdn.net/kieven2008/article/details/8210737 首先,应该了解的几个问题: 1)Android平台网络相关API接口  a) java.net.*(标准Java接口)  java.net.*提供与联网有关的类,包括流.数据包套接字(socket).Internet协议.常见Http处理等.比如:创建URL,以及URLConnection/HttpURLConnection对象.设置链接参数.链接

Java:互联网编程领域的过去与未来之王

作为一款专门针对嵌入式计算与实时化流程场景所构建的编程语言,Java将成为物联网时代下的最佳开发选项. 对于大家来说,Java到底意味着什么?在校园里头学习过的一款编程语言?企业IT领域的求职神油?抑或是将Java视为主宰互联网后爆发时代的统治性语言?作为一款专门针对嵌入式计算与实时化流程场景所构建的编程语言,我们将在本文中论证Java在物联网时代下成为最佳开发选项的几大理由. 从1969年至今的这段漫长时光当中,网络设备已经完成了完整的爆发式增长流程.从当初通过ARPANET实现对接的四台高校

Spring Framework中的面向方面编程

编程 作为这个介绍Spring框架中的面向方面编程(Aspect-Oriented Programming,AOP)的系列的第一部分,本文介绍了使您可以使用Spring中的面向方面特性进行快速开发的基础知识.使用跟踪和记录方面(面向方面领域的HelloWorld)作为例子,本文展示了如何使用Spring框架所独有的特性来声明切入点和通知以便应用方面.本系列的第二部分将更深入地介绍如何运用Spring中的所有通知类型和切入点来实现更实用的方面和面向方面设计模式.对于AOP的更一般性的介绍,请查看O

用Qi4j进行面向组合编程

长期以来,通过OOP对象集对领域概念进行建模的目标并未得到充分实现.那 么迄今为止,我们万般努力但难以解决的根本问题到底是什么?有没有更好的解 决办法?在本文中我们将介绍面向组合编程(COP,Composite Oriented Programming)的概念,展示它如何规避OOP存在的一些问题,并重先点燃使用可 重用部件组装领域建模的希望. 问题 我为何物?实际中我可以有多重身份.某些时候,我是编写软件的开发者:另 些时候,我是给大家讲解某个有关Java话题的软件开发者.但其他时候,我可能 有

Spring中反向控制和面向切面编程的应用

引言 在J2EE的整个发展历程中,现在正是一个非常时刻.从很多方面来说,J2EE都是一个伟大的成功:它成功地在从前没有标准的地方建立了标准:大大提升了企业级软件的开放程度,并且得到了整个行业和开发者的广泛认可.然而,J2EE在一些方面已经开始捉襟见肘.J2EE应用开发的成本通常很高.J2EE应用项目至少和从前的非J2EE项目一样容易失败--如果不是更容易失败的话.这样的失败率高得让人难以接受.在这样的失败率之下,软件开发几乎变成了碰运气.而在J2EE遭遇失败的场景中,EJB通常都扮演着重要的角色

Python的装饰器模式与面向切面编程详解

  这篇文章主要介绍了Python的装饰器模式与面向切面编程详解,概括的讲,装饰器的作用就是为已经存在的对象添加额外的功能,本文详细了装饰器模式的方方面面,然后引出面向切面编程知识,需要的朋友可以参考下 今天来讨论一下装饰器.装饰器是一个很著名的设计模式,经常被用于有切面需求的场景,较为经典的有插入日志.性能测试.事务处理等.装饰器是解决这类问题的绝佳设计,有了装饰器,我们就可以抽离出大量函数中与函数功能本身无关的雷同代码并继续重用.概括的讲,装饰器的作用就是为已经存在的对象添加额外的功能. 1

面向切面编程(AOP)的理解

  在传统的编写业务逻辑处理代码时,我们通常会习惯性地做几件事情:日志记录.事务控制及权限控制等,然后才是编写核心的业务逻辑处理代码.当代码编写完成回头再看时,不禁发现,扬扬洒洒上百行代码中,真正用于核心业务逻辑处理才那么几行,如图6-4所示.方法复方法,类复类,就这样子带着无可奈何遗憾地度过了多少个春秋.这倒也罢,倘若到了项目的尾声,突然决定在权限控制上需要进行大的变动时,成千上万个方法又得一一"登门拜访",痛苦"雪上加霜". 如果能把图6-4中众多方法中的所有共