Aop之输入日志保留在数据库中

1.须要的依赖

 <dependencies>        <!-- AOP依赖 -->        <dependency>            <groupId>org.springframework.boot</groupId>            <artifactId>spring-boot-starter-aop</artifactId>        </dependency>        <dependency>            <groupId>org.apache.shiro</groupId>            <artifactId>shiro-spring</artifactId>            <version>1.4.1</version>        </dependency>        <dependency>            <groupId>org.springframework.boot</groupId>            <artifactId>spring-boot-starter-actuator</artifactId>        </dependency>        <dependency>            <groupId>org.springframework.boot</groupId>            <artifactId>spring-boot-starter-jdbc</artifactId>        </dependency>        <dependency>            <groupId>org.springframework.boot</groupId>            <artifactId>spring-boot-starter-web</artifactId>        </dependency>        <dependency>            <groupId>org.mybatis.spring.boot</groupId>            <artifactId>mybatis-spring-boot-starter</artifactId>            <version>2.1.3</version>        </dependency>        <dependency>            <groupId>org.springframework.boot</groupId>            <artifactId>spring-boot-devtools</artifactId>            <scope>runtime</scope>            <optional>true</optional>        </dependency>        <dependency>            <groupId>mysql</groupId>            <artifactId>mysql-connector-java</artifactId>            <scope>runtime</scope>        </dependency>        <dependency>            <groupId>org.projectlombok</groupId>            <artifactId>lombok</artifactId>            <optional>true</optional>        </dependency>        <dependency>            <groupId>org.springframework.boot</groupId>            <artifactId>spring-boot-starter-test</artifactId>            <scope>test</scope>            <exclusions>                <exclusion>                    <groupId>org.junit.vintage</groupId>                    <artifactId>junit-vintage-engine</artifactId>                </exclusion>            </exclusions>        </dependency>        <dependency>            <groupId>org.springframework.boot</groupId>            <artifactId>spring-boot-starter-thymeleaf</artifactId>        </dependency>    </dependencies>

2.切面类和注解

package com.py.pj.common.annotation;import java.lang.annotation.ElementType;import java.lang.annotation.Retention;import java.lang.annotation.RetentionPolicy;import java.lang.annotation.Target;/** * @author WL * @version 创立工夫:2020-9-17 19:10:00 * @Description 保留日志自定义注解 */@Retention(RetentionPolicy.RUNTIME)@Target(ElementType.METHOD)public @interface SysLogRequired {    String value();}
package com.py.pj.common.aspect;import java.lang.reflect.Method;import java.util.Date;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.slf4j.Logger;import org.slf4j.LoggerFactory;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.stereotype.Component;import com.fasterxml.jackson.core.JsonProcessingException;import com.fasterxml.jackson.databind.ObjectMapper;import com.py.pj.common.annotation.SysLogRequired;import com.py.pj.sys.entity.SysLog;import com.py.pj.sys.service.SysLogService;/*** @author WL* @version 创立工夫:2020-9-17 19:11:17* @Description 切面类;实现日志的主动保留*/@Aspect@Componentpublic class SysLogAspect {            private static final Logger log = LoggerFactory.getLogger(SysLogAspect.class);        @Autowired    private SysLogService sysLogService;    //  切入点;应用@annotation的形式,细粒度    @Pointcut("@annotation(com.py.pj.common.annotation.SysLogRequired)")    public void doSaveLog() {}        // 盘绕告诉;    @Around("doSaveLog()")    public Object around(ProceedingJoinPoint jp) throws Throwable{        long t1 = System.currentTimeMillis();        Object result = jp.proceed();   //  要执行的办法        long t2 = System.currentTimeMillis();        long t = t2-t1;        log.info("执行工夫:{ }",t);        SaveLog(jp,t);                return result;            }    /**     * @param jp     * @param time     * getSignature(): 该办法次要获取被代理对象的属性名称汇合     * getTarget():此处是取得了被代理类的对象Impl     * @throws JsonProcessingException      * @throws SecurityException      * @throws NoSuchMethodException      */    private void SaveLog(ProceedingJoinPoint jp, long time) throws JsonProcessingException, NoSuchMethodException, SecurityException {                //List com.py.pj.sys.serviceImpl.SysDeptServiceImpl.findObjects()        MethodSignature ms = (MethodSignature) jp.getSignature();    //....办法全类名        System.out.println("ms="+ms);        Class<?> targetClass = jp.getTarget().getClass();            // 被代理的类的反射        String targetName = targetClass.getName();    //DaoImpl被代理的类对象的名字        System.out.println("targetName="+targetName);//com.py.pj.sys.serviceImpl.SysDeptServiceImpl        //    获取接口申明办法        String MethodName = ms.getMethod().getName();//findObjects                System.out.println("MethodName="+MethodName);                Class<?>[] parameterTypes = ms.getMethod().getParameterTypes();        //    暴力反射获取办法        Method targetMethod = targetClass.getDeclaredMethod(MethodName, parameterTypes);                //获取办法参数        Object[] paramObj = jp.getArgs();        System.out.println("paramObj="+paramObj);        String params = new ObjectMapper().writeValueAsString(paramObj);                String  username = "weilong";        SysLog slog = new SysLog();        SysLogRequired operation = targetMethod.getDeclaredAnnotation(SysLogRequired.class);        if (targetMethod!=null) {            slog.setOperation(operation.value());        }        slog.setCreatedTime(new Date());        slog.setIp("1.1.1.1");        slog.setMethod(targetName+"."+MethodName);        slog.setParams(params);        slog.setUsername(username);        slog.setTime(time);                sysLogService.insertObjects(slog);    }}

3.在须要增加日志的业务办法上增加正文

。。。。