Spring AOP 是什么
AOP(Aspect Oriented Programming):面向切面编程,它和 OOP(面向对象编程)类似。它是一种思想,是对某一类事情的集中处理。
为什么要用 AOP
高频:对于这种功能统一,且使用地方较多的功能,可以考虑用 AOP 来处理(比如 用户登录验证)
使⽤ AOP 可以扩充多个对象的某个能⼒,AOP 可以说是 OOP 的补充和完善(比如 现在要实现的业务和这个通用的功能没什么关系,但处于安全考虑,又必须进行登录的验证)
AOP 组成
(1)切面(Aspect)
定义 AOP 是针对某个统一的功能的,这个功能就叫做一个切面,比如用户登录功能或方法的统计日志,他们就各是一个切面。切面是由切点和通知组成的
(2)连接点(Join Point)
所有可能触发 AOP(拦截方法的点)就称为连接点
(3)切点(Pointcut)
切点的作用就是提供一组规则来匹配连接点,给满足规则的连接点添加通知,总的来说就是,定义 AOP 拦截的规则的
切点相当于保存了众多连接点的一个集合(如果把切点看成一个表,而连接点就是表中一条一条的数据)
(4)通知(Advice)
切面的工作就是通知
通知:规定了 AOP 执行的时机和执行的方法
Spring 切面类中,可以在方法上使用以下注解,会设置方法为通知方法,在满足条件后悔通知本方法进行调用
前置通知 @Before:通知方法会在目标方法调用之前执行
后置通知 @After:通知方法会在目标方法返回或者抛出异常后调用
返回之后通知 @AfterReturning:通知方法会在目标方法返回后调用
抛异常后通知:@AfterThrowing:通知方法会在目标方法爬出异常之后调用
环绕通知:@Around:通知包裹了被通知的方法,在被通知的方法通知之前和调用之后执行自定义的行为
Spring AOP 实现
Spring AOP 实现步骤
添加 Spring AOP 框架支持
定义切面和切点
实现通知
- 在 pom.xml 中添加如下配置:
<!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-aop -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
- 定义切面和切点
@Aspect // 当前类是一个切面
@Component
public class UserAspect {
// 定义一个切点(设置拦截规则)
@Pointcut("execution(* com.example.springaop.controller.UserController.*(..))")
public void pointcut() {
}
// 定义 pointcut 切点的前置通知
@Before("pointcut()")
public void doBefore() {
System.out.println("执行前置通知");
}
// 后置通知
@After("pointcut()")
public void doAfter() {
System.out.println("执行后置通知");
}
// 返回之后通知
@AfterReturning("pointcut()")
public void doAfterReturning() {
System.out.println("执行返回之后通知");
}
// 抛出异常之后通知
@AfterThrowing("pointcut()")
public void doAfterThrowing() {
System.out.println("执行抛出异常之后通知");
}
}
UserConmtroller
@RestController
@RequestMapping("/user")
public class UserController {
@RequestMapping("/sayhi")
public String sayHi() {
System.out.println("sayhi 方法被执行");
int num = 10/0;
return "你好,java";
}
@RequestMapping("/sayhi2")
public String sayHi2() {
System.out.println("sayhi2 方法被执行");
return "你好,java2";
}
}