`

一个基于spring aop实现的日志系统

 
阅读更多

import java.lang.reflect.Method;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;

import com.tc.common.model.BusinessSystemOperationLog;
import com.tc.core.annotation.SystemControllerLog;
import com.tc.service.system.OperationLogService;

@Aspect   
@Component
public class SystemLogAspect {

@Autowired
private OperationLogService operationLogService;
//本地异常日志记录对象   
    private  static  final Logger logger = LoggerFactory.getLogger(SystemLogAspect. class);   
  

    //Service层切点   
    @Pointcut("@annotation(com.tc.core.annotation.SystemServiceLog)")   
    public  void serviceAspect() {
   
    }   
   
   
  //Controller层切点   
    @Pointcut("@annotation(com.tc.core.annotation.SystemControllerLog)")   
    public  void controllerAspect() {  
   
    } 
   
    /** 
     * 前置通知 用于拦截Controller层记录用户的操作 
     * 
     * @param joinPoint 切点 
     */   
    @Before("controllerAspect()")   
     public  void doBefore(JoinPoint joinPoint) {   
   
        HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();   
        HttpSession session = request.getSession();   
        //读取session中的用户   
//        User user = (User) session.getAttribute(WebConstants.CURRENT_USER);   
        //请求的IP   
        String ip = request.getRemoteAddr();   
         try {   
            //*========控制台输出=========*//   
        logger.info("=====日志记录开始=====");   
        String content = getControllerMethodDescription(joinPoint);
        logger.info("请求方法:" + (joinPoint.getTarget().getClass().getName() + "." + joinPoint.getSignature().getName() + "()"));   
        logger.info("方法描述:" + content);   
//            System.out.println("请求人:" + user.getName());   
        logger.info("请求IP:" + ip);   
            //*========数据库日志=========*//   
            BusinessSystemOperationLog log =  new BusinessSystemOperationLog();
            log.setContent(content);   
            log.setIpAddress(ip);
            //保存数据库   
            operationLogService.insertSystemLog(log);
            System.out.println("=====日志记录结束=====");   
        }  catch (Exception e) {   
        e.printStackTrace();
            //记录本地异常日志   
            logger.error("==日志记录异常==");   
            logger.error("异常信息:{}", e.getMessage());   
        }   
    }
   
    /** 
     * 获取注解中对方法的描述信息 用于Controller层注解 
     * 
     * @param joinPoint 切点 
     * @return 方法描述 
     * @throws Exception 
     */   
     public  static String getControllerMethodDescription(JoinPoint joinPoint)  throws Exception {   
        String targetName = joinPoint.getTarget().getClass().getName();   
        String methodName = joinPoint.getSignature().getName();   
        Object[] arguments = joinPoint.getArgs();   
        Class targetClass = Class.forName(targetName);   
        Method[] methods = targetClass.getMethods();   
        String description = "";   
         for (Method method : methods) {   
             if (method.getName().equals(methodName)) {   
                Class[] clazzs = method.getParameterTypes();   
                 if (clazzs.length == arguments.length) {   
                    description = method.getAnnotation(SystemControllerLog.class).description();   
                     break;   
                }   
            }   
        }   
         return description;   
    }
}

xml 配置文件:<!--通知spring使用cglib而不是jdk的来生成代理方法 AOP可以拦截到Controller--> 
<aop:aspectj-autoproxy proxy-target-class="true" /> 
分享到:
评论

相关推荐

    JAVA 中Spring aop 实现日志记载

    在Java开发中,Spring AOP(面向切面编程)是一个强大的功能,用于实现日志记录。AOP允许我们在不修改原有代码的情况下,插入新的行为,比如日志记录,事务管理等。下面将详细介绍如何在Spring框架中使用AOP来实现...

    Spring AOP实现机制

    - 当目标对象实现了至少一个接口时,Spring会使用JDK的java.lang.reflect.Proxy类创建一个代理对象。 - 代理对象在调用实际方法前后,会插入相应的通知代码,从而实现AOP功能。 - **CGLIB代理**: - 如果目标...

    基于springmvc实现文件上传下载 基于AOP的日志功能

    基于springmvc实现文件上传下载 基于AOP的日志功能基于springmvc实现文件上传下载 基于AOP的日志功能基于springmvc实现文件上传下载 基于AOP的日志功能基于springmvc实现文件上传下载 基于AOP的日志功能基于...

    spring aop jar 包

    Spring AOP(Aspect Oriented Programming,面向切面...总的来说,Spring AOP通过提供面向切面的编程能力,极大地提高了代码的可复用性和可维护性,降低了系统复杂度,特别是在处理共性问题如日志、事务、安全等方面。

    Spring AOP的简单实现

    在这个场景中,我们将使用Spring AOP来实现一个日志记录的功能,以追踪系统中各个方法的调用情况,包括访问时间以及传递的参数。下面将详细阐述如何实现这一目标。 首先,我们需要了解AOP的基本概念。AOP的核心是切...

    springboot spring aop 拦截器注解方式实现脱敏

    在Spring AOP中,我们可以定义一个`@Aspect`类,这个类包含若干个`@Before`,`@After`,`@Around`等注解的方法,这些方法会在相应的切点(pointcut)执行前、后或周围执行。在数据脱敏的场景下,我们可能需要在响应...

    Spring AOP 的实现例子(基于XML配置实现)

    Spring AOP,即Spring的面向切面编程,是Spring框架中的一个重要组成部分,它提供了一种在不修改原有代码的情况下,对程序进行功能增强的技术。在实际开发中,我们经常使用AOP来处理如日志记录、事务管理、权限校验...

    spring基于AOP实现事务

    本文将深入探讨如何基于AOP(面向切面编程)来实现Spring的事务管理,特别是通过TransactionProxyFactoryBean。让我们一起探索这个主题。 首先,了解什么是AOP。AOP是Spring框架的核心特性,它允许我们在不修改业务...

    Flex整合Spring实现aop日志管理

    通知可以自定义一个类,实现`org.springframework.aop.MethodBeforeAdvice`、`org.springframework.aop.AfterReturningAdvice`或`org.aspectj.lang.ProceedingJoinPoint`接口,分别对应不同的通知类型。 2. **创建...

    Spring Aop的简单实现

    在这个基于配置文件的实现中,我们首先需要在Spring配置文件(如applicationContext.xml)中定义一个切面。切面通常由一个或多个通知组成,我们可以使用`&lt;aop:config&gt;`标签来声明切面。例如: ```xml &lt;aop:config&gt; ...

    Spring Aop四个依赖的Jar包

    Spring AOP,全称Aspect-Oriented Programming(面向切面编程),是Spring框架的一个重要模块,它通过提供声明式的方式来实现面向切面编程,从而简化了应用程序的开发和维护。在Spring AOP中,我们无需深入到每个...

    Spring基于注解实现AOP

    Spring AOP(面向切面编程)提供了一种优雅的方式来处理系统中的横切关注点,如日志、事务管理等。本篇文章将深入探讨如何在Spring中通过注解实现AOP。 首先,了解AOP的基本概念。面向切面编程是一种编程范式,它...

    spring aop 五个依赖jar

    5. **aopalliance-1.0.jar**:AOP Alliance是一个库,定义了一些通用的AOP接口,使得不同的AOP框架(如Spring AOP和AspectJ)可以互操作。它包含了一些基本的AOP概念,如Advisor、Pointcut和Proxy等,是连接不同AOP...

    Spring  AOP实现方法大全

    你需要实现`org.springframework.aop.Advisor`接口的子接口`org.aopalliance.intercept.MethodInterceptor`,并提供一个`invoke()`方法。 4. **Throw Advice**:在方法抛出异常后调用,但不包括在方法内部捕获并...

    SpringAop学习笔记以及实现Demo

    Spring AOP(Aspect Oriented Programming,面向切面编程)是Spring框架中的一个重要组成部分,它提供了一种在不修改源代码的情况下,对程序进行功能增强的技术。AOP的主要目的是将关注点分离,使得业务逻辑与系统...

    springAOP配置动态代理实现

    2. **CGLIB动态代理**:如果目标类没有实现接口,Spring会使用CGLIB库创建一个目标类的子类,子类覆盖目标类的方法并在方法调用前后插入通知。CGLIB代理提供了更广泛的应用场景,但相比JDK动态代理,它的性能稍差。 ...

    springAop与spring定时器

    Spring AOP(面向切面编程)是Spring框架中的一个重要组件,它允许我们在不修改源代码的情况下,通过在程序运行时动态地将代码插入到方法调用中,来实现跨切面的关注点,如日志记录、性能监控、事务管理等。而Spring...

    理解Spring AOP实现与思想 案例代码

    Spring AOP(面向切面编程)是Spring框架中的一个重要特性,它允许开发者在不修改源代码的情况下,通过插入额外的代码(称为切面)来增强应用程序的功能。这主要通过代理模式实现,使得我们可以集中处理系统中横切...

    基于Spring AOP的工具包

    Spring AOP是Spring框架的一个重要组成部分,它允许开发者通过分离关注点来实现更整洁、可维护的代码。本篇文章将深入探讨基于Spring AOP的工具包,包括它与AspectJ的关系以及如何在实际项目中应用这些工具。 首先...

    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