其实区别很简单,贴两端代码一目了然
service层的aop
package com.yy.aop;
//省略导入包
@Aspect
@Service("logAspect")
public class LogAspect {
@Pointcut("execution(* com.newer.service.*.*(..))")
public void anyMethod(){
}
@Before("anyMethod()")
public void before(JoinPoint joinPoint){
String name=joinPoint.getSignature().getName();
System.out.println(name+"方法的前置通知");
}
@AfterReturning("anyMethod()")
public void afterMethod(){
System.out.println("后置通知!");
}
@AfterThrowing("anyMethod()")
public void afterThrowing()throws Throwable{
System.out.println("异常通知");
}
@After("anyMethod()")
public void finalMethod(){
System.out.println("最终通知");
}
@Around("anyMethod()")
public Object aroundMethod(ProceedingJoinPoint pjp)throws Throwable{
System.out.println("环绕通知");
return pjp.proceed();
}
}
接下来看controller层的切面
package com.yy.springbootdemo.hospital.controller;
@Aspect
@Component //每个切面最终还是要扫面到斌容器里面去,成为bin容器的组件
@Order(4)
public class WebLogAspect {
//获取日志记录器
private Logger logger=Logger.getLogger(getClass());
//获取线程副本
ThreadLocal<Long> startTime=new ThreadLocal<>();
@Pointcut("execution(public * com.*.*.*.controller.*.*(..))")
public void weblog(){}
@Before("weblog()")
public void doBefore(JoinPoint joinPoint){
//获取请求报文头部元数据
ServletRequestAttributes requestAttributes=(ServletRequestAttributes)RequestContextHolder.getRequestAttributes();
//获取请求对象
HttpServletRequest request=requestAttributes.getRequest();
//记录控制器执行前的时间毫秒数
startTime.set(System.currentTimeMillis());
logger.info("前置通知执行:");
logger.info("url:"+request.getRequestURL());
logger.info("method:"+request.getMethod());
logger.info("ip:"+request.getRemoteAddr());
logger.info("class_method:"+joinPoint.getSignature().getDeclaringTypeName()+
"."+joinPoint.getSignature().getName());
logger.info("args:"+ Arrays.toString(joinPoint.getArgs()));
}
@AfterReturning(returning = "ret",pointcut = "weblog()")
public void doAfter(Object ret){
logger.info("后置通知执行:");
logger.info("RESPONSE:"+ret);
logger.info("spend:"+(System.currentTimeMillis()-startTime.get()));
}
}