1.添加切面依赖
<dependency><groupId>org.aspectj</groupId><artifactId>aspectjweaver</artifactId><version>1.8.9</version> </dependency>
2.自定义注解
@Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) public @interface Log {String value() default ""; }
3.添加切面
添加component注解自动装配bean到ioc容器中 添加切面注解 @Component @Aspect @Slf4j public class LogAspect { private final LogService logService; ThreadLocal<Long> currentTime = new ThreadLocal<>(); public LogAspect(LogService logService) {this.logService = logService;} /*** 配置切入点,路径为添加自定义注解所在的位置*/@Pointcut("@annotation(cn.edu.tsu.torox.sysLog.annotation.Log)")public void logPointcut() {// 该方法无方法体,主要为了让同类中其他方法使用此切入点} /*** 配置环绕通知,使用在方法logPointcut()上注册的切入点** @param joinPoint join point for advice*/@Around("logPointcut()")public Object logAround(ProceedingJoinPoint joinPoint) throws Throwable {Object result;currentTime.set(System.currentTimeMillis());result = joinPoint.proceed();cn.edu.tsu.torox.sysLog.model.Log log = new cn.edu.tsu.torox.sysLog.model.Log("INFO",System.currentTimeMillis() - currentTime.get());currentTime.remove(); // String request = RequestHolder.getHttpServletRequest();//业务类,根据需求定义,这里为日志,提前建表,进行crudlogService.save("1", "google", "192.168.231.20",joinPoint, log);return result;} /*** 配置异常通知** @param joinPoint join point for advice* @param e exception*/@AfterThrowing(pointcut = "logPointcut()", throwing = "e")public void logAfterThrowing(JoinPoint joinPoint, Throwable e) {cn.edu.tsu.torox.sysLog.model.Log log = new cn.edu.tsu.torox.sysLog.model.Log("ERROR",System.currentTimeMillis() - currentTime.get());currentTime.remove();; // HttpServletRequest request = RequestHolder.getHttpServletRequest();logService.save("1", "google", "192.168.231.20", (ProceedingJoinPoint)joinPoint, log);} }
4.具体详细参数在joinPoint对象中
5.将自定义注解添加到相应的控制层方法上
流程:
接口-->控制层--->找到带有自定义注解的方法---->跳入切面--->执行环绕通知中的方法(获取该类的方法)
依赖:若项目使用的数据层技术为Spring-data-jpa则无须单独引入aspectjweaver依赖。