AOP技术应用和研究--AOP语言

aspectc++初级用法 AspectC++用法 详细教程见 http://www.aspectc.org/doc/ac-languageref.xhtml 实例 example文件里, 有一个随机事件发生程序——SimpleEventLoop, aspectC++最适合的是插装事件日志 编译使用 见AutoMonitor/lib/aspectC++/examples/ 里面编写的示例, acc的文件后缀名为.ah,本质是一种特殊的C++头文件。 ac++是编译AspectC++程序的编译器。 实现将AspectC++代码转化为C 阅读详情

1,AOP语言概述

如同其他软件开发方法的演化过程一样,对的研究最早也是从程序设计语言的变化开始的,其中最具代表性的当属PARC研究中心对 扩展后所开发的AspectJ,并在其后出现了大量面向商用或学术研究的AOP语言以及技术文献,从而为相关研究奠定了强大的发展基础和动力。近年来,针对的研究早已超出传统的程序设计语言领域,并逐步扩展到整个软件生命周期以及各种支持工具和开发环境的研究和应用,而被统称为面向切面的软件开发方法(aspect-oriented software development)。AOP语言作为一种技术基础和核心,其实也就是AOP工具,正在改变和影响着我们软件开发。

AOP语言所编写的程序通常由基础程序(base program)和切面程序(aspect program)所组成。基础程序由称为基础语言(base language)的传统程序设计语言所编写,负责实现系统的核心关注点;而方面程序作为对基础程序的补充和扩展,在语言层次上提物了对横切关注点的模块化实现,通常由称为切面语言(aspect language)的专门AOP语法模块编写。表3.1列出了部分典型的AOP语言及其相应的基础语言。

                     

当前大多数AOP语言都是在某种语言的基础上进行扩展后得到的,这也是因为AOP最初就是作为对OOP的补充和完善而提出的,因此OOP语言自然成为这AOP语言的基础语言,并基本涵盖了所有常见的OOP语言, 如Java、C++、SmallTalk等, 其中又以Java作为基础进行扩展的情况最为常见。同时,在典型AOP语言中也采用其他类型的程序设计语言作为其基础语言,如C等命令式语言,以及某些函数式语言。还有一些语言是针对特定平台或应用领域设计的,其基础语言较为特殊。例如基于.NET平台所开发的Weave.NET、SourceWeave.NET、AspectBuilder,可以同时使用多种语言作为其基础语言,只要这些语言遵循.NET平台的公共语言架构(common languageinfrastructure)规范[20]。本文将着重研究Spring AOP和AspectJ的实现和应用。


2,AOP语言实现机制

由2.1~2.5,我们可以发现AOP技术中核心就是将我们横切关注点编织到核心业务关注点,从而形成连接点。也就是将我们通知的代码编织到目标方法中。这个过程就是编织。编织也就是我们AOP语言要实现的。

    2.1编织

编织(weaving)是实现AOP的一个核心机制,利用切面编织器将用AOP实现的方面代码织入到用00P实现的核心功能代码中。从而构建了最终系统。编织的实现机制有多种,从编织的过程来看可以分为两类:静态编织与动态编织;而根据编织发生在应用程序生命周期的不同时刻又可以分为三类:编译时编织、载入时编织和运行时编织。图3.2列出了几个当前比较流行的AOP工具所支持的编织方式[21]

2.2静态编织和动态编织

静态编织是指在核心功能代码中的适当位置。比如某段代码执行前,或执行后,将切面代码织入。从而形成混合的编码;而动态编织可以在程序运行时。根据上下文决定调用的切面和它们的先后顺序以及增加或删除一个切面等。利用静态编织的工具有AspectJ、AspectC++等;其他一些使用反射技术或运行时代码织入技术的体系结构都属于动态编织,这样的工具有Spring AOP等。静态编织中出于方面代码在程序运行前已被内联至核心功能代码中。代码被高度优化,因此执行速度与未使用AOP方式编写的代码相差无几,对性能几乎没有影响:而动态编织山于引入了额外的抽象层,性能会有一定降低。但是,静态编织技术会改变类的源代码,而且需要在设计时就要确定所有的方面;而动态编织技术则不会,它可以在运行时增加、修改和删除方面。

    2.3 不同的编织时刻

