SpringBoot之WEB(四)
1. 添加AOP依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
2. 编写切面类
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import javax.servlet.http.HttpServletRequest;
import java.util.Arrays;
/**
* Created by HuangJun
* 11:24 2018/11/9
*/
@Aspect
@Component
public class MyAspect {
@Pointcut("execution(public * com.springboot.web.controller..*.*(..))")
public void myAspect() {
}
/***
* 前置通知
* @param joinPoint
* @throws Throwable
*/
@Before("myAspect()")
public void doBefore(JoinPoint joinPoint) throws Throwable {
System.out.println( "===============前置通知 Start===================");
// 接收到请求,记录请求内容
ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
HttpServletRequest request = attributes.getRequest();
// 记录下请求内容
System.out.println("URL : " + request.getRequestURL().toString());
System.out.println("HTTP_METHOD : " + request.getMethod());
System.out.println("IP : " + request.getRemoteAddr());
System.out.println("CLASS_METHOD : " + joinPoint.getSignature().getDeclaringTypeName() + "." + joinPoint.getSignature().getName());
System.out.println("ARGS : " + Arrays.toString(joinPoint.getArgs()));
System.out.println( "===============前置通知 End===================");
}
/***
* 后置通知
*/
@After("myAspect()")
public void doAfter(JoinPoint joinPoint){
System.out.println( "===============后置通知 Start===================");
System.out.println( "===============后置通知 End===================");
}
/***
* 环绕通知
*/
@Around("myAspect()")
public void doAround(ProceedingJoinPoint jointPoint){
try {
System.out.println( "===============环绕通知 Start===================");
String name = (String) jointPoint.proceed();
jointPoint.proceed();
System.out.println( "name=" + name);
System.out.println( "===============环绕通知 End===================");
} catch (Throwable e) {
e.printStackTrace();
}
}
/***
* 返回通知
*/
@AfterReturning("myAspect()")
public void doAfterReturning(JoinPoint joinPoint) {
System.out.println( "===============返回通知 Start===================");
System.out.println( "===============返回通知 End===================");
}
/***
* 异常通知
*/
@AfterThrowing("myAspect()")
public void doAfterThrowing(JoinPoint joinPoint){
System.out.println( "===============异常通知 Start===================");
System.out.println( "===============异常通知 End===================");
}
}
3. 运行结果
浏览器访问http://localhost:8080/test/freemarker,控制台打印输出结果
这是实际运行结果,但仔细观察这并不是我们期望的结果,这是因为环绕通知。环绕通知功能强大,但不好把握,我们先暂时把环绕通知注释掉,再运行查看结果:
这是我们期望的结果。
4. 源码下载
源码下载地址:https://download.csdn.net/download/huangjun0210/10774611