刚工作的时候,受到项目底层代码里有很多类似的代码,刚好学习到AOP这方面的知识,就做了一个自定义的日志注解包。
logger.info("ENTER METHOD:{}",methodName);
logger.info("LEAVE METHOD:{}, COST TIME:{} ms",methodName,time);
定义需要被扫描到的注解类:
@Target说明注解生效的是方法类型
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface KLoger {
}
定义切面:
@Pointcut 说明将切点设置为上面被注解类注解的方法
@Around("kLogerAspect()")通过切点获取AOP代理链获取被注解的方法名、类名,再使用类名构建日志的对象
最后再构建自己想要的日志内容
但是别忘记joinPoint.proceed()执行被注解的方法,不然方法时不会执行滴
@Configuration
@Aspect
@Slf4j
public class KLogerAspect {
/**
* @author Lingyu Kong
*/
@Pointcut("@annotation(KLoger)")
public void kLogerAspect(){}
/**
* @author Lingyu Kong
* @param joinPoint 被注解的方法
* @return java.lang.Object
*/
@Around("kLogerAspect()")
public Object aroundLogPointCut(ProceedingJoinPoint joinPoint) throws Throwable {
long startTime = System.currentTimeMillis();
Object result = recordLog(joinPoint,startTime);
return result;
}
/**
* @author Lingyu Kong
* @param joinPoint 被注解的方法
* @param startTime 被注解方法开始运行的时间
* @return java.lang.Object
*/
private Object recordLog(ProceedingJoinPoint joinPoint, Long startTime) throws Throwable {
String classname = joinPoint.getTarget().getClass().getSimpleName();
final Logger logger = LoggerFactory.getLogger(classname);
String methodName = joinPoint.getSignature().getName();
Object result =null;
logger.info("====================================================");
logger.info("ENTER METHOD:{}",methodName);
result = joinPoint.proceed();
long time = System.currentTimeMillis() - startTime;
logger.info("LEAVE METHOD:{}, COST TIME:{} ms",methodName,time);
logger.info("====================================================");
return result;
}
}
源码已经打包上传到maven仓库了,大家感兴趣可以下一个玩一玩
虽然东西很low,但是也记录了自己学习的进程,请大家多指教。
<dependency>
<groupId>io.github.TheRealjavisKong</groupId>
<artifactId>k-annotation</artifactId>
<version>1.0.4</version>
</dependency>
如果想直接使用:
在pom文件里引入依赖之后,需要在Springboot启动类里添加如下的代码,不然会扫描不到这个包
@SpringBootApplication(scanBasePackages = {"com.github.kly.annotation"})