日志,是每个系统都不可缺少的。但是,又不是必要的业务需求。
但用于日志记录的代码和主要用于其它职责的代码缠绕在一起。根据所解决的问题的复杂程度和作用域的不同,所引起的混乱可大可小。更改一个应用程序的日志记录策略可能涉及数百次编辑 ― 即使可行,这是个令人头疼的任务。
考虑一下以下代码:
清单 1. 日志调用手工插入到每个方法中
public void doGet(JspImplicitObjects theObjects) throws ServletException{ logger.entry("doGet(...)"); JspTestController controller = new JspTestController(); controller.handleRequest(theObjects); logger.exit("doGet");}
|
可能在不同的方法中都存在这样的代码。这就造成代码的无限扩张,同时修改也变得非常困难。
使用aop后,更改的代码为:
清单 2. 自动应用于每个方法的记录日志调用
public aspect AutoLog{ pointcut publicMethods() : execution(public * org.apache.cactus..*(..)); pointcut logObjectCalls() : execution(* Logger.*(..)); pointcut loggableCalls() : publicMethods() && ! logObjectCalls(); before() : loggableCalls(){ Logger.entry(thisJoinPoint.getSignature().toString()); } after() : loggableCalls(){ Logger.exit(thisJoinPoint.getSignature().toString()); }}
|
所有的日志维护都集中于AutoLog方面。
Pointcut 和 join point
要理解 Pointcut,必需知道 join point 是什么。join point 表示在程序执行中明确定义的点。AspectJ 中典型的 join point 包括方法调用、对类成员的访问以及异常处理程序块的执行。join point 可以包含其它 join point。例如,一个方法调用可能在它返回之前引起其它方法调用。那么,Pointcut 就是一种语言构造,这种构造根据已定义的标准挑选一组 join point。示例中的第一个 Pointcut 称为 publicMethods
,选择 org.apache.cactus
包中的所有公用(public)方法的执行。 execution
是一个原始的 Pointcut(就象 int
是一种原始的 Java 类型)。它选择与其括号中定义的方法说明匹配的任何方法的执行。方法说明允许包含通配符;示例中的一个方法说明包含了几个通配符。第二个名为 logObjectCalls
的 Pointcut 选择了 Logger
类中的所有方法的执行。第三个 Pointcut loggableCalls
,通过使用 && !
合并了前两个 Pointcut,这意味着它选择了除 Logger
类中的公用方法以外, org.apache.cactus
中所有的公用方法。(记录 log 方法将导致无限递归。)
Advice
既然 Aspect 已经定义了它应该记录的点,它使用 Advice 来完成实际的日志记录。Advice 是在 join point 之前、之后或周围执行的代码。相对于 Pointcut 来定义 Advice,说类似于“在想要记录的每个方法调用之后运行这些代码”这样的话。因此 Advice 如下:
before() : loggableCalls(){ Logger.entry(thisJoinPoint.getSignature().toString());}
|
Advice 使用 Logger
类,其入口和出口方法类似于下列代码:
public static void entry(String message){ System.out.println("entering method " + message);}
|
在示例中,传递到记录器的 String
是从 thisJoinPoint
派生的,这是一个特殊的反射对象,它允许访问 join point 执行所处的运行时上下文。在 Cactus 实际使用的 Aspect 中,Advice 使用这种对象来检索传递到每个记录的方法调用中的方法参数。当日志记录 Aspect 应用于代码时,方法调用的结果如下:
清单 3. AutoLog Aspect 的输出
entering method: void test.Logging.main(String[])entering method: void test.Logging.foo()exiting method: void test.Logging.foo()exiting method: void test.Logging.main(String[])
|
分享到:
相关推荐
AOP 解决紧密耦合的难题
4、想看spring aop 注解实现记录系统日志并入库等 二、能学到什么 1、收获可用源码 2、能够清楚的知道如何用spring aop实现自定义注解以及注解的逻辑实现 (需要知道原理的请看spring aop源码,此处不做赘述) 3、...
AOP 解决紧密耦合的难题.doc..........
Spring AOP 日志管理 实例LoggingThrowsAdvice.java
本资源用来展示如何使用 spring aop 进行日志记录,例子里面通过aop的配置,把产生的日志存放到当前项目的根目录下,而且对方法执行过程中的参数进行了记录,对于aop如何记录日志不清楚的同学可以看看。
spring AOP 切面日志 分层打日志
Spring Boot项目中使用Logback日志与使用AOP拦截请求日志信息
采用SpringAOP拦截Controller,Service实现操作日志管理,统一处理异常,登陆日志管理,是SpringAOP的应用实践。通过SpringAOP的处理,可以方便移植日志管理功能,是个不错的学习demo
struts aop日志系统,struts aop日志系统
元注解方式结合AOP,灵活记录操作日志 能够记录详细错误日志为运维提供支持 日志记录尽可能减少性能影响
spring-aop面向切面系统日志案例
基于Spring的AOP快速实现通用日志打印(csdn)————程序
安普威视AOP 3204视频采集卡驱动程序是一款可以有效解决安普威视AOP 3204视频采集卡在使用过程中出现的一些问题的驱动工具,本站提供了安普威视AOP 3204视频采集卡驱动的下载地址,有兴趣的朋友们可以前来下载使用。...
SpringMVC利用AOP实现自定义注解记录日志
该项目运用SpringBoot框架,MyBatis持久层,SqlSession映射,AOP技术,对项目日志进行管理
AOP流程源码分析-SpringAOP中定义的类图AOP流程源码分析-SpringAOP中定义的类图AOP流程源码分析-SpringAOP中定义的类图AOP流程源码分析-SpringAOP中定义的类图AOP流程源码分析-SpringAOP中定义的类图AOP流程源码分析...
切面编程的例子,采用spring,可以在方法执行的前中后进行跟踪
spring mvc利用aop日志实现对controller层的拦截
springboot+拦截器+aop+自定义注解+本地线程实现统一接口日志记录,记录下接口所在模块、接口描述、接口请求参数、接口返回参数、接口请求时间以及接口耗时用于接口优化,接口记录参数以及操作人防止使用人员误操作...
1.使用aop切面编程解耦 2.使用spring事件监听保存日志 3.日志内容详细包括请求ip、请求响应数据、异常信息等