概念
AOP:面向切面编程,应用场景:抽取公共代码,让辅助代码和业务代码分离。 Spring支持以下5种功能增强:
- @Before
- @AfterRurning
- @AfterThrowing
- @After
- @Around 一般情况下,@Around不和其他几个共同使用,它可以替代其他几个注解。
示例
第一步:添加依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
第二步:准备需要功能增强的业务代码
package com.tiku.controller;
@RestController
public class DispatcherController {
@GetMapping("/sth")
public String sth(){
fun();
System.out.println(3/0);
return "hello";
}
}
第三步:写AOP类
类的声明
@Aspect //声明该类是一个功能增强类
@Component
public class LogAop {
}
在LogAop中声明切入点:定义对哪些方法做功能增强
//拦截包com.tiku.controller及其子包下的 所有的类 的 所有的没有参数的方法
@Pointcut("execution(public * com.tiku.controller..*.*())")
public void fun() {
}
前置增强
//前置增强:在目标方法执行之前被调用
@Before("fun()")
public void before() {
System.out.println("aop 前置准备工作");
}
返回值增强
@AfterReturning(pointcut = "fun()", returning = "res")
public void afterRetuning(String res) {
System.out.println("aop 返回值通知 " + res);
}
异常增强
//异常增强
@AfterThrowing("fun()")
public void afterThrowing() {
System.out.println("aop 异常通知");
}
后置增强
//后置增强:在目标方法执行之后被调用
@After("fun()")
public void after() {
System.out.println("aop 后置收尾工作");
}
环绕增强
//环绕增强
@Around("fun()")
public void arount(ProceedingJoinPoint pjp) {
System.out.println("11111111");
Object res = null;
try {
res = pjp.proceed();
} catch (Throwable e) {
System.out.println("00000000");
e.printStackTrace();
}
System.out.println(res);
System.out.println("2222222222");
}