正如可以用不同的机制编译和执行OOP程序那样。AOP语言为构建和执行切面提供了不同的工具。切面编织器提供了按照切面中切人点指定的方式自动调用通知的搭配方式,切面的编织对于性能和可伸缩性有影响.其中大部分取决于编织发生在应用程序生命周期的哪一部分。

(1)编译时编织可以在编译前进行预处理。将两种代码自动混合。将切面中的代码自动插人到功能模块代码的合适位置处,也可在编译后,对编译后的代码进行操作。对于普通应用程序而言,在编译时进行编织操作是最为直观的做法。由于源程序中包含了应用的所有信息。因此这种方式通常支持最多种类的连接点。利用编译时编织,我们能够使用AOP系统进行细粒度的编织操作。编译时编织最典型的框架就是AspectJ,它是目前最完善的AOP语言。AspectJ是对Java编程语言的扩展,通过增加了一些新的构造块支持对横切关注点的模块化封装。对源代码级别的代码混合实现编织.是一种典型的使用静态编织的AOP实现机制。AspectJ中预定义了一系列标准切人点,包括方法与构造器的调用、接受调用、执行、域的get和set访问、异常处理、实例类型匹配以及类型的初始化,通过这些预定义切人点的组合可以实现自定义的、复杂的切入点。在编译时,切面中的通知将被转化为标准的方法,类代码中匹配切人点的连接点将被转化为一个静态的标记点,然后。这些静态的点将被由通知所转化成的方法调用所取代。由此完成两种代码的编织,最后对编织完成的代码编译为字节码,即完成了整个编译过程。目前,AspectJ即支持编译前的预处理方式实现代码的编织,也支持编译后的字节码操作。支持编译时编织的框架还有Aspectc++和Aspeclweikz等。编译时编织会带来开销。主要是内存和时间的使用,因为它是在编译时执行大部分通知。在大型项目中,这些开销有可能是很可观的.而且可能帮来一些问题,特别是在切入点发生变化时。大部分系统都需要重新编译。然而编译时编织也意味着在运行的时候.几乎不需要为了匹配切人点做额外的工作。

(2)载入时编织是在代码载入时,实现代码的编织。程序的主逻辑部分和Aspect部分可以分别进行开发和编译,而编织操作就发生在框架载人Aspect代码之时。Aspect werkz、AspectJ、Spring和JBoss都支持载人时编织。Aspect werkz是一个动态的AOP框架。在类载入层次的适当位置拦截类载人从而实现字节码的修饰。利用对字节码的修改实现方面的织人,通过引人一个被称为切面容器的间接层以及对字节码的转化来实现动态AOP的要求。

(3)运行时编织是指在运行时根据对方法的调用执行适当的方面代码以实现编织。运行时编织可能是所有编织方式中最为灵活的。程序在运行过程中可以为单个的对象指定是否需要编织特定的Aspect。运行时编织采用的编织技术有反射、动态代理和拦截器。

SpringAOP则侧重于在运行时使用动态代理和拦截器调用方面。动态代理源于代理模式,即通过接口实现对业务对象的访问。但动态代理无需为每一个需代理的业务对象静态的生成代理对象。只需提供需要代理的接口与代理实现,就可以在运行时动态的生成代理对象。代理对上述接口的访问。Spring框架的核心是IoC容器,默认使用jdk提供的动态代理机制。在运行时.通过IoC容器进行名称查找,就可以由容器使用代理机制自动产生代理对象,并在符合切人点定义的连接点处执行通知。拦截器可以根据一个或多个切入点找到要切人的代码部分然后将方面代码织人,使用运行时拦截框架的关键好处是:它很自然地扩展到了切面的热部署(hot deployment),这味着可以在运行时激活或禁用所应用的通知。对于运行时编织来说,编译时的内存和时问开销可以忽略不计。但是运行时的通知调用开销是很大的。

3,AspectJ

AspectJ 是一个可免费获得的,由施乐公司帕洛阿尔托研究中心开发的扩展Java 的AOP 实现。它既是一个语言规范,又是一个AOP 语言实现。语言规范部分定义很多种语言构造以及它们支持面向切面范型的方式;语言实现部分则提供了编译、调试以及从代码生成文档的工具。AspectJ 的语言构造是从Java语言中扩展而来的,因此所有合法的Java 程序也都是合法的AspectJ 程序。AspectJ 编译器生成的是符合Java 字节码规范的.class文件,所以所有符合规范的Java 虚拟机都可以解释、执行其所生成的代码。通过选择Java 为基础语言,AspectJ 继承了Java 的所有优点并使Java 程序员能够比较容易上手。它不但提供很多有用的工具,还提供了对流行的IDE 的集成,如Sun 的Forte,Borland 公司的JBuiider 以及Emacs 等,这使得AspectJ 成为一个很容易使用的AOP 实现。AspectJ具体实现的例子将在3.5 AspectJ实现中介绍。

