异常和切面(AOP)的开发方式和注释没有任何区别。
异常,是写了异常处理的类,上面也标注好是处理哪个异常类
AOP的话,也是给标注上了对哪些包生效。
这里把这几个部分点一下
AOP
package com.ssm_login.aspect;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.*;
import org.slf4j.Logger;//spring自带的日志框架
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import javax.servlet.http.HttpServletRequest;
@Aspect
@Component//将这个类引入spring容器中去
public class LoginAspect {
private final static Logger logger = LoggerFactory.getLogger(LoginAspect.class);//参数为当前使用的类名
@Pointcut("execution(public * *..LoginController.login(..))")//要处理的方法,包名+类名+方法名
public void cut(){
}
@Before("cut()")//在调用上面 @Pointcut标注的方法前执行以下方法
public void doBefore(JoinPoint joinPoint){//用于获取类方法
System.out.println("进入before");
ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
HttpServletRequest request = attributes.getRequest();
//url
logger.info("url ={}",request.getRequestURI());
//method
logger.info("method={}",request.getMethod());
//ip
logger.info("ip={}",request.getRemoteAddr());
//类方法
logger.info("class_method={}",joinPoint.getSignature().getDeclaringTypeName()+'.'+ joinPoint.getSignature().getName());//获取类名及类方法
//参数
logger.info("args={}",joinPoint.getArgs());
}
@After("cut()")//无论Controller中调用方法以何种方式结束,都会执行
public void doAfter(){
logger.info("----完成这次登录日志记录-------");
}
@AfterReturning(returning = "obj",pointcut = "cut()")//在调用上面 @Pointcut标注的方法后执行。用于获取返回值
public void doAfterReturning(Object obj){
logger.info("response={}",obj.toString());
}
}
这个部分实现了日志的打印,在console中,需要把级别调到debug就能看到了。
异常类
package com.ssm_login.exception;
import org.springframework.web.servlet.HandlerInterceptor;
public class NoLoggingException extends Exception{
public NoLoggingException() {
super();
// TODO 自动生成的构造函数存根
}
public NoLoggingException(String message) {
super(message);
// TODO 自动生成的构造函数存根
}
}

这里的话其实没什么难点。