1.建立日志切面
import org.aspectj.lang.ProceedingJoinPoint; import org.aspectj.lang.annotation.Around; import org.aspectj.lang.annotation.Aspect; import org.springframework.context.annotation.EnableAspectJAutoProxy; import org.springframework.core.annotation.Order; import org.springframework.stereotype.Component; import java.lang.reflect.Method; //开启AspectJ 自动代理模式,如果不填proxyTargetClass=true,默认为false, @EnableAspectJAutoProxy(proxyTargetClass = true) @Component @Aspect @Order(1) public class ControllerLogAspectConfig { @Around("execution(* com.g2.order.server.controller.*.*(..))") public Object handleControllerMethod(ProceedingJoinPoint proceedingJoinPoint) throws Throwable { System.out.println("进入日志切面"); //获取controller对应的方法. org.aspectj.lang.reflect.MethodSignature methodSignature = (org.aspectj.lang.reflect.MethodSignature) proceedingJoinPoint.getSignature(); //获取方法所在的类(controller) Class beanType = methodSignature.getDeclaringType(); //获取方法 Method method = methodSignature.getMethod(); //获取方法参数列表(无需处理讨厌的流了) Object[] args = proceedingJoinPoint.getArgs(); for (Object arg : args) { //获取参数的类型与值 System.out.println(arg.getClass().getName()); System.out.println("arg is " + arg); } System.out.println("进入其他切面.."); Object obj = proceedingJoinPoint.proceed(); //获取返回值的类型,与 Method.getReturnType()一致 Class responseClass=obj.getClass(); //方法的返回值是: System.out.println("response is " + obj); System.out.println("业务完成,日志已记录"); return obj; } }
2.建立执行时间切面
import org.aspectj.lang.ProceedingJoinPoint; import org.aspectj.lang.Signature; import org.aspectj.lang.annotation.After; import org.aspectj.lang.annotation.Around; import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.Before; import org.aspectj.lang.annotation.Pointcut; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.web.servlet.ServletComponentScan; import org.springframework.context.annotation.AnnotationConfigApplicationContext; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.EnableAspectJAutoProxy; import org.springframework.core.Ordered; import org.springframework.core.annotation.Order; import org.springframework.stereotype.Component; import java.lang.reflect.Method; import javax.annotation.Resource; //开启AspectJ 自动代理模式,如果不填proxyTargetClass=true,默认为false, @Component @Aspect @Order(Ordered.LOWEST_PRECEDENCE) public class ControllerTimeAspectConfig { @Around("execution(* com.g2.order.server.controller.*.*(..))") public Object handleControllerMethod(ProceedingJoinPoint proceedingJoinPoint) throws Throwable { System.out.println("进入时间切面,执行before.."); System.out.println("进入业务执行.."); long startTime = System.currentTimeMillis(); Object obj = proceedingJoinPoint.proceed(); System.out.println("time aspect 耗时" + (System.currentTimeMillis() - startTime)); System.out.println("业务完成,执行时间已记录"); return obj; } }
3.执行结果
2018-09-20 15:19:18.908 INFO 14688 --- [p-nio-88-exec-1] c.g.o.s.i.AccessLogInterceptor : 请求方法:login,请求参数类型:com.g2.order.server.vo.user.UserLoginReq,请求值:{ "userId":"123","password":"123444"} 进入日志切面 com.g2.order.server.vo.user.UserLoginReq arg is UserLoginReq{userId='123', password='123444'} 进入其他切面.. 进入时间切面,执行before.. 进入业务执行.. 2018-09-20 15:19:22.120 INFO 14688 --- [p-nio-88-exec-1] c.g.o.server.controller.HomeController : 进入登陆业务 2018-09-20 15:19:22.176 INFO 14688 --- [p-nio-88-exec-1] com.alibaba.druid.pool.DruidDataSource : {dataSource-1} inited time aspect 耗时841 业务完成,执行时间已记录 response is Response{success=true, errorMessage='', payload=UserModel{userId='1', roleName='null', roleId=null}} 业务完成,日志已记录