Spring AOP 自定义注解实现日志管理

目录

一、配置文件

二、新建一个日志实体类Log

三、编写 service 层

四、编写 service 层的实现 serviceimpl

五、自定义注解类

六、编写切面类

七、spring + aop 需要的 jar 包


博客的代码是基于 SSM 环境编写的,而SSM环境的搭建不是本次的重点,所以还不会的搭建环境的可以看下我另外一篇博客:

eclipse+maven 配置SSM项目环境

一、配置文件

在 spring 的配置中,扫描 aop 的包,还有打开注解扫描。

<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:aop="http://www.springframework.org/schema/aop"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/aop
        http://www.springframework.org/schema/aop/spring-aop.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context.xsd" >

    <!-- 扫描 aop 包 -->
    <context:component-scan base-package="com.yyzheng.aop" />
    <!-- 打开注解扫描 -->
    <aop:aspectj-autoproxy proxy-target-class="true" />

</beans>

二、新建一个日志实体类Log

可根据的需求修改实体类参数。

package com.yyzheng.pojo;

import java.io.Serializable;
import java.util.Date;

public class TLog implements Serializable {
    private static final long serialVersionUID = 1L;

    /**
     * 日志id
     */
    private Integer id;
    /**
     * 管理员id
     */
    private String adminId;
    /**
     * 管理员姓名
     */
    private String adminName;
    /**
     * 操作
     */
    private String operation;
    /**
     * 操作方法名
     */
    private String method;
    /**
     * 参数
     */
    private String params;
    /**
     * 消耗时间
     */
    private Integer time;
    /**
     * ip地址
     */
    private String ip;
    /**
     * 操作时间
     */
    private Date createTime;

     //省略 get and set 
}

三、编写 service 层

package com.yyzheng.service;

import com.yyzheng.pojo.TLog;

public interface LogService {
    public void insertLogInfo(TLog log);
}

四、编写 service 层的实现 serviceimpl

package com.yyzheng.service.impl;

import com.yyzheng.dao.mapping.TLogMapper;
import com.yyzheng.pojo.TLog;
import com.yyzheng.service.LogService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service
public class LogServiceImpl implements LogService{

    @Autowired
    private TLogMapper tLogMapper;

    @Override
    public void insertLogInfo(TLog log) {
        //这里调用的是mybatis的逆向工程生成的mapper
        tLogMapper.insert(log);
    }
}

五、自定义注解类

package com.yyzheng.aop;

import java.lang.annotation.*;

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface SysLog {
    String value() default "";
}

六、编写切面类

package com.yyzheng.aop;

import java.lang.reflect.Method;
import java.util.Date;

import com.yyzheng.pojo.TAdmin;
import com.yyzheng.pojo.TLog;
import com.yyzheng.service.LogService;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.aspectj.lang.reflect.MethodSignature;
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 javax.servlet.http.HttpServletRequest;


/**
 * 系统日志,切面处理类
 *
 */
@Aspect
@Component
public class SysLogAspect {
	
	@Autowired
	private LogService logService;
	
	@Pointcut("@annotation(com.yyzheng.aop.SysLog)")
	public void logPointCut() {}

	@Around("logPointCut()")
	public Object around(ProceedingJoinPoint point) throws Throwable {
		long beginTime = System.currentTimeMillis();
		//执行方法
		Object result = point.proceed();
		//执行时长(毫秒)
		int time = (int)(System.currentTimeMillis() - beginTime);
		//保存日志
		saveSysLog(point, time);
		return result;
	}

    private void saveSysLog(ProceedingJoinPoint joinPoint, long time) {
        // 获取当前操作的方法
        MethodSignature signature = (MethodSignature) joinPoint.getSignature();
        Method method = signature.getMethod();
        TLog log = new TLog();
        SysLog syslog = method.getAnnotation(SysLog.class);
        if(syslog != null){
            //注解上的描述
            log.setOperation(syslog.value());
        }
        //请求的方法名
        String className = joinPoint.getTarget().getClass().getName();
        String methodName = signature.getName();
        log.setMethod(className + "." + methodName + "()");
        // 获取 ip 地址
        HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
        System.out.println("ip地址:"+request.getRemoteAddr());
        String ip = request.getRemoteAddr();
        log.setIp(ip);
        //请求的参数
        Object[] args = joinPoint.getArgs();
        try{
            String params = args[0].toString();
            log.setParams(params);
        }catch (Exception e){
            e.printStackTrace();
        }
        TAdmin admin = (TAdmin)request.getSession().getAttribute("user");
        if( admin != null){
            log.setAdminId(admin.getAdminId());
            log.setAdminName(admin.getAdminName());
            log.setCreateTime(new Date());
        }

        log.setTime((int)time);

        // 保存日志
        logService.insertLogInfo(log);
    }
	
}

七、spring + aop 需要的 jar 包

<!-- Spring AOP 日志管理需要导入的包 -->
        <dependency>
            <groupId>org.aspectj</groupId>
            <artifactId>aspectjrt</artifactId>
            <version>1.8.13</version>
        </dependency>

        <dependency>
            <groupId>org.aspectj</groupId>
            <artifactId>aspectjweaver</artifactId>
            <version>1.8.13</version>
        </dependency>

        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-aop</artifactId>
            <version>4.3.18.RELEASE</version>
        </dependency>

        <dependency>
            <groupId>cglib</groupId>
            <artifactId>cglib</artifactId>
            <version>3.2.4</version>
        </dependency>
        <!-- 结束 -->

猜你喜欢

转载自blog.csdn.net/weidong_y/article/details/82529410