`
renjie120
  • 浏览: 237926 次
  • 性别: Icon_minigender_1
  • 来自: 上海
博客专栏
D11bba82-ec4a-3d31-a3c0-c51130c62f1c
Java应用集锦
浏览量:22942
社区版块
存档分类
最新评论

spring中使用AOP进行日志记录[含代码]

 
阅读更多

spring的IOC和AOP是说的最烂的东西,尤其是后者,给编码带来很多很多的方便,网上不上代码都说了AOP主要用来做日志记录,异常处理,记录程序执行时间,缓存这样的事情,但是不少只是简单的做一个说明,没有代码,这里我把项目中实际使用的抽出来,本文主要是关于最简单的日志的记录。

 

前提:需要对spring aop概念有所了解,以及有spring开发经验,了解自定义注解。如果不明白,看下面的文章:

Spring思维导图,让Spring不再难懂(aop篇)

深入理解Java:注解(Annotation)自定义注解入门

 

-----------------------------------------------------------------------------------------------------------

下面进入正题:最终使用的效果如下:

 

@Service 
public class TallyTypeService extends CrudService<TallyTypeDao, TallyType> {   
	.....

	@LoggerPoint(pointKey=PointerKey.MONEY_TALLYTYPE)
	public Page<TallyType> findPage(Page<TallyType> page, TallyType entity) {
		return super.findPage(page,entity);
	} 

	......
}
使用了自定义注解, LoggerPoint标明要记录当前方法的执行参数,执行时间,执行类别等信息。pointKey是一个业务的分类。

 

 

 

/**
 * 对于日志注入点的功能说明枚举.
 * @author Administrator
 *
 */
public enum PointerKey {
	ALL("全部"), SINGLE("单接口"), UNKNOW("未知接口"), Test("测试"), MONEY_TALLYTYPE(
			"金额类型");

	private String name;

	private PointerKey(String name) {
		this.name = name;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

}
 

 

对于LoggerPoint注解,很简单:

 

 

@Retention(RetentionPolicy.RUNTIME) 
@Target({ ElementType.METHOD })
public @interface LoggerPoint {
	public PointerKey pointKey();
}
 

 

关键的是,使用解析上面注解的切面类:

 

import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.Map;
import java.util.UUID;

import org.apache.commons.lang3.exception.ExceptionUtils;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.Signature;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.reflect.MethodSignature;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.renjie120.common.enums.PointerKey;
import com.renjie120.common.utils.JsonUtils;
import org.springframework.stereotype.Component;

@Component
@Aspect
public class LoggerAspect {
	public static Logger logger = LoggerFactory.getLogger(LoggerAspect.class);
	
	private Method getMethod(ProceedingJoinPoint pjp){
		Signature signature = pjp.getSignature();
		MethodSignature methodSignature = (MethodSignature) signature;
		Method method = methodSignature.getMethod();
		return method;
	}
	
	@Around("@annotation(com.renjie120.common.aspect.LoggerPoint)")
	public Object trafficInterface(ProceedingJoinPoint pjp) throws Throwable {
		Method method = this.getMethod(pjp);
		LoggerPoint loggerPoint = method.getAnnotation(LoggerPoint.class);
		PointerKey pointerKey = loggerPoint.pointKey(); 
		
		Object[] args = pjp.getArgs();
		Map<String,Object> paramMap = new HashMap<String,Object>();
		
		for(Object arg:args){
			paramMap.put(arg.getClass().getSimpleName(), arg);
		}
		
		String requestJson = JsonUtils.toJsonStr(paramMap);
		String gid= UUID.randomUUID().toString();
		
		System.out.println("请求参数:"+requestJson);
		
		Object returnObj = null;
		String errorMsg = null;
		try {
			System.out.println("当前执行:"+method.getName()+"---"+pointerKey.name()+",gid="+gid);returnObj = pjp.proceed();
			return returnObj;
		} catch (Exception e) {
			errorMsg = ExceptionUtils.getStackTrace(e);
			logger.error(e.getMessage(),e);
			throw e;
		} finally {
			if (returnObj == null) {
				returnObj = errorMsg;
			}
			System.out.println("响应:"+JsonUtils.toJsonStr(returnObj));
		}    
	}
 
}
 1、上面的注解@Component,@Aspect为spring 注解,需要放在扫描路径中:
<context:component-scan base-package="com.renjie120"  >

	</context:component-scan>
 2、上图的@Around注解,标明使用的是环绕切面。
 3、打印日志这里是直接system.out出来,实际项目中可以保存到数据库日志表中,对于大量数据为不影响操作,可以先保存到队列中,再从队列中取出异步保存到数据库中。
 4、在实际使用中,也可以使用配置xml方式声明上面的切面处理类,这种情况就不需要使用上面的@Component,@Aspect,@Around注解
在spring-context.xml中:
<bean id="loggerAspect" class="com.renjie120.common.annotation.log.LoggerAspect" />
	
<aop:config>
			
		<aop:pointcut id="loginPointer"
			expression="@annotation(com.renjie120.common.annotation.log.LoggerPoint)" /> 
			
		<aop:aspect id="aspect" ref="loggerAspect">

			<aop:around method="trafficInterface" pointcut-ref="loginPointer" />

		</aop:aspect> 
		 
	</aop:config>
 

 

 

 

分享到:
评论

相关推荐

    spring.net结合三层AOP异常日志记录功能

    我们可以创建一个自定义的日志类,实现IAdvice接口,这样Spring.NET就能在发生异常时调用我们的日志记录代码。日志信息应包含异常类型、堆栈跟踪以及可能的上下文信息。 5. **配置Spring.NET**:在Spring.NET的XML...

    JAVA 中Spring aop 实现日志记载

    下面将详细介绍如何在Spring框架中使用AOP来实现日志记载。 1. **AOP基本概念** - **切面(Aspect)**:切面是关注点的模块化,如日志、事务管理等,它结合了业务逻辑与横切关注点。 - **通知(Advice)**:通知...

    Spring之AOP在鉴权和日志记录中的应用

    **Spring AOP在鉴权和日志记录中的应用** **一、引言** Spring AOP(Aspect Oriented Programming,面向切面编程)是Spring框架的一个重要特性,它为开发者提供了在不修改源代码的情况下,对应用程序进行功能增强...

    spring-boot aop

    在Spring框架中,AOP主要用于日志记录、事务管理、性能统计等场景。本示例是关于如何在Spring Boot项目中实现AOP功能的一个简单演示。 首先,我们需要了解AOP的基本概念。AOP的核心是切面(Aspect),它封装了跨越...

    spring aop实现日志功能

    在IT行业中,Spring框架是Java开发中的一个基石,尤其在企业级应用开发中扮演着重要角色。Spring AOP(Aspect ...通过运行这些测试,我们可以看到AOP日志功能的实际效果,并学习如何在自己的项目中应用这些概念。

    利用 spring annotation AOP 反射 记录日志

    下面我们将详细探讨如何利用Spring的注解AOP和反射来实现日志记录。 首先,我们需要理解Spring的AOP注解。最常用的两个注解是`@Aspect`和`@Pointcut`。`@Aspect`用于定义一个切面类,而`@Pointcut`则用来声明一个...

    spring aop 切面添加日志

    在Spring框架中,AOP(面向切面编程)是一种强大的工具,它允许我们在不修改源代码的情况下,对程序的关键行为进行增强或监控。本项目旨在演示如何在Spring AOP中添加日志功能,以实现对应用程序执行过程的透明跟踪...

    spring AOP 切面日志 分层打日志

    在Spring框架中,AOP(面向切面编程)是一种强大的工具,它允许我们在不修改源代码的情况下,对程序进行横向关注点的插入,比如日志记录、事务管理、权限检查等。在这里,我们重点关注如何利用Spring AOP实现分层...

    Flex整合Spring实现aop日志管理

    AOP允许我们在不修改原有业务逻辑的情况下,插入日志记录代码,使得日志功能的实现更加灵活和高效。 首先,让我们理解Flex和Spring这两个技术。Flex是一种基于Adobe Flash Player或Adobe AIR的开放源代码框架,用于...

    spring boot aop 统一处理日志

    在Spring Boot应用中,AOP(面向切面编程)是一种强大的工具,用于实现代码的解耦和模块化,尤其适用于处理横切关注点,如日志记录、事务管理、安全控制等。本教程将深入探讨如何利用Spring Boot的AOP特性来实现日志...

    AOP的例子 记录日志

    在本例子中,我们将探讨如何使用Spring框架实现AOP来记录日志。 **一、AOP概念** AOP(Aspect Oriented Programming)的核心是切面(Aspect),它将分散在多个对象中的共同行为(如日志、异常处理)抽象出来,形成...

    swagger和spring Aop日志结合

    另一方面,Spring AOP(面向切面编程)则是Spring框架的一个核心特性,用于实现跨切面的关注点,如日志记录。本篇文章将深入探讨如何将Swagger与Spring AOP结合起来,以实现优雅的日志记录功能。 首先,让我们了解...

    Spring框架实现AOP添加日志记录功能过程详解

    本文主要介绍了使用Spring框架实现AOP添加日志记录功能的过程详解。通过示例代码,详细介绍了如何在业务方法的前面和后面添加日志记录功能。 首先,需要了解什么是AOP?AOP(Aspect-Oriented Programming)是一种...

    简单spring aop 例子

    Spring AOP(面向切面编程)是Spring框架的重要组成部分,它提供了一种模块化和声明式的方式来处理系统中的交叉关注点问题,如日志、事务管理、安全性等。本示例将简要介绍如何在Spring应用中实现AOP,通过实际的...

    使用Spring配置文件实现AOP

    在Spring框架中,面向切面编程(Aspect Oriented Programming,简称AOP)是一种强大的设计模式,它允许我们定义横切关注点,如日志、事务管理、权限检查等,然后将这些关注点与核心业务逻辑解耦。这篇教程将详细讲解...

    Spring Aop使用实例

    - **CGLIB代理**:如果目标类没有实现接口,Spring会使用CGLIB库创建一个目标类的子类,并在子类中插入通知代码。 - **基于注解的AOP**:使用`@Aspect`、`@Before`、`@After`、`@Around`、`@Pointcut`等注解定义切...

    Spring中的AOP

    1. **切面(Aspect)**:切面是AOP的核心,它结合了业务逻辑和关注点,如日志记录、事务管理、权限控制等。在Spring中,切面通常由一个或多个通知和一个切点表达式定义。 2. **通知(Advice)**:通知是在特定连接...

    Spring Mvc AOP通过注解方式拦截controller等实现日志管理

    Spring MVC AOP日志管理通常与日志框架(如Log4j、Logback或Java内置的java.util.logging)集成。以下以Log4j为例: 1. 引入依赖:在项目pom.xml中添加Log4j的依赖。 2. 配置Log4j:创建log4j.properties或log4j....

Global site tag (gtag.js) - Google Analytics