日志:
- 依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
<version>2.0.6.RELEASE</version>
</dependency>
- 建表
- 生成mapper,model,写service
- 日志注解
package com.test.util;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface LogRecord {
String msg() default "";
LogOptType optType();
}
- 日志切面类
package com.test.util;
import com.test.base.customer.model.Log;
import com.test.base.customer.service.LogService;
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.annotation.Pointcut;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
import java.lang.reflect.Method;
import java.util.Date;
@Component
@Aspect
public class LogAspect {
@Resource
private LogService logService;
@Pointcut("@annotation(com.test.util.LogRecord)")
public void pointCutLog() {
}
@Around("pointCutLog()")
public Object addLog(ProceedingJoinPoint pjp) throws Throwable {
//获取方法签名(方法签名=方法名+参数类型)
MethodSignature signature = (MethodSignature) pjp.getSignature();
//从方法签名里获取方法
Method method = signature.getMethod();
//判断该方法是否被LogRecord注解注解
if (!method.isAnnotationPresent(LogRecord.class))
return pjp.proceed();
//获取注解对象
LogRecord logRecord = method.getAnnotation(LogRecord.class);
//获取方法参数列表
Object[] args = pjp.getArgs();
if (args == null || args.length == 0) {
return pjp.proceed();
}
Log log = new Log();
log.setOptUser("皮卡丘");
log.setDetailMsg(args[0].toString());
log.setOptTime(new Date());
log.setOptType(logRecord.optType().getCode());
log.setSimpleMsg(logRecord.msg());
logService.addLog(log);
return pjp.proceed();
}
}
- 日志枚举类
package com.test.util;
public enum LogOptType {
ADD("1"),UPDATE("2"),DELETE("3");
String code;
public String getCode() {
return code;
}
LogOptType(String code) {
this.code = code;
}
}
- 切面层加注解
例:
@LogRecord(optType = LogOptType.UPDATE,msg = "更新客户信息")
@RequestMapping("updateCustomer")
public Result updateCustomer(Customer customer) {
customerService.updateByPrimaryKey(customer);
return Result.success();
}
@LogRecord(optType = LogOptType.ADD,msg = "新增客户信息")
@RequestMapping("addCustomer")
public Result addCustomer(Customer customer) {
customerService.addCutomer(customer);
return Result.success();
}
@LogRecord(optType = LogOptType.DELETE,msg = "删除客户信息")
@RequestMapping("deleteCustomer")
public Result deleteCustomer(Customer customer) {
customerService.deleteCutomer(customer.getId());
return Result.success();
}
- application.yml
#db
spring:
datasource:
url: jdbc:mysql://localhost/home
username: root
password: root
driver-class-name: com.mysql.jdbc.Driver
aop:
auto: true
#mybatis
mybatis:
mapper-locations: mapper/*.xml
type-aliases-package: com.test.base
config-location: classpath:mybatis-config.xml