举个栗子-SpringBoot-AOP的简单配置(复制可用)
- SpringBoot-AOP
- 1.在pom中添加maven依赖
- 2.Spring配置注意(防坑)
- 3.创建Controller(平时写代码的控制层 复制可用)
- 4.创建AOP切面类(工具类或者配置类 复制可用)
- 4.1.AOP切面注解说明
- 5.测试运行
SpringBoot-AOP
我们知道Spring最核心的两个功能就是AOP(面向切面)和IOC(控制反转),那么现在我们就来看看在SpringBoot中 AOP的一个简单配置。
1.在pom中添加maven依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
2.Spring配置注意(防坑)
如果要直接用@Aspect注解的话,要在spring的配置文件中加入spring.aop.auto=true.
但是实际上,只要引入SpringAOP相关的jar包依赖,程序的主类中其实已经默认增加了@EnableAspectJAutoProxy。所以我们可以直接开始相关的Aspet的编程。
3.创建Controller(平时写代码的控制层 复制可用)
package ***;
import ****;
@Controller
@RequestMapping("/test")
public class testController {
/**
* 测试接口
* @param
* @param map
* @return
*/
@RequestMapping("/test1")
@ResponseBody
public String test1(){
return "test1";
}
/**
* 测试异常接口
* @param
* @param map
* @return
*/
@RequestMapping("/test2")
@ResponseBody
public Object test2(){
return 1 / 0;
}
}
4.创建AOP切面类(工具类或者配置类 复制可用)
4.1.AOP切面注解说明
@Aspect 作用是把当前类标识为一个切面供容器读取
@Pointcut 定义切点,切点方法不用任何代码,返回值是void,重要的是条件表达式
@Before 标识一个前置增强方法,相当于BeforeAdvice的功能
@AfterReturning 后置增强,相当于AfterReturningAdvice,方法退出时执行
@AfterThrowing 异常抛出增强,相当于ThrowsAdvice
@After final 增强,不管是抛出异常或者正常退出都会执行
@Around 环绕增强,相当于MethodInterceptor
package ***;
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;
/**
* LogAspect class
* 切面
* @author Timber_Li
* @date 2020-7-14 15:10:12
*/
@Aspect
@Component
public class TestAspect {
//此处写具体切点. 具体写法可以百度 路径一定要正确
@Pointcut("execution(public * com.timber.controller.*.*(..))")
public void testLog(){}
@Before("testLog()")
public void deBefore(JoinPoint joinPoint) throws Throwable {
// 接收到请求,记录请求内容
ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
HttpServletRequest request = attributes.getRequest();
// 记录下请求内容 路径 ip 请求方法名 请求参数等等
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()));
}
@AfterReturning(returning = "ret", pointcut = "testLog()")
public void doAfterReturning(Object ret) throws Throwable {
// 处理完请求,返回内容
System.out.println("方法的返回值 : " + ret);
}
//后置异常通知
@AfterThrowing("testLog()")
public void throwss(JoinPoint jp){
System.out.println("方法异常时执行.....");
}
//后置最终通知,final增强,不管是抛出异常或者正常退出都会执行
@After("testLog()")
public void after(JoinPoint jp){
System.out.println("方法最后执行.....");
}
//环绕通知,环绕增强,相当于MethodInterceptor
@Around("testLog()")
public Object arround(ProceedingJoinPoint pjp) {
System.out.println("方法环绕start.....");
try {
Object o = pjp.proceed();
System.out.println("方法环绕proceed,结果是 :" + o);
return o;
} catch (Throwable e) {
e.printStackTrace();
return null;
}
}
}
5.测试运行
正确接口 请求地址:http://localhost:8080/test/test1
控制台输出结果
方法环绕start.....
URL : http://localhost:8080/test/test1
HTTP_METHOD : POST
IP : 127.0.0.1
CLASS_METHOD : com.timber.controller.testController.test1
ARGS : []
方法环绕proceed,结果是 :test1
方法最后执行.....
方法的返回值 : test1
异常接口 请求地址:http://localhost:8080/test/test2
控制台输出结果
方法环绕start.....
URL : http://localhost:8080/test/test2
HTTP_METHOD : POST
IP : 127.0.0.1
CLASS_METHOD : com.timber.controller.testController.test2
ARGS : []
java.lang.ArithmeticException: / by zero
...具体异常代码...
方法最后执行.....
方法的返回值 : null
好啦 以上就是一个简单的AOP的例子 我们知道了AOP的执行顺序 以及注解的具体意思,那么就可以根据自己的具体需求去做切面处理啦!