基于Annotation的Spring AOP日志处理的设计与实现

时间:2022-10-19 02:08:31

基于Annotation的Spring AOP日志处理的设计与实现

摘要:系统维护和错误排查需要程序能自动的输出日志信息,将用户的操作记录下来。而日志本身不太可能是你开发的主程序的主要任务。如果能将“不可见的”、通用的日志代码注入主程序中,而保证自身业务逻辑的纯洁性,降低代码之间的耦合度, 增加程序的灵活性和可重用性。本文使用Spring AOP的Annotation方式,写一个切面,并且指定切入的范围(切入点),当系统运行后,日志信息将可以自动输出或记录在指定的文件及数据库中。

Abstract: System maintenance and errors troubleshooting need the program can automatically output log information and record the user's actions. But the log itself is unlikely to be your main tasks of the development of the main program. If the "invisible" and common logging code can be recorded into the main program, it will guarantee the purity of their business logic, reduce coupling between code, and increase program flexibility and reusability. This paper uses Annotation of Spring AOP to write a section, and specifies the range of cuts (starting point). When the system is running, log information will be output automatically or record in the specified files and database.

关键词:面向切面编程(AOP);Annotation;耦合度

Key words: aspect oriented programming (AOP);Annotation;coupling degree

中图分类号:TP39 文献标识码:A 文章编号:1006-4311(2012)32-0207-03

0 引言

AOP(Aspect Oriented Programming,向切面编程)是建立在OOP(Object Oriented Programming,面向对象程序设计)基础之上的,OOP针对问题领域中以及业务处理过程中存在的实体及其属性和操作进行抽象和封装,面向对象的核心概念是纵向结构的,其目的是获得更加清晰高效的逻辑单元划分;而AOP则是针对业务处理过程中的切面进行提取,例如,某一个操作(例如日志输出)在各个模块中都有涉及,这个操作就可以看成“横切”存在于系统当中。在许多情况下,这些操作都是与业务逻辑相关性不强或者不属于逻辑操作的必须部分,而面向对象的方法很难对这种情况做出处理。AOP则将这些操作与业务逻辑分离,使程序员在编写程序时可以专注于业务逻辑的处理,而利用AOP将贯穿于各个模块间的横切关注点自动耦合进来[1]。

AOP被定义为一种编程技术,用来在系统中提升业务的分离,它将服务模块化,使得业务层完全没必要理会这些服务的存在,比如日志,事务,安全等。

1 Spring AOP的Annotation方式的技术要点

1.1 Annotation技术 sun公司从J2SE 5.0开始提供名为Annotation(注释)的功能,它被定义为JSR-175规范[2],是Java语言中的一种特殊的元数据语法,可以被添加到Java代码中。类,方法,变量,参数,包都可以被标注。Annotation是可以被反射的,因为它们被编译器生成嵌入在编译后文件,并保留在虚拟机中以便在运行时被索引[3]。注释是以“@注释名”在代码中存在,一般只有一行,也可以包含有任意的参数。

从Spring2.0以后的版本中,集成了AspectJ注解。AOP的实现有多种方式,使用Annotation方式的配置,无需配置文件,只需要通过添加“注释代码”来完成,简化了Spring 的开发,容易对方法进行拦截。

常用的AspectJ注解有:①前置通知(@Before):在某连接点(join point)之前执行的通知,但这个通知不能阻止连接点前的执行(除非它抛出一个异常)。②后置通知(@After):当某连接点退出的时候执行的通知(不论是正常返回还是异常退出)。③返回后通知(@AfterReturning):在某连接点(join point)正常完成后执行的通知:例如,一个方法没有抛出任何异常,正常返回。④抛出异常后通知(@AfterThrowing):方法抛出异常退出时执行的通知。⑤环绕通知(@Around):包围一个连接点(join point)的通知,如方法调用。

1.2 AOP面向切面编程和实现方式 AOP通过提供另外一种思考程序结构的途经来弥补面向对象编程(OOP)的不足。在OOP中模块化的关键单元是类(classes),而在AOP中模块化的单元则是切面。切面能对关注点进行模块化,例如横切多个类型和对象的事务管理——在AOP术语中通常称作横切(crosscutting) 关注点。

Spring AOP有三种实现方式,除了底层的Spring AOP API方式外,Spring 2.0以后版本允许用户选择使用更简单、更强大的Schema-based(基于模式XML)方式和@Aspect-based(注解Annotation)方式来自定义切面。这两种风格都支持所有类型的通知(advice)和AspectJ的切入点语言,虽然实际上仍然使用Spring AOP进行织入(Weaving)。

Annotation方式通过使用注释,程序开发人员可以在不改变原有逻辑的情况下,在源文件嵌入一些补充的信息。代码分析工具,开发工具和部署工具可以通过这些补充信息进行验证或者进行部署。比如希望某个方法的参数或者返回值不为空,虽然我们可以在Java doc中说明,但是表达同样意思的说法有很多,测试工具很难根据这些语言来分析出程序员所期望的前提条件(Pre-condition)和执行后的条件(Post-condition)。而使用注释(Annotation),这个问题就可以轻而易举的解决了。

2 Spring AOP的Annotation方式的日志处理实现

2.1 运行环境配置 进行spring-framework的AOP Annotation方式开发时需要下载AspectJ开发插件,以支持AspectJ语法。可以在eclipse的官方网站下载aspectj jar包[5],可以直接双击,进行安装。也可以解压缩其中lib文件夹,lib文件夹中有4个重要的jar包:aspectjrt.jar,aspectjtools.jar,aspectjweaver.jar,org.aspectj.matcher.jar,解压缩后把这4个jar包导入到AOP项目中。此外还需下载aopalliance.jar,此包就是AOP联盟定义的一组关于AOP的公共接口[6],Aspectj jar包需要aopalliance jar包支持。

2.2 用户Service接口与实现类

①编写UserService业务接口,声明增删改查方法。

②UserService接口的业务实现UserServiceImp,实现增删改查方法。

2.3 创建切面类LogAspect

Pointcut 是指那些方法需要被执行“AOP”,是由“Pointcut Expression”来描述的。上述配置针对切入点应用了前置和后置通知。

2.4 applicationContext.xml配置文件,指定切面作用的范围。

配置文件中配置LogAspect类及UserService的实现类UserServiceImp。

2.5 运行测试文件

日志记录的输出内容如下:

3 结论

通过对Spring AOP的Annotation方式实现日志输出的研究,可以看出AOP是对OOP在某些应用场合的补充,AOP就是分离横切关注点来实现软件的模块之间的松散耦合,从而提高软件的可维护性和可复用性,而Annotation(注解)方式的确更加简洁,且由配置优先转为契约优先。

近年来,Annotation方式越来越受到重视,合理的运用AOP Annotation方式,将使软件的开发更加便捷,清晰。

参考文献:

[1].

[2]http:///otndocs/jcp/metadata-1.0-prd-spec-oth-JSpec/.

[3]http:///wiki/Java_annotation.

[4]Spring Framework开发参考手册.

[5]http:///aspectj/downloads.php.

[6]http:///projects/aopalliance/.

上一篇:关于校园电视生存与发展的思考 下一篇:浅谈加强烟草行业市场管理的方法