面向方面编程(AOP)课件

上传人:我*** 文档编号:144981687 上传时间:2020-09-15 格式:PPT 页数:34 大小:2.16MB
返回 下载 相关 举报
面向方面编程(AOP)课件_第1页
第1页 / 共34页
面向方面编程(AOP)课件_第2页
第2页 / 共34页
面向方面编程(AOP)课件_第3页
第3页 / 共34页
面向方面编程(AOP)课件_第4页
第4页 / 共34页
面向方面编程(AOP)课件_第5页
第5页 / 共34页
点击查看更多>>
资源描述

《面向方面编程(AOP)课件》由会员分享,可在线阅读,更多相关《面向方面编程(AOP)课件(34页珍藏版)》请在金锄头文库上搜索。

1、面向方面编程(AOP),从面向过程到面向对象,软件开发模式经历了深刻变革。面向对象编程在大型项目开发领域取代了面向过程编程。那么AOP的出现会不会取代面向对象编程呢?,AOP的背景,早在20世纪90年代初,人们就已经注意到面向对象软件开发方法的局限性。这种软件设计技术可以很好的解决软件系统中角色划分的问题。 然而,它却没有彻底的解决软件开发中的维护和复用问题。类与类之间的关系通常是错综复杂的,面向对象的思想只表达了类的纵向关系继承,而类与类的横向关系往往会被忽略,或是将这种多维的关系转化为一维来解决,结果导致软件系统的类之间一些共同属性散乱在分布在各个类中,出现了逻辑业务代码和横切关注点(cr

2、osscuting concerns)的“纠缠”现象,这样的设计必然会给软件的维护和复用带来沉重的负担。,用一个电子商务系统的例子来说明问题。 该系统具有订单管理和商品管理等功能,而且这些功能都需要与相应的权限管理相结合,确保只有授权用户方可使用这些功能。 借助于面向对象程序设计技术,该系统伪代码如下:,OrderManage模块的伪代码,public class OrderManager private ArrayList m_Orders; public OrderManager() m_Orders = new ArrayList(); public void AddOrder(Orde

3、r order) if (permissions.Verify(Permission.ADMIN) m_Orders.Add(order); public void RemoveOrder(Order order) if (permissions.Verify(Permission.ADMIN) m_Orders.Remove(order); ,public class ProductManager private ArrayList m_Products; public ProductManager() m_Products = new ArrayList(); public void Ad

4、dProduct(Product product) if (permissions.Verify(Permission.ADMIN) m_Products.Add(product); public void RemoveProduct(Product product) if (permissions.Verify(Permission.ADMIN) m_Products.Remove(product); ,ProductManager模块的伪代码,用户的权限管理被封装在类Authorization中,产品管理和订单管理这两个业务功能则分别封装在两个不同的类ProductManager和Orde

5、rManager中。这两个对象类通过创建Authorization对象,向该对象发送消息来对操作业务功能的用户权限进行验证。,这样的软件系统存在以下几个方面的问题: 业务逻辑不清晰; 代码纠缠; 代码冗余和浪费; 模块之间的紧耦合; 不易扩展; 不灵活。,为解决这些类似的问题,1997年,由施乐公司帕洛阿尔托研究中心的Gregor Kiczales在ECOOP(欧洲面对象程序设计大会)提出了面向方面的程序设计,并开发了第一个AOP开发环境AspectJ。AOP技术是一种将类之间的横切关注点的分离出来,并将其模块化的技术。,AOP本质特征,AOP技术是一种将类之间的横切关注点分离出来,并将其模块

6、化的技术。 什么是软件关注点? 关注点是指一个特定的目的、一个感兴趣的区域或者一组逻辑行为。也可以理解为满足用户或系统需求、有关软件实现的多种事项,一个关注点就是软件要解决的一个问题。 比如电子商务系统要实现的订单管理、商品管理、权限检查等功能,都是它的关注点。,软件的关注点主要分为两大类:核心关注点和横切关注点。核心关注点就是该系统要实现的主要的功能部分,如电子商务中的订单管理、商品管理等;而横切关注点要跨越多个业务逻辑类或模块,如密码验证和日志记录。 AOP的本质就是要将系统的横切关注点和核心关注点分开,将横切关注点再进行封装成一个模块,即Aspect。从而避免横切关注点散乱的分布在系统的

7、多个类中。,AOP基本概念,AOP大体要包括三个部分: 组件语言(component language) 方面语言(aspect language) 编织器(weaver) 三者之间的关系:组件语言是负责核心关注点,方面语言主要负责的是横切关注点,而两种语言的并行与合作即“编织”由编织器来完成。,AOP基本概念,方面语言中一些元素的概念: (1) 连接点(Joint Point),AOP中最基本的元素,表示程序控制流中的某些点,如函数调用、类对象初始化、异常处理等,表示了软件系统中的横切关注点。AspectJ就是在特定的连接点处织入代码调用模块化的横切点。 (2)通知(advice),和类中的

8、方法比较相似,类似函数的一中结构,定义了在连接点的执行代码,即横切关注点的功能定义。可以说,AOP的一个关键组成部分就是传达消息,它允许定义多个模块的行为,并且透明的应用这些advice到现有的对象模型中,一般分为before advice after advice 和 around advice 三种类型。,AOP基本概念,(3)切入点(pointcut),连接点的集合,通过 pointcut designator 明确定义了要收集的连接点和有关参数值,它能够告诉AOP 框架,哪些通知绑定到哪些类,什么样的元数据将应用到哪些类或是哪一个导言被传入到哪一个类中。 总而言之,它就是连接Aspec

9、t 和class的桥梁。 (4)元数据(metadata),元数据就是在静态或是运行的时间绑定到一个类的附加信息,更强大的一方面,能够动态的绑定元数据到一个给定的对象实例。当我们在编写能够应用任何对象的一般方面时,而逻辑需要知道制定类的信息时,元数据就显得非常强大。,AOP基本概念,(5) 导言(introduction)。也称为类型间的声明,允许程序员去修改当前类的显示接口或添加类的属性,引入了一个能够实现新接口和属性的混合类。导言允许将多继承引入到一般的Java类。 (6) 方面(aspect)。这是AOP 中最重要的概念之一,相当OOP设计中的class,主要的功能是将类之间的横切关注点

10、封装在一起,形成一个模块单元。通过Aspect,AOP允许编程人员一种松散耦合的方法,以独立实体的姿态对一个横切关注点进行书写、查看、编辑。,一个导言的例子,当前已经实现了一个邮件收发系统,其中类Mail完成了收发邮件的功能。但在产品交付后,发现该系统存在缺陷,在收发邮件时,未曾实现邮件地址的验证功能。现在,第三方产品已经提供了验证功能的接口IValidatable: public interface IValidatable bool ValidateAddress(); ,利用导言,可以将IValidatable接口织入到原有的Mail类中: import com.acme.validat

11、e.Validatable; public aspect MailValidateAspect declare parents: Mail implements IValidatable; public boolean Mail.validateAddress() if(this.getToAddress() != null) return true; else return false; ,一个方面定义例子,private static aspect AuthorizationAspect private pointcut authorizationExecution(): executio

12、n(public void OrderManager.AddOrder(Order) | execution(public void OrderManager.DeleteOrder(Order) | execution(public void ProductManager.AddProduct(Product) | execution(public void ProductManager.DeleteProduct(Product); before(): authorizationExecution() if !(permissions.Verify(Permission.ADMIN) th

13、row new UnauthorizedException(); ,public class OrderManager private ArrayList m_Orders; public OrderManager() m_Orders = new ArrayList(); public void AddOrder(Order order) m_Orders.Add(order); public void RemoveOrder(Order order) m_Orders.Remove(order); 修改后OrderManager模块的伪代码,public class ProductMana

14、ger private ArrayList m_Products; public ProductManager() m_Products = new ArrayList(); public void AddProduct(Product product) m_Products.Add(product); public void RemoveProduct(Product product) m_Products.Remove(product); 修改后ProductManager模块的伪代码,AOP实现方式,AOP用“方面”描述系统的横切关注点,用传统程序设计语言描述系统的核心关注点, 使用编织

15、器来实现横切关注点与核心关注点的交融。 AOP的编织器实现方式有两种:静态织入、动态织入,静态织入: 静态织入技术是指在程序编译期间,通过在业务功能代码的适当位置,织入方面代码,从而形成目标软件系统的混合程序代码。这一技术的特点是在软件系统运行前实现方面代码和业务代码二者之间的交融。,AspectJ中静态织入 静态织入的效率要高于动态织入,但动态织入的在灵活性方面要比静态织入要强。,动态织入 动态织入技术是指在程序运行期间,根据程序运行的上下文,通过截取对象消息的方式,在业务执行流程的适当位置执行方面的程序代码,从而实现方面代码和业务代码二者之间的交融。,AspectJ中动态织入 先设置一个控制栈,解释器运行源程序的Java字节码,当运行到 join point时,将该join point入栈,并将当前join point与 pointcut 进行匹配,然后根据结果生成advice链,链中的advice按优先级由高到低相连。若advice链是空链,则不必要调用编织器;否则,将advice链和join point一起传给编织器,编织器来完成织入功能直到链尾,随后编织器返回织入后的join point。,AOP研究领域,AOP编程语言的研究。一个好的程序设计语言好的编程语言的支持,尽管现在主流的编程语言都有相应的AOP支持语言,如AspectJ。但都存在使用难度大、速

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 办公文档 > PPT模板库 > PPT素材/模板

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号