AOP与SpringAOP
- 一、什么是AOP,什么是SpringAOP
- 二、AOP与拦截器的区别
- 三、实现SpringAOP
- 1.添加SpringBootAOP依赖
- 2.创建切面
- 3.创建切点
- 4.创建通知
- 5.创建连接点
- 效果
一、什么是AOP,什么是SpringAOP
AOP即Aspect-Oriented Programming面向切面编程。
它是一种思想,它是对某类事情的集中处理。
SpringAOP是一个框架,是AOP思想的一种具体实现产物。
二、AOP与拦截器的区别
SpringAOP是AOP思想实现的一个框架,但我们在项目中经常会用到AOP思想,但是不一定用SpringAOP实现。
有些项目中可能会用到SpringAOP,有的则是用到拦截器。
拦截器是基于AOP思想实现的,不依赖于SpringAOP。
简而言之,拦截器和SpringAOP都是AOP思想的具体实现,属于并列的关系。
三、实现SpringAOP
1.添加SpringBootAOP依赖
注意:因为我们是spring-boot项目,所以需要不能选择spring对应的aop,而应该是下边的springbootaop依赖。
又我们使用的spring-boot是2.x版本的,所以我们引入aop依赖就需要是2.x版本
<!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-aop -->
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-aop</artifactId><version>2.7.5</version>
</dependency>
2.创建切面
创建切面,就是创建一个关于什么的类
在此基础上需要加两个注解@Aspect和@Component注解,交给spring管理
package com.example.demo.common;import org.aspectj.lang.annotation.Aspect;
import org.springframework.stereotype.Component;@Aspect
@Component
public class UserAOP {}
3.创建切点
定义拦截规则,其实是一个空方法
//定义切点(配置拦截规则)//拦截全部返回值 UserController里的全部方法 参数第一个为int,第二个为String(int,String),这里以全部拦截为例@Pointcut("excution(* com.example.demo.controller.UserController.*(..)")public void pointcut(){}
4.创建通知
前置通知…
@Aspect
@Component
public class UserAOP {//定义切点(配置拦截规则)//拦截全部返回值 UserController里的全部方法 参数第一个为int,第二个为String(int,String),这里以全部拦截为例@Pointcut("excution(*com.example.demo.controller.UserController.*(..))")public void pointcut(){}@Before("pointcut()")//针对哪个切点public void doBefore(){System.out.println("执行了前置通知"+ LocalDateTime.now());}
}
环绕通知做次数统计非常方便。
5.创建连接点
UserController里创建
ArticleController
@Aspect
@RestController
@RequestMapping("/article")
public class ArticleController {@RequestMapping("/sayhi")public String sayHi(){System.out.println("hi article springaop");return "hi article springaop";}
}
@RestController
@RequestMapping("/user")
public class UserController {@RequestMapping("/sayhi")public String sayHi(){System.out.println("hi user springaop");return "hi user springaop";}@RequestMapping("/sayhi2")public String sayHi2(){System.out.println("hi user springaop2");return "hi user springaop2";}
}
效果
拦截了但是没有制止
只做了打印没做其他处理,所以只能看到打印结果: