首页 > 范文大全 > 正文

Spring中AOP的连接点检测器

开篇:润墨网以专业的文秘视角,为您筛选了一篇Spring中AOP的连接点检测器范文,如需获取更多写作素材,在线客服老师一对一协助。欢迎您的阅读与分享!

摘要:越来越多的系统开始使用AOP(面向切面编程),面向切面编程越来越重要,但是AOP的连接点丢失问题一直未能很好的解决,该文针对使用spring框架的系统中日志生成业务设计了一种连接点检测器,可以遍历所有连接点,并在数据库中维护连接点状态。

关键词:Spring;aop连接点;面向切面编程;连接点丢失

中图分类号:TP311 文献标识码:A 文章编号:1009-3044(2013)09-2151-03

Spring中可以设定一种规范的方法名前缀来使该方法变成切入点实现切面业务,例如日志,安全验证等。当一个方法运行时spring就会检测该方法是否符合切入点特征,但是这种方法会出现很多人为的失误或者错误,假如我们不经意的弄错了方法名或者某方法的名称与该前缀相同,这个方法将不会被执行切面的业务或者多余的执行了切面业务,所以我们设计了一种检测器,将所有的连接点存入表中进行维护,来解决人为造成的连接点丢失或错配问题。

1 AOP简介及Spring中基于AOP技术对日志的管理原理

1.1 AOP简介

它利用一种称为“横切”的技术,剖解开封装的对象内部,并将那些影响了多个类的公共行为封装到一个可重用模块,并将其名为“Aspect” ,便于减少系统的重复代码,降低模块间的耦合度,并有利于未来的可操作性和可维护性[1]。AOP代表的是一个横向的关系,如果说“对象”是一个空心的圆柱体,其中封装的是对象的属性和行为;那么面向方面编程的方法,就仿佛一把利刃,将这些空心圆柱体剖开,以获得其内部的消息。而剖开的切面,也就是所谓的“方面”了。然后它又以巧夺天功的妙手将这些剖开的切面复原,不留痕迹。

图1 AOP动态实现原理示意图

上图为用动态的方式实现AOP的示意图,调用者捕捉到我们的连接点,如图中的原始对象,然后用封装对象,中加入我们要对关注点实施的操作,如记录,参数验证等。然后将结果返回给调用者,这就简单的实现了一个AOP完整实现过程。

1.2 AOP里的重要概念

1)join point(连接点):是程序执行中的一个精确执行点,例如类中的一个方法。它是一个抽象的概念,在实现AOP时,并不需要去定义一个join point[2]。

2)point cut(切入点):本质上是一个捕获连接点的结构。在AOP中,可以定义一个point cut[3],来捕获相关方法的调用。

3)advice(通知):是point cut的执行代码,是执行“方面”的具体逻辑[4]。

4)aspect(方面):point cut和advice结合起来就是aspect,它类似于OOP中定义的一个类,但它代表的更多是对象间横向的关系[5]。

5)introduce(引入):为对象引入附加的方法或属性,从而达到修改对象结构的目的。有的AOP工具又将其称为mixin[6]。

上述的技术特性组成了基本的AOP技术,大多数AOP工具均实现了这些技术。它们也可以是研究AOP技术的基本术语。

2.3 AOP技术的缺点分析

AOP技术产生的结构冲突问题,我们可以利用反射机制来解决[7]。采用AOP技术将横切代码与基础代码分离,这样虽然减少了代码的冗余且方便代码的管理,但是会产生一个结构冲突的问题,如果程序被多次修改,aspect面的程序和连接点的连接可能被影响到。所以就出现了反射机制,如果利用反射机制,在AOP切面代码编织进入连接点时,在这切面与连接点中间形成一个定义层,通过这个定义层来解决程序被修改而导致的结构问题[8]。

AOP技术产生的连接点丢失和错误配置问题,我自己开发设计了一种连接点统一管理的机制来解决这个问题。在基于AOP的系统设计中,连接点的定义一般会以一种规则形式[9],如果连接点因为某些人为原因或者程序的修改,导致某些连接点丢失,或者错误匹配到了不同的aspect切面上,就导致了连接点丢失错配问题[10]。如果我们把所有的连接点进行统一的存储管理,每次系统程序修改后,我们利用这个连接点管理机制对连接点进行统一检测,然后发现其中的问题,我们就可以发现并解决出现错误的问题,把有问题或者有可能出现问题的连接点导出一个连接点报告,这样我们就可以直观有效的发现出现的问题,从而解决连接点丢失和连接点错配的问题。

2.4 连接点管理机制的提出

在一个基于AOP的系统中,会有非常多的连接点,这些连接点都是我们进行定义的,但是在定义的时候,可能会出现一些人为的失误或者程序修改造成的连接点出现问题,所以我们提出了连接点管理机制。

连接点的管理机制主要思想就是把程序中所有定义过的连接点进行统计存储,当我们程序修改后,启动这个连接点管理机制,我们就可以通过我们存储的信息,与程序修改后更新的连接点信息进行比较,得出有问题的连接点。

比如在Spring框架中,可以设定一种规范的方法名前缀来使该方法变成切入点实现切面业务[11],我们针对这个原理,通过一种方式,将一个包内所有的类中,所有符合的方法进行收集整理,存入数据库中,对他们的状态进行维护,每次检测都会得出连接点的丢失与改动的详细记录。通过这种方式来推断连接点的安全与否。

3 基于AOP的连接点检测器的实现

3.1 基于AOP的连接点检测器的原理

在Spring框架中,可以设定一种规范的方法名前缀来使该方法变成切入点实现切面业务,我们针对这个原理,通过一种方式,将一个包内所有的类中,所有符合的方法进行收集整理,存入数据库中,对他们的状态进行维护,每次检测都会得出连接点的丢失与改动的详细记录。通过这种方式来推断连接点的安全与否。

3.2 数据库的设计

在整个检测器的设计中,数据库是非常重要的一个环节,我们要将所有的方法存入到数据库中进行维护,通过数据库的方式,可以直观快速的找到问题的所在。

数据库的重要字段:UID,methodName,methodClass,methodPackage,state。UID是方法的唯一标识,methodName,methodClass,methodPackage表示出方法的名字,来自于哪个类,哪个包,可以唯一确定一个方法。State是方法的状态,表示出这个方法是否为丢失连接点或者是新加入的连接点。

3.3 具体的实现方法

检测器的输入为包名和在Spring中设置的方法名的正则式,如*add。输出为变动的方法名及变动原因。

1)首先在Spring的日志程序段中加入对所捕捉到的切入点方法名的检测程序,如果此方法没有在数据库中,则将此方法存入数据库,如果已经存在数据库中的话,则不进行任何操作。

2)输入包名及正则式,遍历整个包,将所有的类找出存入LIST。输入以包名为单位,遍历整个包中的所有类,存入一个LIST。

3)遍历所有类中,符合正则式的方法存入CLASSLIST。通过LIST,挨个将类取出进行遍历,通过Field[] fields =a.class.getFields(); Method[] methods=a.getMethods();这两个方法把类中的所有方法存入一个LIST中,然后通过输入的正则式筛选出符合条件的方法,将他们存入的MethodList中。

4)查询表中数据,如果是第一次运行则将MethodList所有方法插入表中,如果不是第一次运行则与MethodList对照。

3.4连接点管理机制算法

步骤 1遍历所有连接点.得到LIST1

步骤 2查询joinpoint表得到 连接点LIST2

步骤 3比较LIST1 LIST2的长度

步骤 4如果LENGTH 1 = LENGTH 2 那么比较LIST1 和 LIST2中的连接点是否一致

步骤 5如果LENGTH 1 != LENGTH 2 且 LENGTH1 < LENGTH2那么查找丢失的连接点

步骤 6如果LENGTH1 != LENGTH 2 且 LENGTH1>LENGTH2 查找LIST1中多出的连接点

步骤 7导出结果,得到连接点的改动。

4 结束语

本文的设计的检测器,针对Spring框架,利用此检测器可以有效的避免连接点丢失,连接点错配的问题,因为有数据库对所有符合的方法进行维护管理,可以直观而且快速的检测到问题的所在。但是由于使用到了数据库,而且要遍历整个工程包,所以工作量会比较大,如果工程太大的话,检测的效率会是个问题。

参考文献:

[1] Hameed K, Williams R,Smith J.Aspect Oriented Software Fault Tolerance[C].Proceedings of 4th Interna-tional Conference on Computer Science & Education (WCE09), London, 2009(1):1-3.

[2] Breivold H P,Crnkovic I.A systematic review of software archi-tecture evolution research[C]. Information and Software Technology,2012:16-40.

[3] Banani R,Graham N.Methods for evaluating software architec-ture:a survey[R]. Technical Report 2008-545 Queen’s University,2008 : 1-82.

[4] YE Peng,NI You-cong,HU Ming.Research on measurement tech-nique for evaluating adaptability of aspect-oriented software architec-ture[M]. Advanced Materials Research,2011, 268-270: 1307-1312.

[5] Garcia-magarino I,Cossentino M,Seidita V.A metricssuite for evaluating agent-oriented architectures[C]. Proc of the 25thACM Symposium on Applied Computing , 2010: 912-919.

[6] SANT’’ANNA C,GAMEZ N,GARCIA A,et al.General architectureevaluation process/metrics,AOSD-Europe Deliverable D85[Z].2007.

[7] Jones M,Hamlen K W.Disambiguating Aspect-Oriented Security Poli-cies[C]. Proceedingsof of the 9th International Confidence on Aspect-Oriented Software Development(AOSD’’10) . 2010 .

[8] Clement A,Colyer A,Harley G,et al.Using eclipse aspect:your first steps[EB/OL]. http:///articles/article.aspx?p=357692.

[9] Liliana Dobrica,Eila Niemela.A survey on software architecture analysis methods[M]. IEEE Transactions on Software Engineering,2002 .

[10] Joseph D. Gradecki,Nicholas Lesiecki.Mastering Aspect: Aspect-Oriented Programming in Java[Z]. 2005

[11] Sant’Anna C,Lobato C,Kulesza U,et al. On the quantitative assessment of modular multi-agent system architectures [C].Proc of International Conference on Multiagent Systems and Software Architecture. London: Springer-Verlag,2006: 111-135.