1、面向切面编程的一些术语
- 切面(Aspect):切面用于组织多个Advice,Advice放在切面中的定义。
- 连接点(Jionpoint):程序执行过程中的明确的点,如方法的调用,或异常的抛出。在SpringAOP中,连接点总是方法的调用。
- 增强的处理(Advice):AOP框架在特定的切入点执行的增强处理。处理有around、brefore和after等类型。
- 切入点(Pointcut):可以插入增强处理的连接点。简而言之,当某个连接点满足指定的要求时,该连接点将添加增强处理,该连接点也就变成了切入点。
|
|
- 引入:将方法或字段添加到被代理的类中,Spring允许将新的接口引入到任何被调用的处理对象中。例如:你可以使用一个引入,使任何对象实现IsModified接口,以此来简化缓存。
- 目标对象:被AOP框架进行增强处理的对象,也被称为被增强对象,如果AOP框架采用的是动态的AOP实现 ,那该对象就是一个被代理对象。
- AOP代理:AOP框架创建的对象,简单说,代理就是对目标对象的加强,Spring中的AOP代理可以是JDK的动态代理,也可以是cglib的动态代理,前者是实现接口 的目标对象的代理,后者为不实现接口的目标对象的代理。
- 织入(Weaving):将增强处理添加到目标对象中,并创一个被增强对象(AOP代理)的过程就是织入。织入有l两种实现方式—–编译时增强(AspectJ)和运行时增强(如Spring AOP)。Spring和其他纯Java AOP框架一样,在运行时织入。
2、AOP的基本概念
AOP是从程序运行角度考虑程序的流程,提取业务处理的过程的切面,AOP面向的是程序运行中各个步骤,希望以更好的方式来组合业务处理的各个步骤。
AOP框架并不会与特定的代码耦合,AOP框架能处理程序执行中特定的切入点(PointCut),而不是某个具体类的耦合。
3、AOP框架具有如下的两个特征。
|
|
5、实现Web层的日志切面
实现AOP的切面主要有以下几个要素:
- 使用 @Aspect 注解将一个java类定义为切面类。
- 使用 @Pointcut 定义一个切入点,可以是一个规则表达式,比如下例中某个package下的所有函数,也可以是一个注解等。
- 根据需要在切入点不同位置的切入内容
- 使用 @Before 在切入点开始处切入内容
- 使用 @After 在切入点结尾处切入内容
- 使用 @AfterReturning 在切入点return内容之后切入内容(可以用来对处理返回值做一些加工处理)
- 使用 @Around 在切入点前后切入内容,并自己控制何时执行切入点自身的内容
- 使用 @AfterThrowing 用来处理当切入内容部分抛出异常之后的处理逻辑
|
|
注意:在WebLogAspect切面中,分别通过doBefore和doAfterReturning两个独立函数实现了切点头部和切点返回后执行的内容,若我们想统计请求的处理时间,就需要在doBefore处记录时间,并在doAfterReturning处通过当前时间与开始处记录的时间计算得到请求处理的消耗时间。
6、实现Web层的日志的日志保存到mongodb数据库中
6.1.通过自定义appender实现
思路:log4j提供的输出器实现自Appender接口,要自定义appender输出到MongoDB,只需要继承AppenderSkeleton类,并实现几个方法即可完成。
- 引入mongodb的驱动,在pom.xml中引入下面依赖
|
|
- 实现MongoAppender
编写MongoAppender类继承AppenderSkeleton,实现如下:
|
|
6.3 在log4j.prperties中配置
|
|
6.4在spring-mvc.xml中开启统一处理请求日志
|
|