4,SpringAOP

Spring Framework是一个开源的Java/Java EE全功能栈(full-stack)的应用程序框架,以Apache许可证形式发布,也有.NET平台上的移植版本。该框架基于Expert One-on-One JavaEE Design and Development(ISBN 0-7645-4385-7)一书中的代码,最初由Rod Johnson和Juergen Hoeller等开发。Spring Framework提供了一个简易的开发方式,这种开发方式,将避免那些可能致使底层代码变得繁杂混乱的大量的属性文件和帮助类。

Spring框架作为一个开源的项目,正作为一种轻量级框架得到越来越广泛的重视和使用。Spring AOP是Spring框架中的一个重要组件,作为一种非侵略性的,轻型的AOP 框架,开发者无需使用预编译器或其他的元标签,便可以在Java 程序中使用它。如图3.3是Spring体系结构:

                    

Spring提供了一个用标准Java 语言编写的AOP框架,Spring 实现AOP的途径不同其他大部分AOP框架。它的目标不是提供极其完善的AOP 实现,而是提供一个和Spring IOC 紧密整合的AOP 实现,帮助解决企业应用中的常见问题。因此,Spring AOP 的功能通常是和Spring IOC 容器联合使用的[19]。(当然我这里只是简单的介绍一下SpringAOP,在后续的文章我们将进一步讨论它。)

AOP技术应用和研究系列博客 AOP技术应用和研究





深入AOSP构建系统:从BUILD_FINGERPRINT的生成逻辑,看如何定制你的Android设备标识 本文深入解析AOSP构建系统中的设备指纹生成机制,详细介绍了BUILD_FINGERPRINT的生成逻辑及其在Android设备中的关键作用。通过分析多个指纹属性的区别与联系,以及如何定制设备标识,帮助开发者更好地理解掌握Android系统构建过程。 阅读详情

相关推荐

疑难问题(二)——PyTorch 2.3.0 ‘import torch‘ 错误排查:深入解析‘shm.dll‘加载失败与系统路径修复

本文深入解析了在Windows系统上安装PyTorch 2.3.0后,执行'import torch'时遇到的'shm.dll'加载失败错误(OSError)。该问题通常源于系统DLL搜索路径缺失,导致无法找到关键的共享内存通信组件或其依赖项。文章提供了核心解决方案:通过手动修改PyTorch的`__init__.py`文件,将用户基目录下的Library\bin路径添加到DLL搜索列表中,从而从根本上修复此导入错误,并给出了详细的修改步骤验证方法。

weixin_29056865的博客 269

Rougamo、Fody 实现静态Aop

最近在看项目,看到别人使用Rougamo框架,好奇花了点时间仔细研究了,在这里记录一下。 0. 静态编织 Aop 首先,我们先了解什么是Aop? Aop是指面向切面编程 (Aspect Oriented Programming),而所谓的切面,可以认为是具体拦截的某个业务点。 我们常用的aop框架是 AspectCore,他是属于动态代理,也就是发生在运行时期间对代码进行“修改”。 Rouga...

weixin_28867413的博客 470

基于AOP技术的应用层C++进程恢复

利用面向方面编程技术实现应用层检查点与恢复机制,实现C++的进程跟踪、检查点文件生成进程恢复。

.Net之AOP - 使用Fody的代码静态编织实现AOP

万物皆可AOP,本篇文章主要讲解在.Net7中使用Fody的代码静态编织实现AOP

Ling、bug 2118

C++11 Aspect自实现

aspect自实现

无人等人的博客 1925

Aspect C++语言

AOP的核心思想是对横切关注点进行模块化。Aspect C++是针对C++的AOP扩展。 join point:运行aspects的代码部分,可以使类、结构、联合、对象、控制流。 pointcut:是join point的集合。用来定义在什么地方插入advice代码,进行横向切入。类似于C++中的变量,只不过带个括号。定义格式如下:pointcut 变量名() = 标志符(

Carly学习笔记 5359

AOP技术应用研究

面向切面编程(Aspect—Oriented Programming,简称AOP)是一种新的软件丌发技术,它是针对面向对象编程(Object.Oriented Programming,简称oop)在处理横跨多个模块的非核心需求时所表现出来的不足而提出的。 AOP技术应用研究系列,首先分析了面向对象编程(OOP)的优点缺点,从而引出AOP技术。并介绍AOP的基本思想基本概念。并通

暗淡小子 2465

AOP技术应用研究--OOP

1,软件编程技术的发展 软件编程技术与程序设计语言是分不开的。过去的几十年中,程序设计语言对抽象机制的支持程度不断提高:从机器语言到汇编语言,到高级语言,再到面向对象语言。每一种新的程序设计语言的出现都带来软件编程方法的飞跃。汇编语言出现后,开发人员避免了直接使用0-l编码,而是利用符号来表示机器指令,从而更方便地编写程序。当程序规模继续增大的时候,出现了以Fortran、C、Pascal等为代

暗淡小子 1792

Java平台AOP技术研究

转载自: http://wayfarer.cnblogs.com/articles/241031.html 1、引言2、AOP技术基础3、Java平台AOP技术研究4、.Net平台AOP技术研究3.1 Java平台AOP技术概览 3.1.1 AOP技术在Java平台中的应用 AOP在实验室应用商业应用上,Java平台始终走在前面。从最初也是目前最成熟的AOP工具——AspectJ,到目前已经融...

俊墨客 363

AOP技术研究——AOP技术基础

AOP技术研究——AOP技术基础Filed under: AOP — bruce zhang @ 9:55 pm 2.1 AOP技术起源AOP技术的诞生并不算晚,早在1990年开始,来自Xerox Palo Alto Research Lab(即PARC)的研究人员就对面向对象思想的局限性进行了分析。他们研究出了一种新的编程思想,借助这一思想或许可以通过减少代码重复模块从而帮助

AiYa_MyGod的专栏 558

.Net平台AOP技术研究

转载自: http://wayfarer.cnblogs.com/wayfarer/articles/256909.html 1、引言2、AOP技术基础3、Java平台AOP技术研究4、.Net平台AOP技术研究 4.1.Net平台AOP技术概览 .Net平台与Java平台相比,由于它至今在服务端仍不具备与unix系统的兼容性,也不具备类似于Java平台下J2EE这样的企业级容器,使得.Net平台...

俊墨客 325

AOP如何实现及实现原理

概述: 最近在开发中遇到了一个刚好可以用AOP实现的例子,就顺便研究AOP的实现原理,把学习到的东西进行一个总结。文章中用到的编程语言为kotlin,需要的可以在IDEA中直接转为java。 这篇文章将会按照如下目录展开: AOP简介 代码中实现举例 AOP实现原理 部分源码解析 1. AOP简介 相信大家或多或少的了解过AOP,都知道它是面向切面编程,在网上搜索可以找到很多的解释。这里我用...

weixin_34224941的博客 5382

AOP C#在行动

看过一本书,题目是《AscpectJ in Action》,正好这一段手上的项目搞一段落,所以有一点点空暇,决定写一些东西。 AOP是Aspect-Oriented Programming的简写。曾经为这个Aspect的中文翻译伤透了脑筋,还有一个相似的AOP,那是Attribute-Oriented Programming,于是,有人译作面向方面编程,后者则是面向特性编程。面向特性编程可以说得过

niwalker的专栏 2903

AOP技术介绍--(AOP技术基础)

2.1 AOP技术起源 AOP技术的诞生并不算晚,早在1990年开始,来自Xerox Palo Alto Research Lab(即PARC)的研究人员就对面向对象思想的局限性进行了分析。他们研究出了一种新的编程思想,借助这一思想或许可以通过减少代码重复模块从而帮助开发人员提高工作效率。随着研究的逐渐深入,AOP也逐渐发展成一套完整的程序设计思想,各种应用A...

dianshanpang3778的博客 1848

将Hex文件转换为Bin文件的小工具(包含C#项目源码)

Hex2Bin,对Hex文件进行校验、解析,转换为Bin文件。该程序使用Visual Studio 2022 C#开发,源码有详细注释,可以修改源码程序,如在Bin文件添加校验码或加密信息。

上一篇: AOP技术应用和研究--AOP概述
下一篇: AOP技术应用和研究--动态代理
demiaowu
博客等级 码龄12年 6粉丝 21原创
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值